从上图可以看出要想在docker内部以及容器之间管理数据,主要有两种方式:数据卷(Volumes)和挂载主机目录(bind mount)
1、数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,功能主要有:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响到镜像
- 数据卷会一直默认存在,即使容器被删除
数据卷的使用,类似于Linux下对目录或文件进行mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅在数据卷为空时会复制)
1)创建一个数据卷
docker volume create my-volume
如果你的机器是Linux,你会在var.lib/docker/volumes目录下看到该volume
而Mac下的docker则是在VM里面又封装了一层,mac下的查看方式为:
docker run -it --privileged --pid=host justincormack/nsenter1cd /var/lib/docker/volumesqihoodeMacBook-Pro:~ root# docker run -it --privileged --pid=host justincormack/nsenter1
/ # cd /var/lib/docker/volumes
/var/lib/docker/volumes # ls
44f4b7e0592660de2239ecce520c3e091ea168853afb542b40a2deb2cc611b18 e46753a608e641e286ac1188af1a6710b1b520c72e4ec212da3636eb342f529f
5237fa93b9522e001090757bc0727557a2c1e3616d1ce7a3fe821c7120e5d675 f8b6527b8c6dcf1c0c5d3b85e3b406eaac88c588fc22e220f53c6117502dd054
527b7abeedd6f07e8e43224c6910b10edade306075ee7f04922ae69bee7d610a metadata.db
a701dee6c7d8f4c05631e415ce80e7ff597316da49a684a0cd6f7370bf61dbed minikube
a9a59950d4ffa7082f5eac397081bc30302b016c031d8c210d99cb4518d13c5d my-volume
ac64ea2e779c08e41434196b9c50757cd8242cc4d9bcc25880b8ea8219922054 test-volume
backingFsBlockDev tets-vol
/var/lib/docker/volumes #
2)查看数据卷
docker volume ls
3)本地主机查看数据卷的详细信息
docker volume inspect my-volume
qihoodeMacBook-Pro:~ root# docker volume inspect my-volume
[{"CreatedAt": "2021-09-10T08:51:07Z","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/my-volume/_data","Name": "my-volume","Options": {},"Scope": "local"}
]
4)启动一个挂载数据卷的容器
使用--mount标记将数据卷挂载到容器里,一个容器可以挂载多个数据卷
qihoodeMacBook-Pro:~ root# docker run -it --mount source=my-volume,target=/test ubuntu:20.04 /bin/bash
root@1c912cd98c17:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys test tmp usr var
如果target对应的目录不存在,会自动创建
5)在容器下的test目录下创建文件
root@1c912cd98c17:/# cd test
root@1c912cd98c17:/test# ls
root@1c912cd98c17:/test# mkdir file1
在本机的my_volume下查看,出现file1文件
/var/lib/docker/volumes/my-volume # ls
_data
/var/lib/docker/volumes/my-volume # cd _data
/var/lib/docker/volumes/my-volume/_data # ls
file1
6)删除容器,发现数据还在
docker rm containerID
再去/var/lib/docker/volume目录下查看,file1文件仍然存在
2.挂载主机目录
使用--mount标记还可以挂载一个本地主机的目录到容器中去
1)创建容器,指定挂载目录
docker run -it --mount type=bind,source=/myFile/test1,target=/test ubuntu:20.04 /bin/bash
source必须指定绝对路径,否则会报错。
2)在容器的test文件下创建文件
root@425be975215d:/# cd test
root@425be975215d:/test# mkdir file1
在主机的/myFile/test1目录下可以看到file1文件
3)Docker挂载主机目录的默认权限是读写,用户可以增加readonly指定为只读,如下
docker run -it --mount type=bind,source=/Users/zhouquanwei/myFile/test1,target=/test ,readonly ubuntu:20.04 /bin/bash
此时如果,再在容器的test目录下创建文件则会报错
3.tmpfs
挂载存储在本地主机系统的内存中,而不会写入本地主机的文件系统,这种方式一般不使用。