7、图形化管理工具
本文内容承接Docker快速入门(一)的内容进行总结;
Portaniner是Docker的图形化管理工具,它提供一个后台面板供我们进行操作,类似于数据库可视化面板SQLyog之类的工具。
1. 下载与安装
# -p 8088:9000 # 内部9000端口映射外部端口为8088
# -v /var/run/docker.sock:/var/run/docker.sock (这是挂载技术,后面再学习)
# --privileged=true # 授权可以访问
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
94cfa856b2b1: Already exists
49d59ee0881a: Already exists
a2300fd28637: Already exists
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
3cad49e5d24c55ba9aebbcde2d593f948e7aba91751ae27148dac709314fab14
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3cad49e5d24c portainer/portainer "/portainer" 8 seconds ago Up 8 seconds 0.0.0.0:8088->9000/tcp jovial_perlman
3e7fc95c278a tomcat "catalina.sh run" 9 hours ago Up 9 hours 0.0.0.0:3355->8080/tcp tomcat01
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]#
2. 通过外网访问,http://服务器ip地址:8088
阿里云服务器设置安全组,第一次登录时,需设置admin用户的密码
设置完密码创建用户之后,进入下方页面,选择本地连接即可。
这便是可视化的整体界面预览:
8、docker 镜像详解
8.1、镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时依赖、库,环境变量和配置文件。
8.2、docker镜像的加载原理
8.2.1、联合文件系统(UnionFS)
联合文件系统(UnionFS):
-
2004年由纽约州立大学开发,它可以把多个目录内容联合挂载到同一个目录下,而目录的物理位置是分开的。UnionFS可以把只读和可读写文件系统合并在一起,具有写时复制功能,允许只读文件系统的修改可以保存到可写文件系统当中。
-
它是一种分层、轻量级、高性能的文件系统,它支持对文件系统的修改作为一次提交来进行一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
-
它是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性: 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
8.2.2、docker镜像加载
bootfs(boot file system)主要包含 bootloader 和 Kernel , bootloader 主要是引导加 kernel, Linux刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是 bootfs 。这一层与我们典型的 Linux/Unix系统是一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs 。
rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系统中 的 /dev,/proc,/bin,/etc 等标准目录和文件。 rootfs就是各种不同的操作系统发行版,比如 Ubuntu, Centos 等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才230M?
对于精简的 OS,rootfs 可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供 rootfs 就可以了。由此可见对于不同的Linux发行版, bootfs 基本是一致的,rootfs会有差別,因此不同的发行版可以公用 bootfs。
8.3、分层的理解
docker的镜像其实是有一层一层的文件系统组成的,前文中,在对镜像通过docker pull进行下载的时候,可以看到docker的镜像好像是在一层一层的在下载。当下载一个镜像的不同版本到本地时,不同版本的镜像之间有公共的文件部分,如果此部分已经存在于你的本地,则不会进行重复下载,直接进行共用。
分层的原因:
- 分层最大的优点就是==共享资源==
- 有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像;
- 同时内存中也只需加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。
去虚拟机中下载一个mysql 5.7版本的镜像,观察下载的日志输出,如下图所示,下载的过程是一层层进行下载,当前面的这些层已经存在于本地的情况是,就无需再次下载了。
查看镜像分层: docker image inspect 镜像名字
分层的理解:
所有的Docker镜像都起始于一个基础的镜像层,当对内容进行修改或增加新内容时,就会在当前镜像层之上,创建新的镜像层。譬如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层,之后再这个镜像中添加python的相关内容时,就会在第一层之上新建第二层镜像。继续添加安全补丁(Security Patch)时,就会创建第三层镜像。
又譬如,第一层镜像中包含文件1,2,3,后来创建了第二层镜像,里面包含文件4,5,6,再后来需要对镜像内容进行修改,将文件5升级更新成文件7,新的更新和修改需要创建第三层镜像。这种情况下,上层镜像中的文件覆盖了下层镜像中的文件。就使得文件的更新版本需要作为一个新的镜像层,添加到镜像当中。所以在外部看来,真个镜像分为三层,总共包含6个文件,其中文件7是文件5的更新版本。
Dokcer 镜像都是只读的,当容器启动时,一个新的可写层会被加载到镜像的顶部,这一个新的层就是通常说的容器层,容器之下的为镜像层。
8.4、Commit提交镜像
构建镜像有两种方式:
- 一种是通过commit提交创建镜像
- 另一种是通过dockerfile构建镜像 (dockerfile构建方法稍后学习)
容器通过commit提交之后,可将容器提交成为一个新的镜像版本
# docker commit -m=“提交的描述信息” -a=“作者信息” 容器id 目标镜像名:[TAG]
上面关于tomcat的部署方面提到,默认下载的tomcat镜像是最小的镜像,保证最小的运行环境。镜像中的webapps目录为空,需要进入容器内部,将webapps.dist目录中的内容先拷贝到webapps之后,才能从外网通过端口映射进行访问。为此,下面制作新的tomcat镜像:将能够完全运行的tomcat容器提交作为一个新的镜像。使得该镜像下载下来之后就可以直接使用,无需再去进行拷贝。
制作tomcat镜像步骤:
# 1. 下载默认的tomcat镜像
docker pull tomcat
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker pull tomcat # 下载tomcat镜像
Using default tag: latest
latest: Pulling from library/tomcat
0e29546d541c: Already exists
9b829c73b52b: Already exists
cb5b7ae36172: Already exists
6494e4811622: Already exists
668f6fcc5fa5: Already exists
dc120c3e0290: Already exists
8f7c0eebb7b1: Already exists
77b694f83996: Already exists
0f611256ec3a: Already exists
4f25def12f23: Already exists
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images #查看是否下载成功
REPOSITORY TAG IMAGE ID CREATED SIZE
elasticsearch 8.2.0 f75ee9faf718 3 weeks ago 1.21GB
nginx latest 605c77e624dd 4 months ago 141MB
tomcat latest fb5657adc892 4 months ago 680MB
redis latest 7614ae9453d1 4 months ago 113MB
mysql latest 3218b38490ce 4 months ago 516MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
centos latest 5d0da3dc9764 7 months ago 231MB
portainer/portainer latest 580c0e4e98b0 13 months ago 79.1MB
# 2. 启动这个tomcat镜像,
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it -p 8023:8080 tomcat
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/openjdk-11
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
# 3. 查看正在运行的容器
docker ps
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e315dfa9c866 tomcat "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:8023->8080/tcp strange_brown
3cad49e5d24c portainer/portainer "/portainer" 14 hours ago Up 14 hours 0.0.0.0:8088->9000/tcp jovial_perlman
# 4。 进入tomcat容器内部,查看webapps目录,没有内容,将webapps.dist目录中的内容拷贝到webapps目录中
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker exec -it e315dfa9c866 /bin/bash
root@e315dfa9c866:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@e315dfa9c866:/usr/local/tomcat# cd webapps
root@e315dfa9c866:/usr/local/tomcat/webapps# ls
root@e315dfa9c866:/usr/local/tomcat/webapps# cd ..
root@e315dfa9c866:/usr/local/tomcat# cd webapps.dist
root@e315dfa9c866:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
root@e315dfa9c866:/usr/local/tomcat/webapps.dist# cd ..
root@e315dfa9c866:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@e315dfa9c866:/usr/local/tomcat# cd webapps
root@e315dfa9c866:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
root@e315dfa9c866:/usr/local/tomcat/webapps#
# 4. 将操作之后的容器通过commit提交成一个新的tomcat镜像,以后便可以直接下载这个新的镜像使用。
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker commit -m="new tomcat that added app to webapps" -a="Kevin-Ding" e315dfa9c866 mytomcat:1.0
sha256:fae635bb688d1260244034fe2ed158f28de3bd0fa5cc7269cb77edcc0d5b6931
# 5. docker images 便可查看到自己提交的镜像 mytomcat
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 fae635bb688d 28 seconds ago 684MB
elasticsearch 8.2.0 f75ee9faf718 3 weeks ago 1.21GB
nginx latest 605c77e624dd 4 months ago 141MB
tomcat latest fb5657adc892 4 months ago 680MB
redis latest 7614ae9453d1 4 months ago 113MB
mysql latest 3218b38490ce 4 months ago 516MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
centos latest 5d0da3dc9764 7 months ago 231MB
portainer/portainer latest 580c0e4e98b0 13 months ago 79.1MB
# 6.运行自己制作的镜像
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it mytomcat:1.0 /bin/bash
root@bc1b6aac1bea:/usr/local/tomcat# cd webapps
root@bc1b6aac1bea:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
root@bc1b6aac1bea:/usr/local/tomcat/webapps# cd ..
root@bc1b6aac1bea:/usr/local/tomcat# exit
9、容器数据卷
9.1、数据卷介绍
Docker可以将应用和运行环境打包成一个镜像。
如果数据库MySQL部署在docker,docker不小心被误删,岂不是删库跑路。那么docker中的数据如何保存?
- 通过docker commit生成新的镜像,保存部分数据,数据每次变动都进行commit成新的镜像,有些太过繁杂;
- 容器中的数据是否可以存储在本地,持久化存储呢?
这就是数据卷的技术,通过挂载,将容器中的目录挂载到Linux上面,从而实现数据同步到本地,便于持久化保存,毕竟数据无价。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
数据卷:实现容器的持久化和同步操作,也可以实现容器之间的数据共享!
9.2、基本使用
方式一:使用命令的方式进行挂载 -v
# docker run -it -v 主机目录:容器内目录 # 路径映射
# docker run -it -p 主机端口:容器端口 # 端口映射
# 1.查看home目录下的目录结构
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# cd home
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# ls
kevin test.java
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# cd ..
# 2. 运行centos,并将centos的home目录挂载到虚拟机home目录的testcentos下
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it -v /home/testcentos:/home centos /bin/bash
[root@fc3e6a5f86ad /]#
# 3. 新开窗口连接,查看虚拟机的home目录,发现testcentos目录
[root@iZ2ze1dg1xkfc3i15ybixmZ /]# cd home
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# ls
redis test1.java testcentos test.java www
[root@iZ2ze1dg1xkfc3i15ybixmZ home]#
内部查看挂载信息
[root@iZ2ze1dg1xkfc3i15ybixmZ testcentos]# docker inspect fc3e6a5f86ad
挂载信息:显示已经将/home 目录挂载到 /home/testcentos
在容器的home目录中新建一个test.java文件,在虚拟机testcentos的目录下便可同步查看到该文件
随后,在虚拟机对应的这个文件中进行修改,查看在容器中是否能够正常显示这一修改后的文件
# 1. 先停止容器并退出,
[root@fc3e6a5f86ad /]# exit
exit
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# clear
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3cad49e5d24c portainer/portainer "/portainer" 25 hours ago Up 11 hours 0.0.0.0:8088->9000/tcp jovial_perlman
# 2.在主机中修改testcentos目录下的test.java
# vim操作,i进入插入模式; :wq保存并退出
[root@iZ2ze1dg1xkfc3i15ybixmZ testcentos]# vim test.java
# 3.重新启动刚才的centos,进入容器里面查看test.java发现内容已经被修改成功
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker start fc3e6a5f86ad
fc3e6a5f86ad
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker attach fc3e6a5f86ad
[root@fc3e6a5f86ad /]# cd home
[root@fc3e6a5f86ad home]# ls
test.java
[root@fc3e6a5f86ad home]# cat test.java
hello, Linux update #成功显示修改信息
数据卷的挂载绑定是一个双向的过程。以后对于挂载绑定部分的内容,只需要在虚拟机上就可以进行修改,无需再进入容器!
9.3、练习-安装部署MySQL
MySQL数据的持久化,可以通过挂载的方式将MySQL中的data目录挂载到虚拟机中
- 下载mysql镜像
# docker pull 命令下载 mysql 5.7版本
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
# 查看本地镜像中是否下载了mysql 5.7
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 fae635bb688d 2 days ago 684MB
elasticsearch 8.2.0 f75ee9faf718 3 weeks ago 1.21GB
nginx latest 605c77e624dd 4 months ago 141MB
tomcat latest fb5657adc892 4 months ago 680MB
redis latest 7614ae9453d1 4 months ago 113MB
mysql 5.7 c20987f18b13 4 months ago 448MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
centos latest 5d0da3dc9764 8 months ago 231MB
portainer/portainer latest 580c0e4e98b0 14 months ago 79.1MB
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]#
- 运行镜像,完成路径挂载
# 运行镜像
-d 后台运行
--name 指定名字
-v 主机目录:容器内目录 # 需要挂载多个路径时,每个挂载用一个-v即可
-p 主机端口:容器内端口
-e MYSQL_ROOT_PASSWORD=123454321 初始化mysql的登录密码
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d --name mysql_5_7 -v /home/mysql/config:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7
- 启动成功后 本地连接MySQL数据库 增加数据库表,便可在虚拟机的目录中查看到对应的挂载目录
温馨提示:命令行连接默认端口为3306,当端口映射修改之后,命令行中需要添加 -P 端口的命令
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# mysql -h 39.107.241.179 -P 3307 -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.36 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
# 成功通过命令行进入到数据库
当我们将虚拟机中的mysql容器删除之后,原先挂载在虚拟机中的目录,依旧保留,保证了数据没有丢失
9.4、匿名挂载和具名挂载
9.4.1、匿名挂载
匿名挂载,从字面意思看,就是在挂载数据卷的时候,没有指定挂载在宿主机上的路径,这样挂载就会在宿主机的默认路径:/var/lib/docker/volumes/中随机命名一个文件夹作为挂载路径。
测试:运行nginx容器,匿名挂载 容器内的路径为: /etc/nginx
# -P(大写P) 随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx
# docker run 后台运行nginx,随机映射端口,匿名挂在
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d -P -v /etc/nginx nginx
f7d28a8dc9ea221c0a8d192d8079b28166151d11890ac432b75b0389b4005f5f
# 运行成功之后,进入home目录
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# cd home
# 通过docker volume ls 查看所有的volumes
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume ls
DRIVER VOLUME NAME
local e0d7fd0fa4fea35d21a8ee229d058812ff1607e6e81c1bb7f390b2f05fa4f88e
local e46617b607b5c2cd660cbe1b222e7b7b083787af73e8bcac18a4115c9c698971
local f4b46eeb747bf12180df6eb2a523b0acdcb48725c9137aab594fd0d9719a40df
# 看到volums的名字为随机生成的,此为匿名挂载
9.4.2、具名挂载
具名挂载,顾名思义,就是在挂载的时候,指定卷名。与指定路径挂载不同,具名挂载中指定的卷名所在的路径默认为数据卷下的路径。
测试:重新启动一个nginx容器,具名挂载,重命名为nginx02
# 随机指定端口,重命名为nginx02, 具名挂载,卷名设置为juming-nginx
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx nginx
# 重新启动一个具名挂载的nginx
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
206217bd55b69753a7788d1a9872bab2500e146e2c962394da3ddd0b600d9fd3
# 查看卷列表,可以看到有名为 juming-nginx的卷信息
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume ls
DRIVER VOLUME NAME
local e0d7fd0fa4fea35d21a8ee229d058812ff1607e6e81c1bb7f390b2f05fa4f88e
local e46617b607b5c2cd660cbe1b222e7b7b083787af73e8bcac18a4115c9c698971
local f4b46eeb747bf12180df6eb2a523b0acdcb48725c9137aab594fd0d9719a40df
local juming-nginx
# 通过docker volume inspect 卷名 查看指定卷的相关信息
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-05-15T23:49:34+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
# 查询出来的信息为:MountPoint为卷的默认挂载路径
可以看到指定的juming-nginxde卷在主机数据卷中的挂载路径为:/var/lib/docker/volumes/卷名/_data中;
Docker所有的数据卷默认在/var/lib/docker/volumes/ 目录下
9.4.3、区别
如何对匿名挂载和具名挂载进行区分呢?
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
综上所述,通过具名挂载可以方便的找到我们所挂载的数据卷,建议使用具名挂载。
补充一点:关于在进行挂载时的ro和rw的说明
- ro readonly 只读,当设置成只读权限时,表示不能操作容器中对应的路径了,只能通过宿主机的路径进行操作。
- rw readwrite可读可写,卷挂载的默认权限。
表示方式:
# ro(只读)的表示
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx:ro nginx
#rw(可读可写)的表示
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx:rw nginx
9.5、DockerFile方式创建镜像
dockerfile就是用来构建docker镜像的构建文件,是一个脚本命令。
创建镜像的第二种方式:通过dockerfile来创建镜像
- 首先在home目录下新建一个docker-test-volume文件夹,里面新建一个dockerfile1文件,并编写如下脚本:
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "----end----"
CMD /bin/bash
-
创建完毕之后,docker build方法执行构建镜像
# docker build -f dockerfile的全路径 -t 镜像名:tag . [root@kevinDing docker_test_volume]# docker build -f /home/docker_test_volume/dockerfile1 -t kevin/mycentos:1.0 . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos ---> 5d0da3dc9764 Step 2/4 : VOLUME ["volume01", "volume02"] ---> Running in b860235245ea Removing intermediate container b860235245ea ---> 0bc3ac498d5f Step 3/4 : CMD echo "----end----" ---> Running in 324159180d29 Removing intermediate container 324159180d29 ---> 0a3ee43af21b Step 4/4 : CMD /bin/bash ---> Running in b3263513fb82 Removing intermediate container b3263513fb82 ---> f520432b291f Successfully built f520432b291f Successfully tagged kevin/mycentos:1.0 [root@kevinDing docker_test_volume]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE kevin/mycentos 1.0 f520432b291f 6 seconds ago 231MB hello-world latest feb5d9fea6a5 7 months ago 13.3kB centos latest 5d0da3dc9764 8 months ago 231MB [root@kevinDing docker_test_volume]#
-
运行自己构建的镜像,并查看镜像内的目录信息
[root@kevinDing docker_test_volume]# docker run -it f520432b291f /bin/bash # 查看列表信息,可以看到最后两个文件为挂载的目录volume01和volume02 [root@8ebf26cff30f /]# ls -l total 56 lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 360 May 20 15:17 dev drwxr-xr-x 1 root root 4096 May 20 15:17 etc drwxr-xr-x 2 root root 4096 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------ 2 root root 4096 Sep 15 2021 lost+found drwxr-xr-x 2 root root 4096 Nov 3 2020 media drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt drwxr-xr-x 2 root root 4096 Nov 3 2020 opt dr-xr-xr-x 94 root root 0 May 20 15:17 proc dr-xr-x--- 2 root root 4096 Sep 15 2021 root drwxr-xr-x 11 root root 4096 Sep 15 2021 run lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 2020 srv dr-xr-xr-x 13 root root 0 May 17 01:11 sys drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp drwxr-xr-x 12 root root 4096 Sep 15 2021 usr drwxr-xr-x 20 root root 4096 Sep 15 2021 var drwxr-xr-x 2 root root 4096 May 20 15:17 volume01 drwxr-xr-x 2 root root 4096 May 20 15:17 volume02 [root@8ebf26cff30f /]#
-
另开连接,通过docker inspect查看镜像内部信息
# 新开连接,查看运行的镜像 [root@kevinDing /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8ebf26cff30f f520432b291f "/bin/bash" 2 minutes ago Up 2 minutes suspicious_stonebraker # 进入到镜像内部查看 [root@kevinDing /]# docker inspect f520432b291f [ { "Id": "8ebf26cff30fd0eb9c75e144eb7c8b18bd07def9faa1d413fa12ad7f5c8efc90", "Created": "2022-05-20T15:17:29.740198902Z", "Path": "/bin/bash", "Args": [], ...... 中间内容省略 "Mounts": [ { "Type": "volume", "Name": "de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273", "Source": "/var/lib/docker/volumes/de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273/_data", "Destination": "volume01", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "7f18328f873a7760294840e4fef2e9688d2303c071a695736fc0b41a802abb73", "Source": "/var/lib/docker/volumes/7f18328f873a7760294840e4fef2e9688d2303c071a695736fc0b41a802abb73/_data", "Destination": "volume02", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ] } ]
-
验证挂载是否成功
在镜像内部进入挂载目录volume01目录,创建一个container_test.txt文件,在volume01的挂载路径中查看是否生成了该文件。
[root@8ebf26cff30f /]# cd volume01 [root@8ebf26cff30f volume01]# touch container_test.txt [root@8ebf26cff30f volume01]# ls container_test.txt [root@8ebf26cff30f volume01]# # 在新开的连接中,进入到volume01的挂载路径中,可以查看到创建的文件 [root@kevinDing volumes]# cd /var/lib/docker/volumes/de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273/_data [root@kevinDing _data]# ls container_test.txt [root@kevinDing _data]#
9.6、容器数据卷
容器数据卷是指建立数据卷,实现容器与容器之间的数据同步。
将上面制作的centos镜像启动,启动centos01centos02, centos01为父容器:
[root@kevinDing ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kevin/mycentos 1.0 f520432b291f 52 minutes ago 231MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
centos latest 5d0da3dc9764 8 months ago 231MB
# 启动一个centos01容器
[root@kevinDing ~]# docker run -it --name centos01 kevin/mycentos:1.0
# ctrl+P+Q退出当前容器
# 再启动一个centos02容器, --volumes-from centos01
[root@kevinDing ~]# docker run -it --name centos02 --volumes-from centos01 kevin/mycentos:1.0
在开启一个连接,分别进入两个容器查看内容:
[root@kevinDing ~]# docker ps
CONTAINER ID IMAGE COMMAND CS PORTS NAMES
5b0deb75f776 kevin/mycentos:1.0 "/bin/sh -c /bin/bash" 4minutes centos02
b8dcce0bcf25 kevin/mycentos:1.0 "/bin/sh -c /bin/bash" 5minutes centos01
[root@kevinDing ~]# docker attach b8dcce0bcf25
[root@b8dcce0bcf25 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 May 20 16:04 dev
drwxr-xr-x 1 root root 4096 May 20 16:04 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 97 root root 0 May 20 16:04 proc
dr-xr-x--- 2 root root 4096 Sep 15 2021 root
drwxr-xr-x 11 root root 4096 Sep 15 2021 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 May 17 01:11 sys
drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15 2021 usr
drwxr-xr-x 20 root root 4096 Sep 15 2021 var
drwxr-xr-x 2 root root 4096 May 20 16:04 volume01
drwxr-xr-x 2 root root 4096 May 20 16:04 volume02
[root@b8dcce0bcf25 /]# cd volume01
[root@b8dcce0bcf25 volume01]# ls
[root@b8dcce0bcf25 volume01]# touch test01.txt
[root@b8dcce0bcf25 volume01]# ls
test01.txt
[root@b8dcce0bcf25 volume01]#
如果将容器centos01停止并删除之后,容器centos02中的数据不受影响,相当于是在进行volumes-from时,对挂载的目录进行了双向拷贝,实现容器间的数据共享。
同样的,对于多个MySQL的数据库和配置文件实现数据共享时,与上面centos01和centos02的操作相类似,首先启动mySQL01,建立数据卷。然后通过–volumes-from给另一个MySQL容器建立容器数据卷的挂载 :
# 挂载第一个MySQL容器 匿名挂载
[root@KevinDing ~]# docker run -d --name mysql01 -p 3307:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7
# 挂载第二个MySQL,因为是挂载到mysql01,无需再进行-v的匿名挂载了
[root@KevinDing ~]# docker run -d --name mysql02 --volumes-from mysql01 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7
从而可以实现两个MySQL容器的数据同步。
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
一旦将父容器的内容持久化本地,本地数据不删除便不会丢失了。