使用docker的过程中,无论如何离不开容器的数据卷,不管通过哪种方式产生了容器数据卷以用于存储数据
, 我浅显的认为docker会有3种方式:
- 匿名挂载
- 具名挂载
- -v 绑定
下面我们创建几个容器,同时查看容器内部结构:
1. test00
# 创建容器 test00
[root@centos thdao]# docker run -d --name test00 nginx
d52e71ed306a3235aea02ba91a5202997f1f50382bced7f74aeef2b93a3b0c6d
[root@centos thdao]# docker inspect test00
[
{
"Id": "d52e71ed306a3235aea02ba91a5202997f1f50382bced7f74aeef2b93a3b0c6d",
"Name": "/test00",
"Mounts": [],
}
]
这种方式创建容器后,没有任何挂载,“mounts”后面的数组是空的。
2.test01
# 创建容器 test01
[root@centos thdao]# docker run -d --name test01 -v /etc/nginx nginx
6ef2e0f2fc05cec4a05506772062bb825690a715526e4f1c5280555d96f69085
[root@centos thdao]# docker inspect test01
[
{
"Id": "6ef2e0f2fc05cec4a05506772062bb825690a715526e4f1c5280555d96f69085",
"Name": "/test01",
"Mounts": [
{
"Type": "volume",
"Name": "a8e454526ad8426dc456960790e0ba8957c4d7ee5ff7f808609b7ff4c7eb6ef8",
"Source": "/var/lib/docker/volumes/a8e454526ad8426dc456960790e0ba8957c4d7ee5ff7f808609b7ff4c7eb6ef8/_data",
"Destination": "/etc/nginx",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
}
]
创建容器后,会在数据卷根目录下创建一个随机名的目录,并将目录下的_data挂载绑定到容器
3.test02
# 创建容器 test02
[root@centos thdao]# docker run -d --name test02 -v testvolumename:/etc/nginx nginx
c02a9c1df1bf03d5d3532aabcd1e8a72aed96f7442b2c8f44ac161dec7977f2c
[root@centos thdao]# docker inspect test02
[
{
"Id": "c02a9c1df1bf03d5d3532aabcd1e8a72aed96f7442b2c8f44ac161dec7977f2c",
"Name": "/test02",
"Mounts": [
{
"Type": "volume",
"Name": "testvolumename",
"Source": "/var/lib/docker/volumes/testvolumename/_data",
"Destination": "/etc/nginx",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
}
]
创建容器后,会在容器数据卷根目录下创建一个指定名称的目录,并在目录下创建_data目录挂载绑定到容器中
4.test03
# 创建容器 test03
[root@centos thdao]# docker run -d --name test03 -v /home/thdao/dockertest/testvolume:/etc/nginx nginx
84263d3cc8e64436f4d8770a99a08e0cff887ed8811cdc312f56a0655f8815ac
[root@centos thdao]# docker inspect test03
[
{
"Id": "84263d3cc8e64436f4d8770a99a08e0cff887ed8811cdc312f56a0655f8815ac",
"Name": "/test03",
"Mounts": [
{
"Type": "bind",
"Source": "/home/thdao/dockertest/testvolume",
"Destination": "/etc/nginx",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
}
]
创建容器时,不会在容器数据卷根目录下创建新的目录,而是将指定的目录挂载绑定到容器中
接下来我们看看创建这些容器时,容器数据卷下面创建了哪些目录
[root@centos thdao]# docker volume ls
DRIVER VOLUME NAME
local a8e454526ad8426dc456960790e0ba8957c4d7ee5ff7f808609b7ff4c7eb6ef8
local testvolumename
可以看到,只有test01和test02这两个容器创建新的数据卷。
下面我们进入 到testvolumename目录中看看结构
[root@centos thdao]# cd /var/lib/docker/volumes/testvolumename/
[root@centos testvolumename]# ls
_data
[root@centos testvolumename]# cd _data/
[root@centos _data]# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
_data目录中是nginx的标准目录结构。
尝试着进入到容器中,并创建一个文件
[root@centos _data]# docker exec -it test02 /bin/bash
root@c02a9c1df1bf:/# cd /etc/nginx/
root@c02a9c1df1bf:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
此时容器中没有testaa.txt文件
宿主机中进入到容器数据卷的目录中创建文件testaa.txt
[root@centos thdao]# cd /var/lib/docker/volumes/testvolumename/_data
[root@centos _data]# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
[root@centos _data]# vim testaa.txt
[root@centos _data]# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params testaa.txt uwsgi_params
[root@centos thdao]# cd /var/lib/docker/volumes/testvolumename/_data
[root@centos _data]# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
[root@centos _data]# vim testaa.txt
[root@centos _data]# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params testaa.txt uwsgi_params
[root@centos _data]# cat testaa.txt
testtest
创建了文件testaa.txt,文件内容是"testtest"
再回到容器中,查看目录
root@c02a9c1df1bf:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params testaa.txt uwsgi_params
root@c02a9c1df1bf:/etc/nginx# cat testaa.txt
testtest
可以看到,容器内也有了这个文件。
总结
- docker容器的默认数据卷根目录是/var/lib/docker/volumes
- 可以
匿名挂载
或具名挂载
默认容器数据卷目录下的目录 。 - 也可以根据实际需要挂载其他目录。