前言
在使用docker数据卷的时候,有两个疑问点,这里主要就是记录验证这两个疑问点的过程。
问题
1,进入容器内部后向容器根目录或其他目录(非数据卷)写入数据时,这些写入的数据是否可持久化(也就是是否会随着容容器的停止而被删除),如果是持久化,那数据保存到宿主机哪里去了?
2,使用-v参数映射一个数据卷到容器内部,这个数据卷在宿主机上的位置是哪里?
验证过程
系统环境及docker版本
[root@node1 ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@node1 ~]# docker --version
Docker version 17.05.0-ce, build 89658be
验证问题(1)
进入容器内部后向容器根目录或其他目录(非数据卷)写入数据时,这些写入的数据是否可持久化(也就是是否会随着容容器的停止而被删除),如果是持久化,那数据保存到宿主机哪里去了?
# 以交互的方式启动容器
[root@node1 ~]# docker run -it nginx /bin/bash
# 在容器中向/目录下写入文件
root@e2a41cdf6a7e:/# echo "hello world" > hello_world.txt
# 退出容器
root@e2a41cdf6a7e:/# exit
# 查看容器ID
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2a41cdf6a7e nginx "/bin/bash" About a minute ago Exited (0) 32 seconds ago jolly_morse
···
# 查看容器详细信息
[root@node1 ~]# docker inspect e2a41cdf6a7e
# 在输入信息中找到`GraphDriver`这个key所对应的信息,这里就是宿主机上保存该容器内部相关目录的地方
···
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay/7ae67d0ba65fa1495fb1180c2336063545fd8a9d0d8db3b197edcbe1c351efa2/root",
"MergedDir": "/var/lib/docker/overlay/2467d2346e2feaac0a36f16e7191e8bca30a38efefc3aad88340a92091402ddb/merged",
"UpperDir": "/var/lib/docker/overlay/2467d2346e2feaac0a36f16e7191e8bca30a38efefc3aad88340a92091402ddb/upper",
"WorkDir": "/var/lib/docker/overlay/2467d2346e2feaac0a36f16e7191e8bca30a38efefc3aad88340a92091402ddb/work"
},
"Name": "overlay"
},
···
# 删除该容器时,此时宿主机上的对应的目录也会跟着删除
[root@node1 ~]# docker rm e2a41cdf6a7e
e2a41cdf6a7e
验证问题(2)
使用-v参数映射一个数据卷到容器内部,这个数据卷在宿主机上的位置是哪里?
注意下面是使用的-v des的方式,而不是-v src:des方式。如果是-v src:des方式,那des就是对应宿主机的src目录。
# 将宿主机本地某个目录映射到容器内部,下面的/root/td1/是在容器内部的名称,作为该容器的数据卷
[root@node1 ~]# docker run -it -v /root/td1/ nginx /bin/bash
# 在容器内部查看该数据卷里面的数据
root@8af5d9da2811:/# ls -l /root/td1/
total 0
# 向该数据卷写入数据
root@8af5d9da2811:/# echo "test_td1.txt" > /root/td1/test_td1.txt
# 退出容器,并查看该容器的详细信息,并找到`Mounts`key对应的信息,该信息就是该容器的数据卷在宿主机上的位置信息
[root@node1 ~] docker inspect 822bbdef464f
···
"Mounts": [
{
"Type": "volume",
"Name": "0728604ac47f8854a844e33ca68347224aa9cbb0667d9a42abafdbf9f0a6c705",
"Source": "/var/lib/docker/volumes/0728604ac47f8854a844e33ca68347224aa9cbb0667d9a42abafdbf9f0a6c705/_data",
"Destination": "/root/td1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
···
# 其中/var/lib/docker/volumes/0728604ac47f8854a844e33ca68347224aa9cbb0667d9a42abafdbf9f0a6c705/_data
# 就是该容器内部/root/td1/目录对应的宿主机本地目录
# 如果删除该容器的话,在宿主机上的对应的目录不会丢失
[root@node1 volumes]# ll /var/lib/docker/volumes/0728604ac47f8854a844e33ca68347224aa9cbb0667d9a42abafdbf9f0a6c705/_data
total 4
-rw-r--r-- 1 root root 13 Jul 12 10:33 test_td1.txt
ok,了解docker数据卷的几种使用方式,以及它和宿主机对应目录的位置关系后,在读写数据时就可以做到心中有底了。