zoukankan      html  css  js  c++  java
  • 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


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

  • 相关阅读:
    linux ssh 免密码登录
    Emacs Org Mode学习
    Emacs Org Mode学习
    java--for循环,一个分号的区别
    java--for循环,一个分号的区别
    【JVM.6】虚拟机类加载机制
    【JVM.5】类文件结构
    【JVM.4】调优案例分析与实战
    【JVM.3】虚拟机性能监控与故障处理工具
    【JVM.2】垃圾收集器与内存分配策略
  • 原文地址:https://www.cnblogs.com/ccbloom/p/11170905.html
Copyright © 2011-2022 走看看