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
这样就实现了多个容器共享同个数据。
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
# 注意:提供数据共享的这个容器是可以不需要运行的,因此只需创建即可
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
这有什么好处?其实对于多个容器共享数据(或数据持久化时),在运行容器时不需要指定 Host 的共享目录,而只需指定提供共享数据的容器的容器名即可,这样的话更便于管理。
还有这样一种场景,如果我需要做容器应用数据迁移(如将容器 web-1 从主机 A 迁移至主机 B),对于以上的数据共享策略来说,还没真正实现数据随容器的迁移而迁移,于是我们可以将数据直接持久化到某个镜像中,这样在做数据迁移的时候就会随镜像的迁移而迁移,而这类方法只适用于数据存储较小或数据改动不是很大容器服务(如配置文件、静态文件等)。要实现这样的功能,就需要我们制作自定义镜像(如 Dockerfile),将数据 copy 到镜像中。
5、创建 Dockerfile
mkdir /root/dockerfile && cd /root/dockerfile
touch web.conf
vim Dockerfile
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
运行的 web 容器能正确读取 共享容器 volume 中数据,我们可看到,创建的共享容器不依赖于 Host 提供的数据,真正实现了 docker 容器服务的迁移即应用,只需要迁移目标提供 docker 环境即可。文章来源:https://www.toymoban.com/news/detail-427984.html
二、小结
Docker 容器共享可实现容器与 Host 间共享、容器与容器间共享,其中共享 Host 数据的情况用的比较多,容器间共享也有在使用,如一些数据变动较小的容器服务,就可以采用容器间数据共享。文章来源地址https://www.toymoban.com/news/detail-427984.html
到了这里,关于Docker 容器文件(数据)共享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!