Docker 存储与数据共享

Docker 存储与数据共享

一、Docker存储基础

1、Docker镜像分层结构
  • 容器由可读写的容器层 和多个只读的镜像层组成
  • 写时复制(Copy-on-Write) 机制:
    • 新数据写入容器层
    • 修改数据时,先从镜像层复制到容器层再修改
    • 多层镜像中同名文件,容器中只显示最上层内容
2、联合挂载技术(Union Mount)
  • 镜像层存储在 /var/lib/docker/<storage-driver>/
  • 常用存储驱动:AUFS(Ubuntu)、OverlayFS(CentOS 7.1+)
  • OverlayFS 是一种堆叠文件系统,不直接管理磁盘,而是合并多个目录
  • Overlay2 是 Overlay 的改进版,inode 利用率更高
  • 要求:Docker 17.06.02+,宿主机文件系统为 ext4 或 xfs

二、数据卷(Volume)类型

1、Bind Mounts(绑定挂载)
  • 特点
    • 手动指定宿主机路径与容器路径的映射
    • 支持文件和目录
    • 可设置读写权限(默认读写,可设为只读 :ro
  • 优点:灵活,可直接操作宿主机文件
  • 缺点:依赖宿主机路径,移植性差
bash 复制代码
[root@docker ~]# mkdir /html
[root@docker ~]# echo 123 > /html/index.html
[root@docker ~]# docker run --name test1 -itd -p 80:80 -v /html:/usr/share/nginx/html nginx:latest 
[root@docker ~]# curl http://127.0.0.1
bash 复制代码
[root@docker ~]# docker run --name test1 -itd -p 80:80 -v /html:/usr/share/nginx/html:ro nginx:latest
# 指定权限为只读
2、Docker Managed Volume(Docker管理卷)
  • 特点
    • Docker自动管理卷路径(默认在 /var/lib/docker/volumes/...
    • 容器启动时若目录不为空,会将其内容复制到卷中
    • 支持 CLI 和 API 管理
  • 优点
    • 移植性强
    • 支持备份、迁移、多容器共享、加密等
bash 复制代码
[root@docker ~]# docker run --name test2 -itd -p 80:80 -v /usr/share/nginx/html nginx:latest
[root@docker ~]# docker volume create wiltjer
[root@docker ~]# docker run --name test3 -itd -p 81:81 -v wiltjer:/usr/share/nginx/html nginx:latest

三、Volume 类型对比

特性 Bind Mounts Docker Managed Volume
路径指定 手动指定任意路径 自动在 /var/lib/docker/volumes/
对已有内容影响 隐藏并替换容器中原有内容 将容器中原有内容复制到卷
支持单个文件 支持 不支持
权限控制 支持只读(:ro 默认读写,无法控制
移植性 差,依赖宿主机路径 强,不依赖具体路径

四、容器间数据共享

1、共享同一个 Volume
  • 多个容器挂载同一个宿主机路径或 Docker 卷
bash 复制代码
[root@docker ~]# docker run --name apache1 -itd -p 8081:80 -v /html:/usr/share/nginx/html nginx:latest 
[root@docker ~]# docker run --name apache2 -itd -p 8082:80 -v /html:/usr/share/nginx/html nginx:latest 
[root@docker ~]# docker run --name apache3 -itd -p 8083:80 -v /html:/usr/share/nginx/html nginx:latest
2、Volume Container(数据卷容器)
  • 创建一个专门提供卷的容器,其他容器通过 --volumes-from 共享
bash 复制代码
[root@docker ~]# docker create --name data -v /html:/usr/share/nginx/html busybox:latest
[root@docker ~]# docker run --name nginx1 -itd -p 8081:80 --volumes-from data nginx:latest 
[root@docker ~]# docker run --name nginx2 -itd -p 8082:80 --volumes-from data nginx:latest 
[root@docker ~]# docker run --name nginx3 -itd -p 8083:80 --volumes-from data nginx:latest
3、Data-Packed Volume Container(数据打包卷容器)
  • 将数据打包到镜像中,再通过卷共享,实现完全自包含
bash 复制代码
[root@docker ~]# vim Dockerfile
dockerfile 复制代码
FROM busybox:latest
ADD html /usr/share/nginx/html
VOLUME /usr/share/nginx/html
CMD ["/bin/bash"]
bash 复制代码
[root@docker ~]# docker build -t mydata .
[root@docker ~]# docker create --name mydatac mydata
[root@docker ~]# docker run --name mynginx -itd -p 8088:80 --volumes-from mydatac nginx:latest

五、总结

  • Volume 类型:Bind Mounts 和 Docker Managed Volume
  • 数据共享方式
    • 共享同一 Volume
    • Volume Container
    • Data-Packed Volume Container(最适合静态数据、配置等)
  • 持久化方式 :使用 -v--mount 挂载卷,实现容器数据的持久存储与共享
相关推荐
Leinwin8 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382508 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇8 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7598 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣9 小时前
智能体选型实战指南
运维·人工智能
yy55279 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ10 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔11 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密11 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi201511 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑