Dockerfile 就是用来构建docker镜像的构建文件。命令脚本,先体验一下。
通过这个脚本可以生成镜像,这个镜像是一层一层的,脚本一个个的命令,每个命令是一层

  1. # 创建一个dockerfile 文件 名字可以随意,建议dockerfile
  2. # 文件中的内容 指令(大写) 参数
  3. FROM centos
  4. VOLUME ["/volume01","/volume02"]
  5. CMD echo "--------end--------"
  6. CMD /bin/bash
  7. # 这里的每条命令就是镜像的一层
  8. # 注意这里的 VOLUME ["/volume01","/volume02"] 通过VOLUME指令指定了两个挂载点 /volume01 和 /volume02
  9. # 不能写成VOLUME ["volume01","volume02"] 要加 / 否则在启动时会报错
  10. [root@localhost docker-test-volume]# docker run -it 4a64df3f0173 /bin/bash
  11. docker: 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.
  12. # 生成镜像
  13. [root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t ceshi/centos:1.0 .

image.png
启动自己生成的镜像
image.png
我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息
image.png
由此推断出使用的是匿名挂载方式,既挂载在宿主机默认路径的随机目录下/var/lib/docker/volumes/xxx/_data
测试一下文件是否同步

  1. # 容器内创建一个文件
  2. [root@localhost docker-test-volume]# docker run -it 2e245ff80b78 /bin/bash
  3. [root@c27e4c77cce9 /]# cd volume01
  4. [root@c27e4c77cce9 volume01]# touch container.txt
  5. [root@c27e4c77cce9 volume01]# ls
  6. container.txt
  7. # 容器外查看是否文件同步
  8. [root@localhost home]# cd /var/lib/docker/volumes/45d97f75807b1cf296163ee9a189a422b1e39188578b9f1e594a2cf2537327b1/_data
  9. [root@localhost _data]# ls
  10. container.txt
  11. # 文件同步成功

这种方式使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!

最佳实践:数据卷容器

如果多个容器需要共享数据(如持久化数据库、配置文件或者数据文件等),可以考虑创建一个特定的数据卷容器,该容器有1个或多个卷。其它容器通过--volumes-from 来共享这个数据卷容器的卷。

启动第一个容器docker01

  1. [root@localhost docker-test-volume]# docker run -it --name docker01 ceshi/centos:1.0
  2. [root@14d2256f90b7 /]# ls -l
  3. total 0
  4. lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
  5. drwxr-xr-x. 5 root root 360 Jun 9 04:00 dev
  6. drwxr-xr-x. 1 root root 66 Jun 9 04:00 etc
  7. drwxr-xr-x. 2 root root 6 Nov 3 2020 home
  8. lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
  9. lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
  10. drwx------. 2 root root 6 Dec 4 2020 lost+found
  11. drwxr-xr-x. 2 root root 6 Nov 3 2020 media
  12. drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
  13. drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
  14. dr-xr-xr-x. 100 root root 0 Jun 9 04:00 proc
  15. dr-xr-x---. 2 root root 162 Dec 4 2020 root
  16. drwxr-xr-x. 11 root root 163 Dec 4 2020 run
  17. lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
  18. drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
  19. dr-xr-xr-x. 13 root root 0 Jun 8 13:19 sys
  20. drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp
  21. drwxr-xr-x. 12 root root 144 Dec 4 2020 usr
  22. drwxr-xr-x. 20 root root 262 Dec 4 2020 var
  23. drwxr-xr-x. 2 root root 6 Jun 9 04:00 volume01
  24. drwxr-xr-x. 2 root root 6 Jun 9 04:00 volume02
  25. [root@14d2256f90b7 /]#

启动第二个容器docker02,并通过—volumes-from 来共享数据

  1. [root@localhost docker-test-volume]# docker run -it --name docker02 --volumes-from docker01 ceshi/centos:1.0
  2. [root@5cfb1e6eb1ff /]# ls -l
  3. total 0
  4. lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
  5. drwxr-xr-x. 5 root root 360 Jun 9 04:13 dev
  6. drwxr-xr-x. 1 root root 66 Jun 9 04:13 etc
  7. drwxr-xr-x. 2 root root 6 Nov 3 2020 home
  8. lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
  9. lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
  10. drwx------. 2 root root 6 Dec 4 2020 lost+found
  11. drwxr-xr-x. 2 root root 6 Nov 3 2020 media
  12. drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
  13. drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
  14. dr-xr-xr-x. 103 root root 0 Jun 9 04:13 proc
  15. dr-xr-x---. 2 root root 162 Dec 4 2020 root
  16. drwxr-xr-x. 11 root root 163 Dec 4 2020 run
  17. lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
  18. drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
  19. dr-xr-xr-x. 13 root root 0 Jun 8 13:19 sys
  20. drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp
  21. drwxr-xr-x. 12 root root 144 Dec 4 2020 usr
  22. drwxr-xr-x. 20 root root 262 Dec 4 2020 var
  23. drwxr-xr-x. 2 root root 6 Jun 9 04:11 volume01
  24. drwxr-xr-x. 2 root root 6 Jun 9 04:11 volume02

在docker01中创建的数据同步到了docker02中
image.png
再创建一个docker03也共享数据到docker01

  1. [root@localhost docker-test-volume]# docker run -it --name docker03 --volumes-from docker01 ceshi/centos:1.0
  2. [root@51d0c3deb4cd /]# ls -l
  3. total 0
  4. lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
  5. drwxr-xr-x. 5 root root 360 Jun 9 04:23 dev
  6. drwxr-xr-x. 1 root root 66 Jun 9 04:23 etc
  7. drwxr-xr-x. 2 root root 6 Nov 3 2020 home
  8. lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
  9. lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
  10. drwx------. 2 root root 6 Dec 4 2020 lost+found
  11. drwxr-xr-x. 2 root root 6 Nov 3 2020 media
  12. drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
  13. drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
  14. dr-xr-xr-x. 106 root root 0 Jun 9 04:23 proc
  15. dr-xr-x---. 2 root root 162 Dec 4 2020 root
  16. drwxr-xr-x. 11 root root 163 Dec 4 2020 run
  17. lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
  18. drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
  19. dr-xr-xr-x. 13 root root 0 Jun 8 13:19 sys
  20. drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp
  21. drwxr-xr-x. 12 root root 144 Dec 4 2020 usr
  22. drwxr-xr-x. 20 root root 262 Dec 4 2020 var
  23. drwxr-xr-x. 2 root root 22 Jun 9 04:16 volume01
  24. drwxr-xr-x. 2 root root 6 Jun 9 04:11 volume02
  25. [root@51d0c3deb4cd /]# cd volume01
  26. [root@51d0c3deb4cd volume01]# ls
  27. docker01
  28. [root@51d0c3deb4cd volume01]# touch docker03
  29. [root@51d0c3deb4cd volume01]# ls
  30. docker01 docker03
  31. [root@51d0c3deb4cd volume01]#
  32. # docker01中也可以看到docker03创建的文件
  33. [root@14d2256f90b7 volume01]# ls
  34. docker01 docker03

测试将docker01彻底删除,查看docker02上的文件

  1. # 删除docker01
  2. [root@localhost _data]# docker ps -a
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 51d0c3deb4cd ceshi/centos:1.0 "/bin/sh -c /bin/bash" 8 minutes ago Exited (127) About a minute ago docker03
  5. 5cfb1e6eb1ff ceshi/centos:1.0 "/bin/sh -c /bin/bash" 17 minutes ago Up 17 minutes docker02
  6. 14d2256f90b7 ceshi/centos:1.0 "/bin/sh -c /bin/bash" 20 minutes ago Exited (0) 38 seconds ago docker01
  7. [root@localhost _data]# docker rm -f 14d2256f90b7
  8. 14d2256f90b7
  9. # 查看docker02中的数据
  10. [root@localhost docker-test-volume]# docker attach 5cfb1e6eb1ff
  11. [root@5cfb1e6eb1ff volume01]# ls
  12. docker01 docker03
  13. [root@5cfb1e6eb1ff volume01]#
  14. # 在docker02中创建文件docker02
  15. [root@localhost docker-test-volume]# docker attach 5cfb1e6eb1ff
  16. [root@5cfb1e6eb1ff volume01]# ls
  17. docker01 docker03
  18. [root@5cfb1e6eb1ff volume01]# touch docker02
  19. [root@5cfb1e6eb1ff volume01]# ls
  20. docker01 docker02 docker03
  21. #在docker03中查看
  22. [root@localhost ~]# docker attach 51d0c3deb4cd
  23. [root@51d0c3deb4cd /]# cd volume01
  24. [root@51d0c3deb4cd volume01]# ls
  25. docker01 docker03
  26. [root@51d0c3deb4cd volume01]# ls
  27. docker01 docker02 docker03
  28. # 可以看到数据好好的,依旧可以进行同步,为什么?
  29. # 因为容器的卷本质上对应主机上的目录,所以这个数据卷容器不需要启动,甚至删除也没关系。
  1. # 验证 查看docker02 docker03中的文件挂载路径
  2. # 发现docker02 docker03 都映射在了宿主机的同一个路径下
  3. [root@localhost _data]# docker inspect docker02
  4. ...
  5. "Mounts": [
  6. {
  7. "Type": "volume",
  8. "Name": "2630c69c3583e0df3e6cf1af00e8a858d58463d7259f76aaaa788dcdc463b63b",
  9. "Source": "/var/lib/docker/volumes/2630c69c3583e0df3e6cf1af00e8a858d58463d7259f76aaaa788dcdc463b63b/_data",
  10. "Destination": "/volume01",
  11. "Driver": "local",
  12. "Mode": "",
  13. "RW": true,
  14. "Propagation": ""
  15. },
  16. {
  17. "Type": "volume",
  18. "Name": "adbe88a9686e56ee290ceb5eaaed37541e45cebdb7bdb3daad8af97d28cbf7fd",
  19. "Source": "/var/lib/docker/volumes/adbe88a9686e56ee290ceb5eaaed37541e45cebdb7bdb3daad8af97d28cbf7fd/_data",
  20. "Destination": "/volume02",
  21. "Driver": "local",
  22. "Mode": "",
  23. "RW": true,
  24. "Propagation": ""
  25. }
  26. ],
  27. ...
  28. [root@localhost _data]# docker inspect docker03
  29. ...
  30. "Mounts": [
  31. {
  32. "Type": "volume",
  33. "Name": "2630c69c3583e0df3e6cf1af00e8a858d58463d7259f76aaaa788dcdc463b63b",
  34. "Source": "/var/lib/docker/volumes/2630c69c3583e0df3e6cf1af00e8a858d58463d7259f76aaaa788dcdc463b63b/_data",
  35. "Destination": "/volume01",
  36. "Driver": "local",
  37. "Mode": "",
  38. "RW": true,
  39. "Propagation": ""
  40. },
  41. {
  42. "Type": "volume",
  43. "Name": "adbe88a9686e56ee290ceb5eaaed37541e45cebdb7bdb3daad8af97d28cbf7fd",
  44. "Source": "/var/lib/docker/volumes/adbe88a9686e56ee290ceb5eaaed37541e45cebdb7bdb3daad8af97d28cbf7fd/_data",
  45. "Destination": "/volume02",
  46. "Driver": "local",
  47. "Mode": "",
  48. "RW": true,
  49. "Propagation": ""
  50. }
  51. ],
  52. ...

结论:
容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!