Docker 数据卷管理及优化

[复制链接]
发表于 2025-10-24 02:26:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Docker 数据卷是一个可供容器利用的特别目次,它绕过了容器的文件体系,直接将数据存储在宿主机上。通过数据卷,可以实现数据的长期化、共享以及独立于容器生命周期的管理。
1.1 为什么要用数据卷

Docker 分层文件体系的特点


  •         性能差:Docker 的分层文件体系(Union File System)在写入操纵时会创建新的层,导致性能降落。
  •         生命周期与容器雷同:容器删除后,其文件体系中的数据也会丢失。
Docker 数据卷的上风


  •         绕开分层文件体系:数据卷直接挂载到宿主机的文件体系中,性能与宿主机磁盘雷同。
  •         数据长期化:纵然容器被删除或重新创建,数据卷中的数据仍旧存在,不会丢失。
  •         数据共享:多个容器可以同时挂载同一个数据卷,实现数据的共享和交互。
  •         独立于容器生命周期:数据卷的生命周期独立于容器,不受容器的启动、克制和删除的影响。
Docker 提供了两种卷范例:

  •         Bind Mount:将主机上的目次或文件挂载到容器中。
  •         Docker Managed Volume:由 Docker 主动管理的数据卷,不须要指定挂载源。
1.2 Bind Mount 数据卷

特点


  •         将主机上的目次或文件挂载到容器中。
  •         利用直观高效,易于明确。
  •         利用 -v 选项指定路径,格式为 <host path>:<container path>。
  •         如果 -v 选项指定的路径不存在,挂载时会主动创建。
注意事项

1. “如果挂载的路径在宿主机上不存在,Docker 会主动创建该路径。”

这句话的意思是:当你利用绑定挂载(bind mount)时,如果宿主机上的目次路径不存在,Docker 会主动创建这个目次。
举例分析:

假设你运行以下下令:
  1. docker run -d --name my_container -v /haha/test:/container/path nginx:1.23
复制代码

  •         如果宿主机上 /haha/test 目次不存在,Docker 会主动创建 /haha/test 目次。
  •         这个举动是为了确保挂载操纵可以或许乐成实行,由于挂载须要一个有效的宿主机路径。

2. “如果须要挂载的文件或目次在宿主机上不存在,大概会导致容器启动失败。”

这句话的意思是:如果你实行挂载一个文件,而这个文件在宿主机上不存在,Docker 会报错并导致容器启动失败。
举例分析:

假设你运行以下下令:
  1. docker run -d --name my_container -v /haha/test/file.txt:/container/file.txt nginx:1.23
复制代码

  •         如果宿主机上 /haha/test/file.txt 文件不存在,Docker 会报错,由于 Docker 不会主动创建文件。它只会主动创建目次,而不会创建文件。
  •         错误信息大概雷同于:
            lstat /haha/test/file.txt: no such file or directory
  •         这种情况下,容器无法启动,由于挂载操纵失败了。

总结:(主动创建的是目次,而不是文件)


  •         目次:如果挂载的路径(目次)在宿主机上不存在,Docker 会主动创建该目次。
  •         文件:如果挂载的文件在宿主机上不存在,Docker 不会主动创建文件,而是会报错并大概导致容器启动失败。
1.3 Docker Managed 数据卷

特点


  •         不须要指定挂载源,Docker 主动为容器创建数据卷目次。
  •         默认创建的数据卷目次位于 /var/lib/docker/volumes 中。
  •         如果挂载时指向容器内已有的目次,原有数据会被复制到数据卷中。
示例

1. 不须要指定挂载源,Docker 主动为容器创建数据卷目次

定名卷由 Docker 主动管理,不须要指定宿主机上的路径。当你在运行容器时利用定名卷时,Docker 会主动创建一个卷,并将其挂载到容器内的指定路径。
举例分析:
  1. docker run -d --name my_container -v my_volume:/container/path nginx:1.23
复制代码

  •         在这个例子中,my_volume 是一个定名卷的名称。
  •         Docker 会主动在内部存储中创建一个名为 my_volume 的卷,并将其挂载到容器内的 /container/path。
  •         你不须要指定宿主机上的路径,Docker 会管理这个卷的存储位置。

2. 默认创建的数据卷目次位于 /var/lib/docker/volumes 中

Docker 管理的定名卷默认存储在宿主机的 /var/lib/docker/volumes 目次下。每个定名卷都有一个独立的目次,用于存储数据。
举例分析:

假设你创建了一个名为 my_volume 的定名卷,Docker 会在 /var/lib/docker/volumes 下创建一个对应的目次:
/var/lib/docker/volumes/my_volume/_data

  •         _data 目次是现实存储卷数据的地方。
  •         你可以通过以下下令查察全部定名卷:
    1. docker volume ls
    复制代码
  •         如果须要查察卷的具体存储位置,可以运行:
    1. docker volume inspect my_volume
    复制代码

3. 如果挂载时指向容器内已有的目次,原有数据会被复制到数据卷中

当你将一个定名卷挂载到容器内的某个路径时,如果该路径在容器中已经存在而且包罗数据,Docker 会将这些数据复制到定名卷中。这个过程称为“数据初始化”。
举例分析:

假设你运行以下下令:
  1. docker run -d --name my_container -v my_volume:/container/existing/path nginx:1.23
复制代码

  •         如果 /container/existing/path 在容器中已经存在,而且包罗一些文件或目次,Docker 会在第一次挂载时将这些内容复制到 my_volume 中。
  •         之后,无论何时重新挂载该卷,容器内的 /container/existing/path 都会指向 my_volume,而且数据会保持同等。
注意:


  •         这个数据复制的过程只会在第一次挂载时发生。
  •         如果定名卷已经存在而且包罗数据,Docker 不会覆盖卷中的数据,而是会直接利用卷中的数据。
清算未利用的 Docker 数据卷
  1. [root@docker ~]# docker volume prune
复制代码
注意:

  •         在实行 docker volume prune 下令之前,请确保你确实不再须要这些数据卷中的数据,由于该操纵是不可逆的,一旦删除数据将无法规复。
  •         如果有紧张的数据存储在数据卷中,发起先辈行备份,大概确保数据已经被妥善生存到其他地方。
创建数据卷
  1. [root@docker ~]# docker volume create leevol1
  2. [root@docker ~]# ls -l /var/lib/docker/volumes/leevol1/_data/
复制代码
查察卷
  1. [root@docker ~]#
  2. docker volume lsDRIVER    VOLUME NAMElocal     leevol1
复制代码
利用创建的数据卷
  1. [root@docker _data]# docker run -d --name web1 -p 80:80 -v leevol1:/usr/share/nginx/html nginx
  2. e76706848323d6c329c41c4140903f8cc441458daf1459d9016bd1ed0ab3360a
  3. root@docker _data]# cd /var/lib/docker/volumes/leevol1/_data
  4. [root@docker _data]# ls
  5. [root@docker _data]# echo leevol1 > index.html
  6. [root@docker _data]# curl 172.25.254.100
  7. leevol1
复制代码
1.4 数据卷容器(Data Volume Container)

数据卷容器(Data Volume Container)是 Docker 中一种特别的容器,紧张用于方便地在多个容器之间共享数据卷。
创建数据卷容器
  1. [root@docker ~]# docker run -d --name datavol \
  2. -v /tmp/data1:/data1:rw \
  3. -v /tmp/data2:/data2:ro \
  4. -v /etc/resolv.conf:/etc/hosts busybox
复制代码
利用数据卷容器
  1. [root@docker ~]# docker run -it --name test --rm --volumes-from datavol busybox
  2. / # ls
  3. bin    data1  data2  dev    etc    home   lib    lib64  proc   root   sys    tmp    usr    var
  4. / # cat /etc/resolv.conf
  5. # Generated by Docker Engine.
  6. # This file can be edited; Docker Engine will not make further changes once it
  7. # has been modified.
  8. nameserver 114.114.114.114
  9. search timinglee.org
  10. # Based on host file: '/etc/resolv.conf' (legacy)
  11. # Overrides: []
  12. / # touch data1/leefile1
  13. / # touch /data2/leefile1
  14. touch: /data2/leefile1: Read-only file system
  15. / #
复制代码
数据卷容器的上风


  •         方便共享:通过数据卷容器,可以在多个容器之间轻松共享数据卷。
  •         简化管理:数据卷容器可以会合管理数据卷,便于维护和迁徙。
1.5 Bind Mount 数据卷和 Docker Managed 数据卷的对比

雷同点


  •         两者都是基于宿主机文件体系中的某个路径。
差别点

特性Bind Mount 数据卷Docker Managed 数据卷路径指定必须指定宿主机路径不须要指定宿主机路径,由 Docker 主动管理移植性依赖宿主机路径,移植性较差独立于宿主机路径,移植性较好管理方式须要手动管理宿主机路径由 Docker 主动管理,支持 docker volume 下令性能与宿主机磁盘性能雷同与宿主机磁盘性能雷同实用场景适当须要直接访问宿主机文件的场景适当须要在多个容器之间共享数据的场景1.6 备份与迁徙数据卷

备份数据卷
  1. # 建立容器并指定使用卷到要备份的容器
  2. [root@docker ~]# docker run --volumes-from datavol \
  3. -v `pwd`:/backup busybox \                                        # 把当前目录挂载到容器中用于保存备份数据
  4. tar zcf /backup/data1.tar.gz /data1                # 备份数据到本地
复制代码
数据规复
  1. docker run -it --name test -v leevol1:/data1 -v `pwd`:/backup busybox /bin/sh -c "tar zxf /backup/data1.tar.gz;/bin/sh"
  2. / # ls
  3. backup  data1   etc     lib     proc    sys     usr
  4. bin     dev     home    lib64   root    tmp     var
  5. / # cd data1/                        # 查看数据迁移情况
  6. /data1 # ls
  7. index.html  leefile1
复制代码
注意事项


  •         在备份和规复数据卷时,确保路径准确,克制数据丢失。
  •         如果数据卷较大,备份和规复过程大概须要较长时间,请耐烦期待。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表