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

2、将容器数据复制到 Host

docker cp my-web:/etc/nginx/nginx.conf .

# 这样就将nginx容器的配置文件复制到Host的当前目录下

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

# 在Host上创建一个测试文件
touch web.conf

# 将创建的文件copy到容器内部
docker cp web.conf my-web:/etc/nginx/conf.d/

这样就实现了容器与 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

# 我就以一个目录为共享数据

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数据(目录或文件)

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

image-20220908115951256

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

1.2.2 volume container

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

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

mkdir -p /root/conf.d
touch /root/conf.d/web.conf

# 我就以一个目录为共享数据

2、运行共享容器

docker create --name=share_data -v /root/conf.d:/etc/nginx/conf.d busybox

# 注意:提供数据共享的这个容器是可以不需要运行的,因此只需创建即可

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

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

image-20220908124816867

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

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

5、创建 Dockerfile

mkdir /root/dockerfile && cd /root/dockerfile
touch web.conf
vim Dockerfile

image-20220908131305346

6、构建镜像

docker build -t share:v1 .

7、创建共享容器

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

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

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

image-20220908131129793

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

二、小结

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云计算-Security

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值