Docker容器数据卷

本文最后更新于 2024年11月21日

1.容器数据卷

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统(不属于容器内),因此能够绕过联合文件系统,提供一些用于持续存储或共享数据的特性。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时,删除其挂载的容器卷。

简而言之就是将docker容器内的数据保存进宿主机的磁盘中,并可以实现主机写,容器知道。容器写,主机知道,互通有无,互读互写。

特点:

  1. 容器卷可以在容器之间共享或重用数据。
  2. 卷中的更改可以实时生效。
  3. 数据卷中的更改不会包含在容器的更新中。
  4. 数据卷的生命周期一直到没有容器使用它为止。

2.数据卷的使用

1.添加数据卷

命令

docker run -it -v /宿主机内绝对路径:/容器内目录 镜像名(默认可读可写)

可以绑定挂载多个,就像一台电脑可以连接多个U盘

docker run -it \
-v /宿主机内绝对路径:/容器内目录  \
-v /宿主机内绝对路径:/容器内目录  \
image

如果提示Permission denied错误,追加--privileged=true在后面即可

原因:CentOS7的安全模块会比之前版本的系统有所增强,不安全的会先禁止,所以目录挂载的情况被默认为是不安全的行为,在SELinux里面挂载目录被禁止了,如果要开启,一般用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,使用该参数,容器内才真正拥有root权限,否则,容器内的root只是外部的一个普通用户权限。

docker run -it --privileged=true -v /宿主机内绝对路径:/容器内目录 镜像名

2.查看是否关联成功

docker inspect 容器ID

会以json串形式打印显示所有容器内细节,找到Mounts节点了解容器数据卷的挂载情况。

"Mounts": [
    {
        "Type": "volume",
        "Name": "portainer_data",
        "Source": "/var/lib/docker/volumes/portainer_data/_data",
        "Destination": "/data",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": ""
    },
    {
        "Type": "bind",
        "Source": "/var/run/docker.sock",
        "Destination": "/var/run/docker.sock",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

3.限制只读

默认情况数据卷是可读可写的,但是有时出于对数据的保护,需要容器内只能读不能写,如果宿主机写入了内容,会同步给容器,只会限制容器,不限制宿主机,容器内强行写,会报错Read-Only file system

做法: 命令上追加 ro : read only

docker run -it --privileged=true -v /宿主机内绝对路径:/容器内目录:ro 镜像名

3.数据卷的继承和共享

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,称为数据卷容器。

数据卷的生命周期一直到没有容器使用为止,挂载数据卷后被继承的父容器,即使被停止,继承的子容器也会保持数据卷和宿主机的关联,也就是说子容器只是继承了父容器文件映射的规则而已。

docker run -it --name 容器名 --volumes-from 父容器名 镜像

Docker容器数据卷
https://blog.liuzijian.com/post/a519bc37-7ea5-445f-80ed-f81c8259413d.html
作者
Liu Zijian
发布于
2023年9月4日
更新于
2024年11月21日
许可协议