Docker 容器文件(数据)共享

本文详细介绍了Docker容器数据共享的三种方式:容器与Host共享、容器间共享(bindmount和volume container)。通过实例展示了如何实现配置文件的共享、容器间的文件同步,以及如何利用数据卷实现容器迁移时的数据伴随迁移。这些方法对于容器化的web服务集群管理和数据持久化具有重要意义。

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 数据的情况用的比较多,容器间共享也有在使用,如一些数据变动较小的容器服务,就可以采用容器间数据共享。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云计算-Security

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

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

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

打赏作者

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

抵扣说明:

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

余额充值