docker_info_03_volume 数据卷管理
3.1.docker 目录挂载命令
docker run -it --name volume02 -h zsdocker02 -v /server centos # 不指定宿主机目录
docker run -it --name volume01 -h zsdocker01 -v /hostdir:/dockedir centos
# 以下2种选项,可以加只读参数,保护宿主机数据
-v /dockerdir # 创建容器目录/dockerdir挂载到宿主机系统
-v /hostdir:/dockerdir # 宿主机目录/容器目录
1)使用 -v 参数挂载目录时,容器目录和宿主机目录不存在时会自动创建
2)挂载文件时,源文件必须存在,否则会创建以该文件名命名的目录
3)宿主机的目录可以使用相对路径,默认的工作目录在 /var/lib/docker/volumes/,而不是当前所在的目录
docker run -it --name volume01 -v hostdir:/dockedir centos /bin/bash
4)容器目录不可以为相对路径,如下命令是错误的:
docker run -it --name volume01 -v /hostdir:dockedir centos /bin/bash
5)通过以下命令的 Mounts 字段可以看出挂载目录的具体信息
# docker inspect volume02 | grep Mounts -A 10 # 可用
# docker inspect -f {{.Config.Volumes} volume02 # 失败
docker inspect {{.volume}} volume02
docker inspect volume02
6)如果在docker中修改了挂载目录的属主信息,宿主机中对应目录的属主会修改为与容器中属主UID相同的用户
7)删除容器,挂载的目录是否会删除?
删除容器该宿主机目录不会被删除,随机名称的挂载目录也不会被删除
3.2.docker 目录挂载实例演示
3.2.1.挂载指定的宿主机目录到容器中
docker run -it --name volume01 -h zsdocker01 -v /server:/server centos
---------------------------------
[root@zuiyoujie ~]# cd /server
[root@zuiyoujie server]# echo 002 >002.txt # 创建测试文件
[root@zuiyoujie server]# docker run -it --name volume01 -h zsdocker01 -v /server:/server centos
[root@zsdocker01 /]# cd /server
[root@zsdocker01 server]# ll
total 4
-rw-r--r-- 1 root root 7 Aug 22 09:22 002.txt
[root@zsdocker01 server]# ls 002.txt # 查看测试文件
---------------------------------
3.2.2.挂载时不指定宿主机的目录
docker run -it --name volume02 -h zsdocker02 -v /server centos
-------------------------------------
[root@zuiyoujie tools]# docker run -it --name volume02 -h zsdocker02 -v /server centos # 创建挂载目录的容器volume02
[root@zsdocker02 /]# cd /server/
[root@zsdocker02 server]# ll
total 0
[root@zsdocker02 server]# touch aaa.txt bbb.txt 20180822.txt # 创建测试文件
[root@zsdocker02 server]# mkdir -p {ccc,ddd} # 创建测试目录
[root@zsdocker02 server]# ll # 检查
total 0
-rw-r--r-- 1 root root 0 Aug 28 16:02 20180822.txt
-rw-r--r-- 1 root root 0 Aug 28 16:02 aaa.txt
-rw-r--r-- 1 root root 0 Aug 28 16:02 bbb.txt
drwxr-xr-x 2 root root 6 Aug 28 16:02 ccc
drwxr-xr-x 2 root root 6 Aug 28 16:02 ddd
[root@zsdocker02 server]# exit
# 查看挂载目录的真实位置
[root@zuiyoujie tools]# docker inspect volume02 | grep Mounts -A 10
--------------------------------------------------------
"Mounts": [
{
"Type": "volume",
"Name": "eb4047959ec15dba75d3c0316d44f77783dfcfb985f57ac6206a790658774034",
"Source": "/var/lib/docker/volumes/eb4047959ec15dba75d3c0316d44f77783dfcfb985f57ac6206a790658774034/_data",
"Destination": "/server",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
--------------------------------------------------------
[root@zuiyoujie ~]# docker inspect -f {{Volumes}} volume02 # 失败
map[/data:/var/lib/docker/volumes/47491b6ed876e3e160cd4a50aabbbcf06ea24e2adf9122b0760addd96ba96567/_data]
[root@zuiyoujie ~]# cd /var/lib/docker/volumes/ # 进入docker容器数据卷目录
[root@zuiyoujie volumes]# ll # 下面这个随机名的目录就是volume02容器/data挂载到宿主机的目录
total 28
drwxr-xr-x 3 root root 4096 Aug 22 16:51 eb4047959ec15dba75d3c0316d44f77783dfcfb985f57ac6206a790658774034
-rw------- 1 root root 32768 Aug 22 16:51 metadata.db
[root@zuiyoujie volumes]# cd eb4047959ec15dba75d3c0316d44f77783dfcfb985f57ac6206a790658774034/
[root@zuiyoujie eb4047959ec15dba75d3c0316d44f77783dfcfb985f57ac6206a790658774034]# ll
total 4
drwxr-xr-x 4 root root 4096 Aug 22 16:53 _data # 里面的_data目录对应/data
[root@zuiyoujie eb4047959ec15dba75d3c0316d44f77783dfcfb985f57ac6206a790658774034]# cd _data/
[root@zuiyoujie _data]# ll # 可以在宿主机中看到刚才创建的文件和目录
total 8
-rw-r--r-- 1 root root 0 Aug 22 16:53 20180822.txt
-rw-r--r-- 1 root root 0 Aug 22 16:53 aaa.txt
-rw-r--r-- 1 root root 0 Aug 22 16:53 bbb.txt
drwxr-xr-x 2 root root 4096 Aug 22 16:53 ccc
drwxr-xr-x 2 root root 4096 Aug 22 16:53 ddd
----------------------------
3.2.3.以只读方式挂载指定目录
docker run -it --name volume03 -h zsdocker-03 -v /opt/tools/:/opt/tools/:ro centos
----------------------------
[root@zuiyoujie tools]# docker run -it --name volume03 -h zsdocker-03 -v /opt/tools/:/opt/tools/:ro centos
[root@zsdocker-03 /]# cd /opt/tools/
[root@zsdocker-03 tools]# ls
Python-3.6.2 Python-3.6.2.tgz docker-ce-18.06.1.ce-3.el7.x86_64.rpm
[root@zsdocker-03 tools]# touch ee
touch: cannot touch 'ee': Read-only file system
----------------------------
3.2.4.挂载一个已经存在的数据卷
docker run -it --name volume04 --volumes-from volume01 -h zsdocker-04 centos
--volumes-from # 读取某个数据卷容器
-i # 让终端保持打开状态
-t # 启动终端
-----------------------------
[root@zuiyoujie tools]# docker run -it --name volume04 --volumes-from volume02 -h zsdocker-04 centos
[root@zsdocker-04 /]# cd /server/
[root@zsdocker-04 server]# ls
20180822.txt aaa.txt bbb.txt ccc ddd
# 在物理机上面查看创建的文件和目录
[root@zuiyoujie _data]# ll /var/lib/docker/volumes/eb4047959ec15dba75d3c0316d44f77783dfcfb985f57ac6206a790658774034/_data/
总用量 0
-rw-r--r-- 1 root root 0 8月 29 00:02 20180822.txt
-rw-r--r-- 1 root root 0 8月 29 00:02 aaa.txt
-rw-r--r-- 1 root root 0 8月 29 00:02 bbb.txt
drwxr-xr-x 2 root root 6 8月 29 00:02 ccc
drwxr-xr-x 2 root root 6 8月 29 00:02 ddd
----------------------------------------
END