Docker的容器数据卷

什么是数据卷?

 

容器运行过程中会产生相关数据,为了避免在 停止/删除 容器时造成数据丢失,需要实现数据持久化存储,需要把宿主机目录挂载到容器里面,实现数据共享并且存储。

简单来说:把宿主机中的某几个目录挂载到容器中,目的是:实现数据持久化存储以及数据备份,实现数据共享。

类似于Redis中的rdb和aof文件

主要特点哪些?(能干什么)

数据卷的设计目的就在于:数据持久化,完全独立于容器的生存周期,因此Docker 不会在容器删除时删除其挂载的数据卷,这样就实现了数据持久化。

数据卷作用:

  1. 数据持久化
  2. 数据共享、容器继承

主要特点:

  • 数据卷可在容器之间共享或者共用数据
  • 数据卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止
  • 数据卷中的数据不会因为容器的删除而丢失

创建容器数据卷的方式

方式一:直接命令添加

docker run -it -v /宿主机绝对路径目录:/容器中目录 (必须为绝对路径)镜像ID / 镜像名称

先在宿主机创建一个名为:myDatavolumn目录

mkdir myDatavolumn

运行命令:

docker run -it -v /myDatavolumn:/myContainerVolumn --name="mycentos03" centos

这个时候容器会创建一个目录为myContainerVolumn

docker inspect 容器ID 可以查看挂载相关信息

"HostConfig": {
            "Binds": [
                "/Users/xiemingbao/myDatavolumn:/myContainerVolumn"
            ]
}

"Mounts": [
            {
                "Type": "bind",
                "Source": "/Users/xiemingbao/myDatavolumn",
                "Destination": "/myContainerVolumn",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]

HostConfing 的Binds 代表绑定成功了!

RW:true 表示容器有度写的宿主机权限,如果为false表示只有读权限,不能写入任何宿主机权限。

如果需要变false  运行时 宿主机:容器目录:ro        在后面添加 :ro 参数即可

ro:只读

rw:读写

方式二:DockerFile形式添加

  1. 在宿主机目录下面创建mydocker并且进入
  2. 创建一个Dockerfile 文件 并且写入一个VOLUME指令来给镜像添加一个或多个数据卷
  3. Dockerfile的构建
  4. 使用build生成镜像
  5. 运行容器
  6. 使用命令docker inspect 容器ID 查看挂载目录
  7. 测试数据共享以及存储
1、创建目录
mkdir /mydocker

2、进入目录
cd ./mydocker

3、构建Dockerfile文件并且写入VOLUME命令
vim Dockerfile
#volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,------success1"
CMD /bin/bash

命令解释
FROM centos 来源于centos镜像
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] 表示在镜像根目录下面创建两个挂载目录
CMD echo "finished,------success1" 输出成功标识

CMD /bin/bash 执行命令

5、运行build命令、生成新的镜像
docker build -f Dockerfile文件绝对路径()-t 你自定义的镜像名称 . (这个点必然加)
docker build -f /Users/xiemingbao/mydocker/Dockerfile -t ymb/centos .

6、运行容器
docker run -it 你自定义的镜像名称
这会就看到了容器里面存在两个挂载目录了

7、查看宿主机对于目录默认地址
docker inspect 容器ID
如下图红色标记路径

Dockerfile默认挂载到宿主机的目录 

容器数据卷的挂载

  • 匿名挂载(一般不推荐使用)
  • 具名挂载
  • 指定路径挂载

什么是匿名挂载?简单来说没有指定数据卷的名称,随机生成
-v 容器内部挂载路径

docker run -d --name mycentso01 -v /home/mycentosData centos

6f831608233d6883a90f50e0a1ad606b7ed7f987461d1bfb7810685b7f022450

#查看所有的volume 情况 容器数据卷
docker volume ls
iemingbaodeMacBook-Pro:mydocker xiemingbao$ docker volume ls
DRIVER    VOLUME NAME
local     37788a68709ab78f424d01bcfdc53f0d20ef3c318e0481557fcad9eebe4ff86e
local     3113118ccc23304ec7de0d4e224bd0566591cd01aaaa507431d5372f247f7f34
local     a1976b49640e2d67eadfd306aba8b52588cd98455b70ba3ef526fcdff6c1b76e
local     b442e19b567efc623dad2f30fb7b3867a05117cf3a06071ae3980ae2ab17e1dd

这些都是匿名挂载(没有具体名字的)

查看挂载目录所在
docker volume inspect (VOLUME NAME)
docker volume inspect 37788a68709ab78f424d01bcfdc53f0d20ef3c318e0481557fcad9eebe4ff86e

[
    {
        "CreatedAt": "2021-07-20T15:58:02Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/ff4f13aeace03b67e45283cd9caad7d1c0b6352a7ef7d84dcb241d47d4ff1e09/_data",
        "Name": "ff4f13aeace03b67e45283cd9caad7d1c0b6352a7ef7d84dcb241d47d4ff1e09",
        "Options": null,
        "Scope": "local"
    }
]

什么是具明挂载?起了具体名字的
-v 数据卷名称:容器内部挂载路径

运行容器:
docker run -d -P --name nginx02 -v kerry-juming:/etc/nginx nginx

查看所有数据卷
docker volume ls
DRIVER    VOLUME NAME
local     37788a68709ab78f424d01bcfdc53f0d20ef3c318e0481557fcad9eebe4ff86e
local     ff4f13aeace03b67e45283cd9caad7d1c0b6352a7ef7d84dcb241d47d4ff1e09
local     ymb-juming  #这就是具名挂载

 由此可见,所有的docker容器内的数据卷,没有指定挂载目录的情况下都是在/var/lib/docker/volumes/xxxx/_data

什么是指定路径挂载?指定宿主机的挂载目录

-v /宿主机路名:/容器内部挂载路径

docker run -d --name zhiding -v /home/mydocker/zhidingData:/home/centos centos /bin/sh -c "while true;do echo hello ymb;done"

查看容器结构
docker inspect 容器ID

         "Mounts": [
            {
                "Type": "bind",
                "Source": "/Users/xiemingbao/mydocker/zhidingData",
                "Destination": "/home/centos",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

由于是宿主机指定了目录挂载,所以查看所有的容器卷是不显示的。因为显示的都是没有指定宿主机挂载目录,默认在/var/lib/docekr/volumes/ 路径生成
docker volume ls


总结:
-v 容器内路径 #匿名挂载

-v 卷名:容器内路径 #具名挂载

-v /宿主机路径:/容器内目录路径 #指定路径挂载

大多数情况下使用后面的两种

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值