Docker基础 - 06Data Volumes
一、Data Volumes
- Docker 镜像由多个只读层叠加而成,启动容器时, Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。
- 如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,
- 该文件的只读版本仍然存在,只是被已读写层该文件的副本所隐藏, 此即"写时复制(COW)"机制
- 关闭并重启容器,其数据不受影响;但是删除Docker容器,其更改将会全部丢失。
- 存在问题:
-
- 存储于联合文件系统中,不易于宿主机访问
-
- 容器间数据共享不便
-
- 删除容器其数据会丢失
- 解决方案: "卷(volume)"
-
- 卷是容器上的一个或多个"目录",此类目录可绕过联合文件系统,与宿主机上的某目录"绑定(关联)"。
-
-
Volume于容器初始化之时即会创建,由base image提供的卷中的数据会在此期间完成复制。
-
Volume是独立于容器的生命周期实现数据持久化,因此删除容器之时不会删除卷,也不会对未被引用的卷做垃圾回收。
-
卷为docker提供了独立于容器的数据管理机制, 卷实现了"程序(镜像)"和"数据(卷)"分离。
-
二、 Volume types
Docker有两种类型的卷:
每种类型都在容器中存在一个挂载点,但在宿主机上的位置不同
- Bind mount volume
例: /my/bind/volume(container) <--> /some/specific/directory
- Docker-managed volume
例: /managed/volume(container) <--> /var/lib/docker/vfs/dir/<volume ID>
三、 使用Volumes
docker run -it --name box1 -v /data busybox
docker inspect -f {{.Mounts}} box1
docker run -it -v HOSTDIR:VOLUMEDIR --name box2 busybox
docker inspect -f {{.Mounts}} box2
[root@component ~]# docker run -it --name box1 -v /data busybox / # ls / bin data dev etc home proc root sys tmp usr var / # cd /data /data # ls /data # echo "busybox" > aa.txt [root@component ~]# cd /var/lib/docker/volumes/88e72088d20953837db1e907b7cebb1a3fee70f84fe86ecd83c4b9d8bd9c1ea0/_data/ [root@component _data]# ls aa.txt [root@component _data]# cat aa.txt busybox [root@component ~]# docker inspect -f {{.Mounts}} box1 [{volume 88e72088d20953837db1e907b7cebb1a3fee70f84fe86ecd83c4b9d8bd9c1ea0 /var/lib/docker/volumes/88e72088d20953837db1e907b7cebb1a3fee70f84fe86ecd83c4b9d8bd9c1ea0/_data /data local true }]
[root@component ~]# docker inspect -f {{.Mounts}} box2 [{bind /tmp /data true rprivate}]
[root@cl-server ~]# docker volume create hello hello [root@cl-server ~]# docker volume ls DRIVER VOLUME NAME local hello [root@cl-server ~]# docker volume inspect hello [ { "CreatedAt": "2021-07-23T16:35:57+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/hello/_data", "Name": "hello", "Options": {}, "Scope": "local" } ]
[root@cl-server ~]# docker run -itd --name vol03 -v hello:/world busybox 2dc614dc563951f3b17b8dc010eb9b2f6dfb64456eb26d49f4a16e2683da5c5f [root@cl-server ~]# docker run -itd --name vol04 -v hello:/hello -v hello2:/hello2 busybox "Mounts": [ { "Type": "volume", "Name": "hello", "Source": "/var/lib/docker/volumes/hello/_data", "Destination": "/hello", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "hello2", "Source": "/var/lib/docker/volumes/hello2/_data", "Destination": "/hello2", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" } ],
[root@cl-server ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' vol04 10.0.1.7 [root@cl-server ~]# docker inspect --format='{{range .Mounts}}{{.Name}}{{end}}' vol04 hellohello2 [root@cl-server ~]# docker inspect --format='{{range .Mounts}}{{.Name}}{{println}}{{end}}' vol04 hello hello2
四、共享卷
4.1 在容器之间共享卷
docker run -it --name share01 -v /data/volumes/v1:/data busybox
docker run -it --name share02 -v /data/volumes/v1:/data busybox
4.2 复制使用其他容器的卷
docker run 命令使用 --volumes-from 选项
docker run -it --name share01 -v /data/volumes/v1:/data busybox
docker run -it --name share02 --volumes-from share01 busybox