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)将卷挂载到容器上
  • 实验总结


课程任务

  1. 按课件内容实践,了解什么是容器化技术和容器服务
  2. 会安装Docker容器并配置基本环境
  3. 能够熟练掌握Docker容器的基本命令与操作
  4. 了解并初步掌握Docker容器的进阶操作,能够将go语言应用容器化。

实验内容

本次实验内容包括安装DOcker和配置相应信息,熟悉Docker基本操作,了解掌握Docker网络、Docker仓库、Docker监控与日志、Dockerjuan,以及掌握MySOL的容器化和Golang应用容器化。
(注:如果图片无法查看,可以到我的gitee仓库中查看【传送门】)

1、安装Docker容器

课件给出的是CentOS的安装指南,但是我的虚拟机操作系统是Ubuntu的,所以自己找了个安装教程安装Docker容器。

1.1 设置存储库

  1. 安装包,允许 apt 命令 HTTPS 访问 Docker 源。
  1. 添加Docker的官方GPG密钥
sudo apt-key fingerprint 0EBFCD88


3. 将 Docker 的源添加到 /etc/apt/sources.list

1.2 安装Docker

sudo docker version

2、运行容器

2.1 运行镜像

sudo docker run hello-world$ docker run -it ubuntu bashsudosudo sudocker pull daocloud.io/library/ubuntu:latest

2.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 ps
sudo docker attach [NAMES]

结果:以sad_nightingale为例,可以看到容器重新开启并可以进入。

(6)删除容器

sudo docker rm [NAMES]

结果:会将已中止的容器删除,但是无法删除运行中的容器。

--help

2.3 MySQL与容器化

(1)拉取MySQL镜像

sudo docker pull daocloud.io/library/mysql:5.7

(注意:这里可以加上使用daocloud.io,也可以配置加速器来下载)


(2)构建docker镜像

Docker提供了两种构建镜像的方法:

  1. docker commit命令
  2. Dockerfile 构建文件
docker commit

docker commit就是用命令行命令来创建镜像,其过程包含运行容器、修改容器和将容器保存为新的镜像三个步骤。

由于docker commit创建新镜像的步骤比较繁琐,就不在报告中一步步演示;而且一般情况下我们也不建议使用这个方法构建镜像,主要原因是:

  1. docker commit是一种手工创建镜像的方式,容易出错,效率低且可重复性弱;
  2. 使用者并不知道镜像是如何创建出来的,里面是否有恶意程序,无法对镜像进行审计,存在安全隐患。
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 bash
ls /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 u1
sudo 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/bash
top
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 gotest

2.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 /data
sudo docker run -it --name test -v /data ubuntu /bin/bash
/data


sudo docker volume ls


sudo docker volume inspect [NAME]


/datatest_file


/datatest_file


VOLUME /data
实验总结

本次实验从零开始,逐步熟悉掌握Docker容器的各项操作,从安装和配置Docker开始,到后面熟悉DOcker基本操作在Docker中创建并使用MySQL镜像、Docker网络、Docker仓库、Docker监控与容器、Docker卷,再到Golang应用容器化,一步步加深对Docker的应用,收获良多。