docker(五):存储卷管理

一、存储卷概述

  1. 存储卷(volume)说白就是宿主机上的一个目录,比如叫/hdata,将/hdata挂载到容器内部的数据目录/cdata上,以达到持久化数据的目的。然后说说不用volume的危害:

    • 关闭或重启容器倒是不影响数据,但是删除容器会导致数据丢失
    • 数据存储在容器内部,不利于查看
    • 容器间共享数据不方便
  2. docker有两种类型的存储卷:

    • Bind mount volume:手动指定宿主机和容器的目录路径。
    • Docker-managed volume:手动指定容器内的挂载点目录,而被挂载的目录有docker daemon自行指定。默认位于/var/lib/docker/vfs下面,目录名称通常是ID号。此种方式有点小问题:假设你删掉a容器后,新创建的b容器想要共享使用a容器的数据,那在启动容器时就必须手动指定a容器的ID目录,否则docker daemon会自动再创建一个ID目录。

二、存储卷使用

Bind mount volume类型

  1. 手动创建一个容器。

[root@docker1 ~]# docker run --name busy01 -it -v /docker/busy01:/data --rm busybox
/ # ls data/

  2. 此时复制一个窗口查看存储卷。

[root@docker1 ~]# ll /docker/busy01/        # 可以看到目录卷是可以被自动创建的
total 0
[root@docker1 ~]# docker inspect busy01 | grep -iA9 mounts
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/docker/busy01",    # 卷路径
                "Destination": "/data",    # 目标挂载点
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
# 也可以使用docker自带的go模板方式查看
[root@docker1 ~]# docker inspect -f {{.Mounts}} busy01
[{bind  /docker/busy01 /data   true rprivate}]
# 如果取是ip。
[root@docker1 ~]# docker inspect -f {{.NetworkSettings.IPAddress}} busy01
172.17.0.2

  3. 进入到卷路径下,新建一个文件,然后查看容器中是否同步出现。

[root@docker1 ~]# cd /docker/busy01/
[root@docker1 busy01]# echo 'hello world' >developer
# 然后回到之前启动busy01容器的窗口,查看
/ # cat data/developer 
hello world

  4. Ctrl+d退出容器后查看文件,我加了--rm参数,容器退出自动删除

/ # [root@docker1 ~]# ll /docker/busy01/
total 4
-rw-r--r-- 1 root root 12 Jul 11 18:52 developer

Docker-managed volume类型

  1. 手动创建一个容器,可以看到在其内部自动创建了/data目录

[root@docker1 ~]# docker run --name busy02 -it -v /data --rm busybox
/ # ls data/

  2. 此时复制一个窗口查看存储卷。

[root@docker1 ~]# docker inspect busy02 | grep -iA11 mounts
        "Mounts": [
            {
                "Type": "volume",
                "Name": "eacf080fecc4ff766f27042bf30d5851ae35533663363aeaf3b856204eb9d644",    # 卷名
                "Source": "/var/lib/docker/volumes/eacf080fecc4ff766f27042bf30d5851ae35533663363aeaf3b856204eb9d644/_data",   # 卷路径
                "Destination": "/data",    # 目标挂载点
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

  3. 进入到卷路径下,新建一个文件,然后查看容器中是否同步出现。

[root@docker1 ~]# cd /var/lib/docker/volumes/eacf080fecc4ff766f27042bf30d5851ae35533663363aeaf3b856204eb9d644/_data
[root@docker1 _data]# echo 'hello world' >maintainer
# 然后回到之前启动busy02容器的窗口,查看
/ # cat data/maintainer 
hello world

  4. 退出容器后查看文件是不存在了。这里说明下,如果启动容器时加了--rm的参数,那容器退出时也会同时删掉卷;不加--rm参数手动删除容器是不会影响卷的。

/ # [root@docker1 ~]# ls /var/lib/docker/volumes/eacf080fecc4ff766f27042bf30d5851ae35533663363aeaf3b856204eb9d644/_data
ls: cannot access /var/lib/docker/volumes/eacf080fecc4ff766f27042bf30d5851ae35533663363aeaf3b856204eb9d644/_data: No such file or directory

复制容器存储卷

  1. 首先手动创建一个基础模板容器,只要存在就成,启不启动无所谓。

# 其实这里可以不要--it的参数,因为只拿它做模板,不用启动也不登入。但这里为了查看效果还是加上吧
[root@docker1 ~]# docker run --name busy-template -it -v /docker/busy01:/data busybox
/ # 

  2. 窗口不关闭,打开另外一个窗口启动一个容器,

[root@docker1 ~]# docker run --name busy01 -it --volumes-from busy-template busybox
/ # 

  3. 窗口不关,再开一个窗口查看Mounts信息

[root@docker1 ~]# docker inspect busy01 | grep -iA9 mounts
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/docker/busy01",
                "Destination": "/data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

  其实真实环境中我们可以使用--volumes-from搭配--network container:来使用,构建基础架构容器,比如LNMP


写作不易,转载请注明出处,谢谢~~

posted @ 2019-07-11 20:10  merlee  阅读(956)  评论(0编辑  收藏  举报