Dockerfile 就是用来构建docker镜像的构建文件。命令脚本,先体验一下。
通过这个脚本可以生成镜像,这个镜像是一层一层的,脚本一个个的命令,每个命令是一层
# 创建一个dockerfile 文件 名字可以随意,建议dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["/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/bash
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.
# 生成镜像
[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]# ls
container.txt
# 容器外查看是否文件同步
[root@localhost home]# cd /var/lib/docker/volumes/45d97f75807b1cf296163ee9a189a422b1e39188578b9f1e594a2cf2537327b1/_data
[root@localhost _data]# ls
container.txt
# 文件同步成功
这种方式使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
最佳实践:数据卷容器
如果多个容器需要共享数据(如持久化数据库、配置文件或者数据文件等),可以考虑创建一个特定的数据卷容器,该容器有1个或多个卷。其它容器通过--volumes-from
来共享这个数据卷容器的卷。
启动第一个容器docker01
[root@localhost docker-test-volume]# docker run -it --name docker01 ceshi/centos:1.0
[root@14d2256f90b7 /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Jun 9 04:00 dev
drwxr-xr-x. 1 root root 66 Jun 9 04:00 etc
drwxr-xr-x. 2 root root 6 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 6 Dec 4 2020 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 100 root root 0 Jun 9 04:00 proc
dr-xr-x---. 2 root root 162 Dec 4 2020 root
drwxr-xr-x. 11 root root 163 Dec 4 2020 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jun 8 13:19 sys
drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp
drwxr-xr-x. 12 root root 144 Dec 4 2020 usr
drwxr-xr-x. 20 root root 262 Dec 4 2020 var
drwxr-xr-x. 2 root root 6 Jun 9 04:00 volume01
drwxr-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 -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Jun 9 04:13 dev
drwxr-xr-x. 1 root root 66 Jun 9 04:13 etc
drwxr-xr-x. 2 root root 6 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 6 Dec 4 2020 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 103 root root 0 Jun 9 04:13 proc
dr-xr-x---. 2 root root 162 Dec 4 2020 root
drwxr-xr-x. 11 root root 163 Dec 4 2020 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jun 8 13:19 sys
drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp
drwxr-xr-x. 12 root root 144 Dec 4 2020 usr
drwxr-xr-x. 20 root root 262 Dec 4 2020 var
drwxr-xr-x. 2 root root 6 Jun 9 04:11 volume01
drwxr-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 -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Jun 9 04:23 dev
drwxr-xr-x. 1 root root 66 Jun 9 04:23 etc
drwxr-xr-x. 2 root root 6 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 6 Dec 4 2020 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 106 root root 0 Jun 9 04:23 proc
dr-xr-x---. 2 root root 162 Dec 4 2020 root
drwxr-xr-x. 11 root root 163 Dec 4 2020 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jun 8 13:19 sys
drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp
drwxr-xr-x. 12 root root 144 Dec 4 2020 usr
drwxr-xr-x. 20 root root 262 Dec 4 2020 var
drwxr-xr-x. 2 root root 22 Jun 9 04:16 volume01
drwxr-xr-x. 2 root root 6 Jun 9 04:11 volume02
[root@51d0c3deb4cd /]# cd volume01
[root@51d0c3deb4cd volume01]# ls
docker01
[root@51d0c3deb4cd volume01]# touch docker03
[root@51d0c3deb4cd volume01]# ls
docker01 docker03
[root@51d0c3deb4cd volume01]#
# docker01中也可以看到docker03创建的文件
[root@14d2256f90b7 volume01]# ls
docker01 docker03
测试将docker01彻底删除,查看docker02上的文件
# 删除docker01
[root@localhost _data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51d0c3deb4cd ceshi/centos:1.0 "/bin/sh -c /bin/bash" 8 minutes ago Exited (127) About a minute ago docker03
5cfb1e6eb1ff ceshi/centos:1.0 "/bin/sh -c /bin/bash" 17 minutes ago Up 17 minutes docker02
14d2256f90b7 ceshi/centos:1.0 "/bin/sh -c /bin/bash" 20 minutes ago Exited (0) 38 seconds ago docker01
[root@localhost _data]# docker rm -f 14d2256f90b7
14d2256f90b7
# 查看docker02中的数据
[root@localhost docker-test-volume]# docker attach 5cfb1e6eb1ff
[root@5cfb1e6eb1ff volume01]# ls
docker01 docker03
[root@5cfb1e6eb1ff volume01]#
# 在docker02中创建文件docker02
[root@localhost docker-test-volume]# docker attach 5cfb1e6eb1ff
[root@5cfb1e6eb1ff volume01]# ls
docker01 docker03
[root@5cfb1e6eb1ff volume01]# touch docker02
[root@5cfb1e6eb1ff volume01]# ls
docker01 docker02 docker03
#在docker03中查看
[root@localhost ~]# docker attach 51d0c3deb4cd
[root@51d0c3deb4cd /]# cd volume01
[root@51d0c3deb4cd volume01]# ls
docker01 docker03
[root@51d0c3deb4cd volume01]# ls
docker01 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": ""
}
],
...
结论:
容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!