关于docker容器数据卷的理解

使用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

可以看到,容器内也有了这个文件。

总结

  1. docker容器的默认数据卷根目录是/var/lib/docker/volumes
  2. 可以匿名挂载具名挂载默认容器数据卷目录下的目录 。
  3. 也可以根据实际需要挂载其他目录。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值