• Docker 容器文件(数据)共享


    image-20220908134844265

    Author:rab



    前言

    有这样一个场景,当我们的服务都是通过容器化方式时,不仅要考虑数据持久化的问题,在 web 集群的时候也要考虑到数据共享的问题,如我需要负载均衡多个 web 服务(这些 web 主要是作为前端展示),且这些 web 服务的功能完全一致,那这时就可用到我们的文件共享技术了。而文件共享又分为两种情况:容器与 Host 共享容器间数据共享,接下来分别介绍以下这两种文件(数据)共享方式。

    一、共享

    1.1 容器与 Host 共享

    对于容器与 Host 共享间进行数据共享也是比较常用的,比如,当我们运行某个容器的时候,我们需要获取到该容器的配置文件(实现动态配置和持久化),我们一般的做法就是去该服务的官网去下载配置文件或 copy 容器中的配置文件到 Host(其实这就实现了文档的共享了)。

    以 Nginx 为例,看看容器的文件如何共享到 Host 上。

    1、先运行一个 nginx 容器

    docker run -itd --name=my-web nginx:1.20.2
    
    • 1

    2、将容器数据复制到 Host

    docker cp my-web:/etc/nginx/nginx.conf .
    
    # 这样就将nginx容器的配置文件复制到Host的当前目录下
    
    • 1
    • 2
    • 3

    3、将 Host 的数据复制到容器内部

    # 在Host上创建一个测试文件
    touch web.conf
    
    # 将创建的文件copy到容器内部
    docker cp web.conf my-web:/etc/nginx/conf.d/
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这样就实现了容器与 Host 间的数据共享了,准确说不叫共享,应该叫做容器和 Host 之间可以互相传输文件或实现 Docker 容器的持久化存储。

    1.2 容器间共享

    1.2.1 bind mount

    这种共享方式是多个容器共享 Host 上的数据,即将共享数据放在 bind mount 中,然后将其 mount 到多个容器中,我们以 nginx 容器为例进行演示。

    1、创建共享数据(目录或文件)

    mkdir -p /data/web/conf.d
    touch /data/web/conf.d/web.conf
    
    # 我就以一个目录为共享数据
    
    • 1
    • 2
    • 3
    • 4

    2、运行 nginx 容器(并将共享数据 mount 到容器中)

    docker run -itd --name=web-1 -v /data/web/conf.d:/etc/nginx/conf.d nginx:1.20.2
    docker run -itd --name=web-2 -v /data/web/conf.d:/etc/nginx/conf.d nginx:1.20.2
    
    # 运行两个容器,且这两个容器共享同一个Host数据(目录或文件)
    
    • 1
    • 2
    • 3
    • 4

    3、验证数据是否 mount 到容器中

    [root@shop ~]# docker exec -it web-1 bash
    root@5d3c487a409a:/# ls /etc/nginx/conf.d/
    web.conf
    root@5d3c487a409a:/# exit
    exit
    [root@shop ~]# docker exec -it web-2 bash
    root@fdbb7e98d971:/# ls /etc/nginx/conf.d/
    web.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20220908115951256

    这样就实现了多个容器共享同个数据。

    1.2.2 volume container

    上面是多个容器共享 Host 里面的数据(目录或文件),而这个方式共享则是多个容器共享同个容器中的数据卷(该数据卷类型可以是 bind mount,也可以是 managed volume)。

    1、创建共享容器的数据卷

    mkdir -p /root/conf.d
    touch /root/conf.d/web.conf
    
    # 我就以一个目录为共享数据
    
    • 1
    • 2
    • 3
    • 4

    2、运行共享容器

    docker create --name=share_data -v /root/conf.d:/etc/nginx/conf.d busybox
    
    # 注意:提供数据共享的这个容器是可以不需要运行的,因此只需创建即可
    
    • 1
    • 2
    • 3

    image-20220908124543366

    3、其他容器共享刚创建的容器数据卷

    docker run -itd --name=web-1 --volumes-from share_data nginx:1.20.2
    docker run -itd --name=web-2 --volumes-from share_data nginx:1.20.2
    
    • 1
    • 2

    4、验证数据是否被共享

    [root@shop ~]# docker exec -it web-1 bash
    root@5daf7ba565cd:/# ls /etc/nginx/conf.d/
    web.conf
    root@5daf7ba565cd:/# exit
    exit
    [root@shop ~]# docker exec -it web-2 bash
    root@5510e1b6b4cb:/# ls /etc/nginx/conf.d/
    web.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20220908124816867

    这有什么好处?其实对于多个容器共享数据(或数据持久化时),在运行容器时不需要指定 Host 的共享目录,而只需指定提供共享数据的容器的容器名即可,这样的话更便于管理。

    还有这样一种场景,如果我需要做容器应用数据迁移(如将容器 web-1 从主机 A 迁移至主机 B),对于以上的数据共享策略来说,还没真正实现数据随容器的迁移而迁移,于是我们可以将数据直接持久化到某个镜像中,这样在做数据迁移的时候就会随镜像的迁移而迁移,而这类方法只适用于数据存储较小或数据改动不是很大容器服务(如配置文件、静态文件等)。要实现这样的功能,就需要我们制作自定义镜像(如 Dockerfile),将数据 copy 到镜像中。

    5、创建 Dockerfile

    mkdir /root/dockerfile && cd /root/dockerfile
    touch web.conf
    vim Dockerfile
    
    • 1
    • 2
    • 3

    image-20220908131305346

    6、构建镜像

    docker build -t share:v1 .
    
    • 1

    7、创建共享容器

    docker create --name=share_data-1 share:v1
    
    • 1

    8、运行 web 容器并进行数据共享

    docker run -itd --name=web-1 --volumes-from share_data-1 nginx:1.20.2
    docker run -itd --name=web-2 --volumes-from share_data-1 nginx:1.20.2
    
    • 1
    • 2

    9、验证数据是否被共享

    [root@shop dockerfile]# docker exec -it web-1 bash
    root@34a7c0d48078:/# ls /etc/nginx/conf.d/
    web.conf
    root@34a7c0d48078:/# exit
    exit
    [root@shop dockerfile]# docker exec -it web-2 bash
    root@d3a5bcf6b10b:/# ls /etc/nginx/conf.d/
    web.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20220908131129793

    运行的 web 容器能正确读取 共享容器 volume 中数据,我们可看到,创建的共享容器不依赖于 Host 提供的数据,真正实现了 docker 容器服务的迁移即应用,只需要迁移目标提供 docker 环境即可。

    二、小结

    Docker 容器共享可实现容器与 Host 间共享、容器与容器间共享,其中共享 Host 数据的情况用的比较多,容器间共享也有在使用,如一些数据变动较小的容器服务,就可以采用容器间数据共享。

  • 相关阅读:
    Row 28 was cut by GROUP_CONCAT()
    对不起,我错了,这代码不好写
    负载均衡技术全景:理论、实践与案例研究
    十大排序详解
    中小商业银行主动安全纵深防御体系解决方案
    头歌平台-MongoDB 之滴滴、摩拜都在用的索引
    pytorch 使用DataParallel 单机多卡和单卡保存和加载模型的正确方法
    金仓数据库 KingbaseGIS 使用手册(8.1. 支持栅格功能的数据类型)
    JAVA微信小程序图书馆座位预约小程序系统毕业设计 开题报告
    使用Python虚拟环境
  • 原文地址:https://blog.csdn.net/IT_ZRS/article/details/126763116