Docker存储:host内Docker存储(docker数据卷:bind mount 和 docker managed volume);容器与 host 共享数据;容器之间共享数据;volume备份、恢复、迁移、销毁;跨主机docker存储;docker cp 命令
单host内Docker存储

Docker storage driver(非持久化数据)和Data Volume(持久化数据) ======================================================================================== Docker 为容器提供了两种存放数据的资源: 1.由 storage driver 管理的镜像层和容器层。 2.Data Volume。 --------------------------------------------------------------------------------------- Docker storage driver (不需要持久化的数据可以放在镜像层和容器层,由storage driver直接管理) docker镜像分层结构意味着数据可能出现在任意一层,多层之间可能存在重复的数据。docker使用storage driver进行镜像层和容器层的数据管理。 Docker 镜像的分层结构:容器由最上面一个可写的容器层,以及若干只读的镜像层组成,容器的数据就存放在这些层中。这样的分层结构最大的特性是 Copy-on-Write: 1.新数据会直接存放在最上面的容器层。 2.修改现有数据会先从镜像层将数据复制到容器层,修改后的数据直接保存在容器层中,镜像层保持不变。 3.如果多个层中有命名相同的文件,用户只能看到最上面那层中的文件。 Docker 支持多种 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它们都能实现分层的架构,同时又有各自的特性。 优先使用 Linux 发行版默认的 storage driver。 Docker 安装时会根据当前系统的配置选择默认的 driver。默认 driver 具有最好的稳定性 docker info #可以查看当前的 storage driver --------------------------------------------------------------------------------------- Data Volume(持久化数据使用Data Volume进行保存) Data Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中。 Data Volume 有以下特点: 1.Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。 2.容器可以读写 volume 中的数据。 3.volume 数据可以被永久的保存,即使使用它的容器已经销毁。
volume 的容量:volume 实际上是 docker host 文件系统的一部分,所以 volume 的容量取决于文件系统当前未使用的空间,目前还没有方法设置 volume 的容量。

bind mount 和 docker managed volume ================================================================================================ docker 提供了两种类型的 volume:bind mount 和 docker managed volume。 其实都是将host文件/目录 与容器的文件/目录 进行关联。 --volume/-v参数 ------------------------------------------------------ bind mount 对比 docker managed volume 1.run容器使用--volume/-v参数时,有所不同 -v <host path>:<container path> ###bind mount -v <container path> ###docker managed volume,自动在host的指定目录下生成相应的文件/目录 2.复制的文件有所不同 bind mount是将host文件 mount 到容器内 docker managed volume是将容器文件复制到host中,同时建立mount联系。 ------------------------------------------------------ bind mount: 将 host 上已存在的目录或文件 mount 到容器。 -v <host path>:<container path> #默认可读可写 1.以host文件/目录为主,将host文件/目录mount到容器内,若容器内有相同的文件/目录,则隐藏原容器内的文件; 2.删除容器时,host文件/目录不受影响; 3.可以指定数据的读写权限,默认是可读可写,可以指定为只读; -v <host path>:<container path>:ro #ro为只读,这种情况下只有在host才能修改文件,增加了安全性 4.host path 既可以是目录,也可以是单个文件; 5.使用单一文件有一点要注意:host 中的源文件必须要存在,不然会当作一个新目录 bind mount 给容器。 6.不足:bind mount 需要指定 host 文件系统的特定路径,这就限制了容器的可移植性,当需要将容器迁移到其他 host,而该 host 没有要 mount 的数据或者数据不在相同的路径时,操作会失败。 ------------------------------------------------------ docker managed volume -v <container path> #自动在host的指定目录下生成相应的文件/目录,docker inspect <container> 可以看到相关host文件/目录信息

容器与 host 共享数据;容器之间共享数据 ====================================================================================== 容器与 host 共享数据: 使用bind mount、docker managed volume -------------------------------------------------------------------------------------- 容器之间共享数据: 核心思路就是使多个容器配置相同的bind mount或docker managed volume 方法1: 每个容器run时,使用bind mount 方法2:借助volume container;run容器时使用--volumes-from 方法3:data-packed volume container:原理是将数据打包到镜像中,然后通过 docker managed volume 共享。 容器之间共享数据方法1: docker run --name web1 -d -p 8080:80 /httpd_dir:/usr/local/httpd_dir httpd docker run --name web2 -d -p 8080:80 /httpd_dir:/usr/local/httpd_dir httpd docker run --name web3 -d -p 8080:80 /httpd_dir:/usr/local/httpd_dir httpd 容器之间共享数据方法2:借助volume container volume container 是专门为其他容器提供 volume 的容器。它提供的卷可以是 bind mount,也可以是 docker managed volume。 docker create --name vc_data -v ~/htdocs:/usr/local/apache2/htdocs -v /other/useful/tools busybox #创建volume container,因为该容器不需要运行,所以可以使用create docker run --name web1 -d -p 8080:80 --volumes-from vc_data httpd docker run --name web2 -d -p 8080:80 --volumes-from vc_data httpd docker run --name web3 -d -p 8080:80 --volumes-from vc_data httpd docker inspect <container> volume container 的特点: 1.与 bind mount 相比,不必为每一个容器指定 host path,所有 path 都在 volume container 中定义好了,容器只需与 volume container 关联,实现了容器与 host 的解耦。 2.使用 volume container 的容器其 mount point 是一致的,有利于配置的规范和标准化,但也带来一定的局限,使用时需要综合考虑。 容器之间共享数据方法3:data-packed volume container 在Dockerfile文件中使用VOLUME,所以build镜像过程中,将目录mount到一个随机的目录下。此后用该镜像run容器时,都会使用该随机目录进行数据卷挂载;同时run容器也无需指定-v data-packed volume container 是自包含的,不依赖 host 提供数据,具有很强的移植性,非常适合 只使用 静态数据的场景,比如应用的配置信息、web server 的静态文件等。

volume 生命周期管理:备份、恢复、迁移、销毁 ========================================================================================== 备份: volume 实际上是 host 文件系统中的目录和文件,所以 volume 的备份实际上是对文件系统的备份。 就是在host上对相应的文件做备份 恢复: 直接使用之前备份的数据,进行恢复即可。 迁移: 如果我们想使用更新版本的 Registry,这就涉及到数据迁移,方法是: 1.docker stop 当前 Registry 容器。 2.启动新版本容器并 mount 原有 volume。 docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:latest 销毁: 1.docker 不会销毁 bind mount,删除数据的工作只能由 host 负责。 2.对于 docker managed volume,在执行 docker rm 删除容器时可以带上 -v 参数,docker 会将容器使用到的 volume 一并删除,但前提是没有其他容器 mount 该 volume,目的是保护数据,非常合理。 3.docker managed volume,删除容器时没有携带-v,volume就会被保留下来,成为孤儿volume docker volume ls docker volume rm xxxx docker volume rm $(docker volume ls -q) #批量删除孤儿 volume

挂载数据卷及示例(原总结内容) ===================================================================================== 挂载数据卷:挂载只是同步关系,并不是依赖关系;即有一方被删了,只是影响了同步,并不会导致对方不可用 挂载有2种方式 1.docker run时,使用-v,有3种形式:匿名挂载、具名挂载、指定路径挂载 这种挂载相当于手动挂载 2.dockerfile中填写 VOLUME ["volume01","volume02"] #即在dockerfile中设置了数据卷,这种算是匿名挂载的方式 docker build fockerfile #使用上面的dockerfile构建镜像 docker run时,使用--volumes-from #将2个容器进行关联 我的理解:dockerfile中填写了VOLUME,使用该dockerfile构建了镜像;那么该镜像的容器具有自动挂载的特性,VOLUME的数据卷自动以匿名的方式挂载 还是在docker run时,还可以使用--volumes-from进行容器间的挂载,被挂载的称为数据卷容器:docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7 --------------- -v有三种挂载: 匿名挂载、具名挂载、指定路径挂载 -v 容器内路径 #匿名挂载 -v 卷名:容器内路径 #具名挂载 -v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的 docker run -d -P --name nginx01 -v /etc/nginx nginx #匿名挂载 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx #具名挂载,这个具名挂载只是设置了文件名,但是未设置文件路径;这个和上面的方式一稍微有点区别 docker volume ls #查看当前设备的具名挂载,可以查到juming-nginx;如果在启动新容器时,指定了挂载路径,那么该命令将会查不到信息 docker volume inspect juming-nginx #查看具名挂载juming-nginx的信息 -v和--volumes-from应该还是有些许不同的,比如我目前见过的使用方式:-v后面跟的是路径名称,而--volumes-from后面却跟的是容器name
docker volume 命令
docker volume 只能查看 docker managed volume,还看不到 bind mount;同时也无法知道 volume 对应的容器,这些信息还得靠docker inspect。
docker volume ls
docker volume inspect <container>
跨主机docker存储

volume driver : 跨 Docker 主机管理 data volume 任何一个 data volume 都是由 driver 管理的,创建 volume 时如果不特别指定,将使用 local 类型的 driver,即从 Docker Host 的本地目录中分配存储空间。如果要支持跨主机的 volume,则需要使用第三方 driver。 目前已经有很多可用的 driver,我们这里将选择 Rex-Ray driver,其原因是: 1.Rex-Ray 是开源的,而且社区活跃。 2.支持多种 backend,VirtualBox 的 Virtual Media、Amazon EBS、Ceph RBD、OpenStack Cinder 等。 3.支持多种操作系统,Ubuntu、CentOS、RHEL 和 CoreOS。 4.支持多种容器编排引擎,Docker Swarm、Kubernetes 和 Mesos。 5.Rex-Ray 安装使用方法非常简单。
073 - 如何实现跨 Docker 主机存储?
074 - 如何安装和配置 Rex-Ray?
075 - 配置 VirtualBox backend
076 - 使用 Rex-Ray volume
077 - 跨主机使用 Rex-Ray volume

docker cp 命令 ================================================================= docker cp 容器ID:文件路径 目的文件夹路径 docker cp 822c9fc1c499:/var/www/html/api/ /api docker cp 上传的文件夹路径 容器ID:文件路径 docker cp /api 822c9fc1c499:/var/www/html/api/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!