Dockerfile 就是用来构建docker镜像的构建文件。命令脚本,先体验一下。
通过这个脚本可以生成镜像,这个镜像是一层一层的,脚本一个个的命令,每个命令是一层
# 创建一个dockerfile 文件 名字可以随意,建议dockerfile# 文件中的内容 指令(大写) 参数FROM centosVOLUME ["/volume01","/volume02"]CMD echo "--------end--------"CMD /bin/bash# 这里的每条命令就是镜像的一层# 注意这里的 VOLUME ["/volume01","/volume02"] 通过VOLUME指令指定了两个挂载点 /volume01 和 /volume02# 不能写成VOLUME ["volume01","volume02"] 要加 / 否则在启动时会报错[root@localhost docker-test-volume]# docker run -it 4a64df3f0173 /bin/bashdocker: Error response from daemon: OCI runtime create failed: invalid mount {Destination:volume01 Type:bind Source:/var/lib/docker/volumes/3918fef01cbe6da3036cdf9d2a3d461b3fe365de11d9b20858a5631aa7db9282/_data Options:[rbind]}: mount destination volume01 not absolute: unknown.# 生成镜像[root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t ceshi/centos:1.0 .

启动自己生成的镜像
我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息
由此推断出使用的是匿名挂载方式,既挂载在宿主机默认路径的随机目录下/var/lib/docker/volumes/xxx/_data
测试一下文件是否同步
# 容器内创建一个文件[root@localhost docker-test-volume]# docker run -it 2e245ff80b78 /bin/bash[root@c27e4c77cce9 /]# cd volume01[root@c27e4c77cce9 volume01]# touch container.txt[root@c27e4c77cce9 volume01]# lscontainer.txt# 容器外查看是否文件同步[root@localhost home]# cd /var/lib/docker/volumes/45d97f75807b1cf296163ee9a189a422b1e39188578b9f1e594a2cf2537327b1/_data[root@localhost _data]# lscontainer.txt# 文件同步成功
这种方式使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
最佳实践:数据卷容器
如果多个容器需要共享数据(如持久化数据库、配置文件或者数据文件等),可以考虑创建一个特定的数据卷容器,该容器有1个或多个卷。其它容器通过--volumes-from 来共享这个数据卷容器的卷。
启动第一个容器docker01
[root@localhost docker-test-volume]# docker run -it --name docker01 ceshi/centos:1.0[root@14d2256f90b7 /]# ls -ltotal 0lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bindrwxr-xr-x. 5 root root 360 Jun 9 04:00 devdrwxr-xr-x. 1 root root 66 Jun 9 04:00 etcdrwxr-xr-x. 2 root root 6 Nov 3 2020 homelrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/liblrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64drwx------. 2 root root 6 Dec 4 2020 lost+founddrwxr-xr-x. 2 root root 6 Nov 3 2020 mediadrwxr-xr-x. 2 root root 6 Nov 3 2020 mntdrwxr-xr-x. 2 root root 6 Nov 3 2020 optdr-xr-xr-x. 100 root root 0 Jun 9 04:00 procdr-xr-x---. 2 root root 162 Dec 4 2020 rootdrwxr-xr-x. 11 root root 163 Dec 4 2020 runlrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbindrwxr-xr-x. 2 root root 6 Nov 3 2020 srvdr-xr-xr-x. 13 root root 0 Jun 8 13:19 sysdrwxrwxrwt. 7 root root 145 Dec 4 2020 tmpdrwxr-xr-x. 12 root root 144 Dec 4 2020 usrdrwxr-xr-x. 20 root root 262 Dec 4 2020 vardrwxr-xr-x. 2 root root 6 Jun 9 04:00 volume01drwxr-xr-x. 2 root root 6 Jun 9 04:00 volume02[root@14d2256f90b7 /]#
启动第二个容器docker02,并通过—volumes-from 来共享数据
[root@localhost docker-test-volume]# docker run -it --name docker02 --volumes-from docker01 ceshi/centos:1.0[root@5cfb1e6eb1ff /]# ls -ltotal 0lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bindrwxr-xr-x. 5 root root 360 Jun 9 04:13 devdrwxr-xr-x. 1 root root 66 Jun 9 04:13 etcdrwxr-xr-x. 2 root root 6 Nov 3 2020 homelrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/liblrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64drwx------. 2 root root 6 Dec 4 2020 lost+founddrwxr-xr-x. 2 root root 6 Nov 3 2020 mediadrwxr-xr-x. 2 root root 6 Nov 3 2020 mntdrwxr-xr-x. 2 root root 6 Nov 3 2020 optdr-xr-xr-x. 103 root root 0 Jun 9 04:13 procdr-xr-x---. 2 root root 162 Dec 4 2020 rootdrwxr-xr-x. 11 root root 163 Dec 4 2020 runlrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbindrwxr-xr-x. 2 root root 6 Nov 3 2020 srvdr-xr-xr-x. 13 root root 0 Jun 8 13:19 sysdrwxrwxrwt. 7 root root 145 Dec 4 2020 tmpdrwxr-xr-x. 12 root root 144 Dec 4 2020 usrdrwxr-xr-x. 20 root root 262 Dec 4 2020 vardrwxr-xr-x. 2 root root 6 Jun 9 04:11 volume01drwxr-xr-x. 2 root root 6 Jun 9 04:11 volume02
在docker01中创建的数据同步到了docker02中
再创建一个docker03也共享数据到docker01
[root@localhost docker-test-volume]# docker run -it --name docker03 --volumes-from docker01 ceshi/centos:1.0[root@51d0c3deb4cd /]# ls -ltotal 0lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bindrwxr-xr-x. 5 root root 360 Jun 9 04:23 devdrwxr-xr-x. 1 root root 66 Jun 9 04:23 etcdrwxr-xr-x. 2 root root 6 Nov 3 2020 homelrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/liblrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64drwx------. 2 root root 6 Dec 4 2020 lost+founddrwxr-xr-x. 2 root root 6 Nov 3 2020 mediadrwxr-xr-x. 2 root root 6 Nov 3 2020 mntdrwxr-xr-x. 2 root root 6 Nov 3 2020 optdr-xr-xr-x. 106 root root 0 Jun 9 04:23 procdr-xr-x---. 2 root root 162 Dec 4 2020 rootdrwxr-xr-x. 11 root root 163 Dec 4 2020 runlrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbindrwxr-xr-x. 2 root root 6 Nov 3 2020 srvdr-xr-xr-x. 13 root root 0 Jun 8 13:19 sysdrwxrwxrwt. 7 root root 145 Dec 4 2020 tmpdrwxr-xr-x. 12 root root 144 Dec 4 2020 usrdrwxr-xr-x. 20 root root 262 Dec 4 2020 vardrwxr-xr-x. 2 root root 22 Jun 9 04:16 volume01drwxr-xr-x. 2 root root 6 Jun 9 04:11 volume02[root@51d0c3deb4cd /]# cd volume01[root@51d0c3deb4cd volume01]# lsdocker01[root@51d0c3deb4cd volume01]# touch docker03[root@51d0c3deb4cd volume01]# lsdocker01 docker03[root@51d0c3deb4cd volume01]## docker01中也可以看到docker03创建的文件[root@14d2256f90b7 volume01]# lsdocker01 docker03
测试将docker01彻底删除,查看docker02上的文件
# 删除docker01[root@localhost _data]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES51d0c3deb4cd ceshi/centos:1.0 "/bin/sh -c /bin/bash" 8 minutes ago Exited (127) About a minute ago docker035cfb1e6eb1ff ceshi/centos:1.0 "/bin/sh -c /bin/bash" 17 minutes ago Up 17 minutes docker0214d2256f90b7 ceshi/centos:1.0 "/bin/sh -c /bin/bash" 20 minutes ago Exited (0) 38 seconds ago docker01[root@localhost _data]# docker rm -f 14d2256f90b714d2256f90b7# 查看docker02中的数据[root@localhost docker-test-volume]# docker attach 5cfb1e6eb1ff[root@5cfb1e6eb1ff volume01]# lsdocker01 docker03[root@5cfb1e6eb1ff volume01]## 在docker02中创建文件docker02[root@localhost docker-test-volume]# docker attach 5cfb1e6eb1ff[root@5cfb1e6eb1ff volume01]# lsdocker01 docker03[root@5cfb1e6eb1ff volume01]# touch docker02[root@5cfb1e6eb1ff volume01]# lsdocker01 docker02 docker03#在docker03中查看[root@localhost ~]# docker attach 51d0c3deb4cd[root@51d0c3deb4cd /]# cd volume01[root@51d0c3deb4cd volume01]# lsdocker01 docker03[root@51d0c3deb4cd volume01]# lsdocker01 docker02 docker03# 可以看到数据好好的,依旧可以进行同步,为什么?# 因为容器的卷本质上对应主机上的目录,所以这个数据卷容器不需要启动,甚至删除也没关系。
# 验证 查看docker02 docker03中的文件挂载路径# 发现docker02 docker03 都映射在了宿主机的同一个路径下[root@localhost _data]# docker inspect docker02..."Mounts": [{"Type": "volume","Name": "2630c69c3583e0df3e6cf1af00e8a858d58463d7259f76aaaa788dcdc463b63b","Source": "/var/lib/docker/volumes/2630c69c3583e0df3e6cf1af00e8a858d58463d7259f76aaaa788dcdc463b63b/_data","Destination": "/volume01","Driver": "local","Mode": "","RW": true,"Propagation": ""},{"Type": "volume","Name": "adbe88a9686e56ee290ceb5eaaed37541e45cebdb7bdb3daad8af97d28cbf7fd","Source": "/var/lib/docker/volumes/adbe88a9686e56ee290ceb5eaaed37541e45cebdb7bdb3daad8af97d28cbf7fd/_data","Destination": "/volume02","Driver": "local","Mode": "","RW": true,"Propagation": ""}],...[root@localhost _data]# docker inspect docker03..."Mounts": [{"Type": "volume","Name": "2630c69c3583e0df3e6cf1af00e8a858d58463d7259f76aaaa788dcdc463b63b","Source": "/var/lib/docker/volumes/2630c69c3583e0df3e6cf1af00e8a858d58463d7259f76aaaa788dcdc463b63b/_data","Destination": "/volume01","Driver": "local","Mode": "","RW": true,"Propagation": ""},{"Type": "volume","Name": "adbe88a9686e56ee290ceb5eaaed37541e45cebdb7bdb3daad8af97d28cbf7fd","Source": "/var/lib/docker/volumes/adbe88a9686e56ee290ceb5eaaed37541e45cebdb7bdb3daad8af97d28cbf7fd/_data","Destination": "/volume02","Driver": "local","Mode": "","RW": true,"Propagation": ""}],...
结论:
容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
