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 数据可以被永久的保存,即使使用它的容器已经销毁。
Docker storage driver(非持久化数据)和Data 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文件/目录信息
bind mount 和 docker managed volume
复制代码

 

复制代码
容器与 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 的静态文件等。
容器与 host 共享数据;容器之间共享数据
复制代码

 

复制代码
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
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 安装使用方法非常简单。
volume driver : 跨 Docker 主机管理 data volume
复制代码

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/
docker cp 命令
复制代码

 

posted @   雲淡風輕333  阅读(155)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 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框架的用法!
点击右上角即可分享
微信分享提示