Docker容器技术实践
- 课程任务
- 实验内容
- 1、安装Docker容器
- 1.1 设置存储库
- 1.2 安装Docker
- 2、运行容器
- 2.1 运行镜像
- 2.2 Docker基本操作
- (1)显示本地镜像库内容
- (2)获得帮助
- (3)显示运行中容器
- (4)显示所有容器
- (5)继续运行原容器并进入
- (6)删除容器
- ...
- 2.3 MySQL与容器化
- (1)拉取MySQL镜像
- (2)构建docker镜像
- docker commit
- Dockerfile
- (3)使用MySQL容器
- 启动服务器
- 启动MySQL客户端
- MySQL客户端基本操作
- 查看数据库文件
- 挂载卷保存db
- Docker compose与多容器应用自动化部署
- 2.4 Docker 网络
- (1)查看容器网络
- (2)创建自定义网络
- (3)接入网络和断开网络
- (4)查看网络详细信息
- (5)删除所有无用网络
- (6)删除网络
- 2.5 Docker 仓库
- (1)登录
- (2)标签
- (3)上传
- (4)下载
- (5)标签
- (6)删除
- (7)运行
- (8)退出
- 2.6 容器监控与日志
- (1)检查docker的状态
- (2)查看容器内进程
- top
- stats
- (3)容器详细信息
- (4)容器日志查看
- 2.7 Golang应用容器化
- (1)编译go文件
- (2)创建Dockerfile镜像文件
- (3)生成镜像
- (4)验证镜像
- (5)观察镜像文件层
- (6)运行镜像实例
- (7)检查端口开放情况
- (8)停止容器
- 2.8 Docker卷与持久化数据
- (1) 创建容器卷
- (2)查看容器卷
- (3)查看容器卷的详细信息
- (4)删除容器卷
- (5)将卷挂载到容器上
- 实验总结
课程任务
- 按课件内容实践,了解什么是容器化技术和容器服务
- 会安装Docker容器并配置基本环境
- 能够熟练掌握Docker容器的基本命令与操作
- 了解并初步掌握Docker容器的进阶操作,能够将go语言应用容器化。
实验内容
本次实验内容包括安装DOcker和配置相应信息,熟悉Docker基本操作,了解掌握Docker网络、Docker仓库、Docker监控与日志、Dockerjuan,以及掌握MySOL的容器化和Golang应用容器化。
(注:如果图片无法查看,可以到我的gitee仓库中查看【传送门】)
1、安装Docker容器
课件给出的是CentOS的安装指南,但是我的虚拟机操作系统是Ubuntu的,所以自己找了个安装教程安装Docker容器。
1.1 设置存储库
- 安装包,允许 apt 命令 HTTPS 访问 Docker 源。
- 添加Docker的官方GPG密钥
sudo apt-key fingerprint 0EBFCD88 3. 将 Docker 的源添加到 /etc/apt/sources.list
1.2 安装Docker
sudo docker version2、运行容器
2.1 运行镜像
sudo docker run hello-world$ docker run -it ubuntu bashsudosudo sudocker pull daocloud.io/library/ubuntu:latest2.2 Docker基本操作
(1)显示本地镜像库内容
sudo docker images 结果:
(2)获得帮助
sudo docker --help 结果:
(3)显示运行中容器
sudo docker pssudo docker container ls 结果:如果有容器运行,会将容器基本信息列出来,否则只有表格头。
(4)显示所有容器
sudo docker ps -a 结果:会将所有容器陈列出来,包括已经中止运行的。
(5)继续运行原容器并进入
命令:
sudo docker restart [NAMES]sudo docker pssudo docker attach [NAMES] 结果:以sad_nightingale为例,可以看到容器重新开启并可以进入。
(6)删除容器
sudo docker rm [NAMES] 结果:会将已中止的容器删除,但是无法删除运行中的容器。
…
--help2.3 MySQL与容器化
(1)拉取MySQL镜像
sudo docker pull daocloud.io/library/mysql:5.7 (注意:这里可以加上使用daocloud.io,也可以配置加速器来下载)
(2)构建docker镜像
Docker提供了两种构建镜像的方法:
- docker commit命令
- Dockerfile 构建文件
docker commit
docker commit就是用命令行命令来创建镜像,其过程包含运行容器、修改容器和将容器保存为新的镜像三个步骤。
由于docker commit创建新镜像的步骤比较繁琐,就不在报告中一步步演示;而且一般情况下我们也不建议使用这个方法构建镜像,主要原因是:
- docker commit是一种手工创建镜像的方式,容易出错,效率低且可重复性弱;
- 使用者并不知道镜像是如何创建出来的,里面是否有恶意程序,无法对镜像进行审计,存在安全隐患。
Dockerfile
Dockerfile是一个文本文件,其记录了镜像构建的所有步骤,具体方法如下:
sudo mkdir mydock && cd mydocksudo vim dockerfile 3. 构建镜像
sudo docker build . -t hello 4. 运行镜像
sudo docker run -it --rm hello -H(3)使用MySQL容器
启动服务器
命令:
sudo docker run -p 3306:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -d daocloud.io/library/mysql:5.7 结果:
启动MySQL客户端
命令:
sudo docker run -it --net host daocloud.io/library/mysql:5.7 "sh"mysql -h127.0.0.1 -P3306 -uroot -proot 结果:
MySQL客户端基本操作
create datebase test;show databases;use test;drop database test;show tables;describe userinfo;sql statement;然后对该数据库进行测试:
查看数据库文件
命令:
sudo docker exec -it mysql2 bashls /var/lib/mysql 结果:可以看到,在/var/lib/mysql目录下,保存着数据库的基本信息,这些就是数据库文件,是数据库运行的关键。
挂载卷保存db
首先,创建卷并挂载,将自己定义的数据卷挂载在/var/lib/mysql上。
然后,启动客户端容器,使用–link将它与服务器连接起来,使客户端容器内可以使用mysql这个别名访问服务器。
Docker compose与多容器应用自动化部署
Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/docker-compose.pkg最后运行启动服务:
就可以同时部署多个容器了。
上述是课件中给出的内容,但是因为我的虚拟机下载adminer下载不动,所以我将daminer修改为ubuntu的相关信息,然后可以查看运行结果。
2.4 Docker 网络
(1)查看容器网络
sudo docker network ls 结果:
(2)创建自定义网络
sudo docker network create mynet 结果:
(3)接入网络和断开网络
命令:
sudo docker network connect [NAME] [DOCKER_NAME]sudo docker network disconnect [NAME] [DOCKER_NAME] 结果:
创建一个连接了mynet网络的容器u1:
sudo docker run --name u1 -it -p 8080:80 --net mynet --rm ubuntu bashsudo docker inspect u1 然后再运行命令:
sudo docker network connect bridge u1sudo docker network disconnect mynet u1 再次查看u1的网络信息,这次变为了:
(4)查看网络详细信息
sudo docker network inspect [NAME] 结果:以bridge网络为例,可以看到bridge的详细信息。
(5)删除所有无用网络
sudo docker network prune 结果:事先创建两个网络n1、n2,然后再进行操作,得到结果如下。
可以看到,使用中的mynet网络没有被删除,而未使用的网络n1和n2都被删除了。
(6)删除网络
sudo docker network rm [NAME] 结果:
注意,这里在删除网络前,得把该网络与所有容器断开连接,才能进行删除。
2.5 Docker 仓库
以用Docker访问阿里云容器镜像服务仓库为例,一共有7个常用操作,其中标签有多种用处。
(1)登录
sudo docker login --username=lihw56 registry.cn-shenzhen.aliyuncs.com 结果:
(2)标签
sudo docker tag hello-world registry.cn-shenzhen.aliyuncs.com/lihw56/report:hello-world 结果:
(3)上传
sudo docker push registry.cn-shenzhen.aliyuncs.com/lihw56/report:hello-world 结果:这里如果没有report仓库会在相应的命名空间下创建一个report仓库来存储镜像hello-world。
(4)下载
sudo docker pull registry.cn-shenzhen.aliyuncs.com/lihw56/report:hello-world 结果:
(5)标签
sudo docker tag registry.cn-shenzhen.aliyuncs.com/lihw56/report:hello-world hello-world 结果:
(6)删除
sudo docker rmi registry.cn-shenzhen.aliyuncs.com/lihw56/report:hello-world 结果:
(7)运行
sudo docker run --rm hello-world 结果:
(8)退出
sudo docker logout registry.cn-shenzhen.aliyunsc.com 结果:
2.6 容器监控与日志
(1)检查docker的状态
sudo docker infosudo docker info --format [string] 结果:
sudo docker info --format {{.serverVersion}}(2)查看容器内进程
sudo docker run -it --name test ubuntu /bin/bashtop
sudo docker top test 结果:
stats
sudo docker stats test 结果:
(3)容器详细信息
仍然以test为例,用docker命令来查看容器详细信息。
sudo docker inspect test 结果:
-f [string]sudo docker inspect -f '{{.NetworkSettings.IPAddress}}' test(4)容器日志查看
仍以test容器为例,用docker命令来查看容器应用的stdout与stderr输出。同时,事先在test容器内进行一些操作。
sudo docker logs test 结果:
2.7 Golang应用容器化
这里以第九次作业中的main.go为例,具体内容:
(1)编译go文件
--tags netgo(2)创建Dockerfile镜像文件
在与main.go函数同一根目录下创建dockerfile文件,文件内容为:
(3)生成镜像
sudo docker build . -t test(4)验证镜像
sudo docker images(5)观察镜像文件层
sudo docker history test(6)运行镜像实例
sudo docker run -d --name gotest -p 8080:8088 test 这里设置主机端口与容器端口不一致,以便于对比查看端口开放情况。
sudo docker ps(7)检查端口开放情况
容器正常运行后,我们可以通过curl来检查验证端口的开放情况,这里分别验证了8080和8088端口的开放情况,结果如下:
说明主机的8080端口是开放的,且能够访问到gotest容器的8088端口,而主机的8088端口并没有开放(证明主机没有运行main.go文件)
(8)停止容器
sudo docker stop gotestsudo docker start gotest2.8 Docker卷与持久化数据
Docker卷,即Docker volume,可以绕过默认的联合文件系统,以正常的文件或目录形式将容器的数据存储在宿主机上,这些卷的数据内容可以长期保存,不随容器的删除而被删除。
接下来先简单的只对卷进行操作,不涉及容器,后面再与容器结合。
(1) 创建容器卷
sudo docker volume create myvol 结果:会创建一个采用local驱动的新卷myvol。
(2)查看容器卷
sudo docker volume ls 结果:会列出所有容器卷,以及他们所采用的驱动。
(3)查看容器卷的详细信息
sudo docker volume inspect [NAME] 结果:会将[NAME]对应的卷的详细信息列出,包括创建时间、驱动、位置、名字以及操作等。
(4)删除容器卷
sudo docker volume prunesudo docker volume rm [NAME] 结果:其中prune是删除所有未使用的卷,而rm是删除指定的单个未使用中的卷。
(5)将卷挂载到容器上
-v /datasudo docker run -it --name test -v /data ubuntu /bin/bash/datasudo docker volume lssudo docker volume inspect [NAME]/datatest_file/datatest_fileVOLUME /data实验总结本次实验从零开始,逐步熟悉掌握Docker容器的各项操作,从安装和配置Docker开始,到后面熟悉DOcker基本操作在Docker中创建并使用MySQL镜像、Docker网络、Docker仓库、Docker监控与容器、Docker卷,再到Golang应用容器化,一步步加深对Docker的应用,收获良多。