docker学习(六)卷 Volume

docker学习(一)docker 概述
docker学习(二)docker 安装部署
docker学习(三)常用命令
docker学习(四)使用 commit 制作镜像
docker学习(五)使用 Dockerfile 制作镜像
docker学习(六)卷 Volume
docker学习(七)docker daemon
docker学习(八)HTTP/HTTPS 代理
docker学习(九)docker 调试
docker学习(十)docker 持久化存储

docker本身提供了一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来,容器上的挂载点下的内容就是主机的这个目录下的内容,这类似linux系统下mount的机制。 这样的话,我们修改主机上该目录的内容时,不需要同步容器,对容器来说是立即生效的。 挂载点可以让多个容器共享。

通过docker run命令

命名卷操作

运行命令:

sudo docker run -it --rm --name centos7zlm-container -v /opt/zlm/conf/:/opt/zlm/build/conf/ centos7zlm:v1.0 /bin/bash

可选options:-v hostdir:containerdir 标记在容器中设置了一个目录hostdir为挂载点,并与主机上的containerdir目录关联。
这样不管是在容器中对 containerdir 目录的操作,还是在主机上对 hostdir 目录的操作,都是完全实时同步的,因为这两个目录实际都是指向主机目录。

匿名卷操作

运行命令:

sudo docker run -it --rm --name centos7zlm-container -v /opt/zlm/build/conf/ centos7zlm:v1.0 /bin/bash

-v标记只设置了容器的挂载点,并没有指定关联的主机目录。这时docker会自动绑定主机上的一个目录。通过docker inspect 命令可以查看到。

[test@localhost zlm]$ sudo docker inspect centos7zlm-container
[
    {
        ......
        "Name": "/centos7zlm-container",
        ......
        "Mounts": [
            {
                "Type": "volume",
                "Name": "bfa6d697d1e25a28b48d7d7d7b76a1c607302b8e6495c9ccdb932df4d3abf3f2",
				# 主机目录
                "Source": "/var/lib/docker/volumes/bfa6d697d1e25a28b48d7d7d7b76a1c607302b8e6495c9ccdb932df4d3abf3f2/_data",
				# 容器目录
                "Destination": "/opt/zlm/build/conf",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "b5241c67e201356c557474255308b801521558bfd523c5a748d518d501e7654f",
				# 主机目录
                "Source": "/var/lib/docker/volumes/b5241c67e201356c557474255308b801521558bfd523c5a748d518d501e7654f/_data",
				# 容器目录
                "Destination": "/opt/zlm/build/log",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        ......
    }
]
[test@localhost zlm]$

上面 Mounts下的每条信息记录了容器上一个挂载点的信息,“Destination” 值是容器的挂载点,"Source"值是对应的主机目录。
可以看出这种方式对应的主机目录是自动创建的,其目的不是让在主机上修改,而是让多个容器共享。
列出当前所有的卷:

[test@node-65 ]# sudo docker volume list
DRIVER	VOLUME NAME
local		bfa6d697d1e25a28b48d7d7d7b76a1c607302b8e6495c9ccdb932df4d3abf3f2
local		b5241c67e201356c557474255308b801521558bfd523c5a748d518d501e7654f

通过dockerfile创建

通过Dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。
通过 VOLUME 指令创建的挂载点,是匿名的,无法指定主机上对应的目录,是自动生成的。

VOLUME ["/opt/zlm/build/conf/", "/opt/zlm/build/log/"]

容器共享卷

sudo docker run -it --name centos7zlm-container1 centos7zlm:v1.0 /bin/bash

上面命令中的 centos7zlm:v1.0 是用Dockerfile文件构建的镜像。 这样容器 centos7zlm-container1 就有了 /opt/zlm/build/conf 和 /opt/zlm/build/log 两个挂载点。
下面我们创建另一个容器可以和 centos7zlm-container1 共享 /opt/zlm/build/conf 和 /opt/zlm/build/log,操作如下:

# 可以是来源不同镜像
sudo docker run -it --name ubuntu1804-container2 --volumes-from centos7zlm-container1 ubuntu:18.04 /bin/bash

# 也可以是同一镜像
sudo docker run -it --name centos7zlm-container3 --volumes-from centos7zlm-container1 centos7zlm:v1.0 /bin/bash

以上三个容器 centos7zlm-container1,centos7zlm-container3,centos7zlm-container3 均有 /opt/zlm/build/conf 和 /opt/zlm/build/log 两个目录,且目录中内容是共享的,任何一个容器修改了内容,别的容器都能获取到。

删除卷

删除容器之时删除相关的卷,为:

sudo docker rm -v centos7zlm-container 

删除指定的卷

sudo docker volume rm

实践:数据容器

如果多个容器需要共享数据(如持久化数据库、配置文件或者数据文件等),可以考虑创建一个特定的数据容器,该容器有1个或多个卷。
其它容器通过 --volumes-from 来共享这个数据容器的卷。
因为容器的卷本质上对应主机上的目录,所以这个数据容器也不需要启动。
说明:卷使容器之间的数据共享比较方便,但也有很多问题需要解决,如权限控制、数据的备份、卷的删除等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值