首页 > 技术文章 > Docker 容器数据卷

Y-wee 2021-03-10 14:08 原文

Docker 容器数据卷

docker 容器数据卷有点类似我们 Redis 里面的 rdb 和 aof 文件,可以实现数据的持久化和同步操作,容器间也可以实现数据共享

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

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

docker 容器数据卷特点:

  • 数据卷可在容器之间共享或重用
  • 数据卷中的更改可以直接实时生效(容器停止也不影响)
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

宿主机和容器之间实现数据卷挂载

命令

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

docker 挂载主机目录访问如果出现 cannot open directory.:Permission denied,解决办法:挂载目录时加上 --privileged=true 参数;原因:如果是Centos7,安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为是不安全的行为,在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用 --privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则container内的root只是外部的一个普通用户权限

以上挂载命令默认是可读可写的,等同于以下命令:

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

如果要限制容器内容数据卷只能读不能写,则通过以下命令挂载:

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

案例

# 挂载目录
docker run -it --privileged=true -v /home/user01/data/docker/ubuntu:/temp ubuntu
# 挂载目录后查看容器元数据信息,在Mounts块中可以看到挂载信息,eg:
"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/user01/data/docker/ubuntu",
                "Destination": "/temp",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

容器数据卷的继承和共享

# 启动一个容器并继承父容器的数据卷挂载规则
docker run -it --privileged=true --volumes-from 父容器id 镜像名

这样宿主机的一个目录就相当于挂载了多个容器数据卷

推荐阅读