Docker Compose 中多容器共享文件的实现方式
介绍
在 Docker Compose 环境中,一般情况下都会运行多个容器并以某种方式进行交互。其中一个常见的需求就是多个容器需要共享同一个文件或文件夹。针对这种情况,我们可以采用 Docker Compose 提供的一些方式来实现容器间的文件共享,本文将会实现以下两种方式:
- 使用 Docker Compose 的 volume,将文件挂载到多个容器中
- 在一个容器中运行 Samba 服务,其它容器可以访问共享文件
实现
使用 Docker Compose 的 volume
我们首先来看一下如何使用 Docker Compose 的 volume 实现文件在多个容器中的共享。
Docker Compose 的 volume 可以将文件或者文件夹挂载到容器内,使得容器内部的变化会同步到挂载的文件或者文件夹中,而外部修改则也同样会同步到容器内部。创建一个在多个容器中共享文件的 volume,只需要在 Docker Compose 文件中定义一个 volume,再在需要使用共享文件的容器中挂载该 volume 即可。
下面是一个简单的 Docker Compose 文件示例:
version: '3.7' services: app: image: my-app volumes: - shared-data:/app/data db: image: mysql volumes: - shared-data:/var/lib/mysql volumes: shared-data:
在上面的示例中,我们定义了两个服务:app 和 db,它们都使用了共享文件的 volume,该 volume 的名称为 shared-data,在 app 服务中挂载到了 /app/data 目录下,在 db 服务中挂载到了 /var/lib/mysql 目录下。这样,当在 app 服务中操作 /app/data 目录时,对应主机上的 shared-data 目录也会发生变化,同样,对 shared-data 目录的任何修改也会同步到 app 服务和 db 服务的挂载目录中。
需要注意的是,当没有指定本地主机路径时,Docker Compose 默认会在其工作目录下创建一个 volume,其名称通过 volume 定义中的名称来决定。在上面的示例中,我们没有指定 shared-data 的本地路径,因此 Docker Compose 会在工作目录下创建一个名为 shared-data 的 volume。
在一个容器中运行 Samba 服务,其它容器可以访问共享文件
除了使用 Docker Compose 的 volume 实现容器间共享文件,我们还可以在一个容器中运行一个 Samba 服务,并开放共享目录使得其它容器可以访问共享文件。
Samba 是一个开源的文件共享服务,它可以将 Linux 机器上的文件、目录以及打印机与 Windows 客户端共享。运行 Samba 服务前,我们需要在 Dockerfile 中进行相应配置:
FROM ubuntu:latest
安装 Samba
RUN apt-get update && apt-get install -y samba
添加 Samba 用户
RUN useradd -m samba RUN echo 'samba:password' | chpasswd RUN chsh -s /bin/bash samba
创建共享目录
RUN mkdir -p /shared-folder RUN chown -R samba:samba /shared-folder
配置 Samba
RUN echo "[shared]" >>/etc/samba/smb.conf RUN echo "path = /shared-folder" >>/etc/samba/smb.conf RUN echo "writable = yes" >>/etc/samba/smb.conf RUN echo "public = yes" >>/etc/samba/smb.conf RUN echo "guest ok = yes" >>/etc/samba/smb.conf RUN echo "create mask = 0644" >>/etc/samba/smb.conf
EXPOSE 445/tcp
CMD /etc/init.d/smbd start && tail -F /var/log/samba/log.smbd
在上面的 Dockerfile 中,我们通过 apt-get 安装了 Samba,然后创建了一个名为 samba 的用户,并添加了一个共享目录 /shared-folder。接下来,我们在 Samba 的配置文件 /etc/samba/smb.conf 中添加了共享配置,并只允许访问,但不要求密码认证。最后,我们在 CMD 中启动了 Samba 服务并输出运行日志。
我们还需要创建一个 Docker Compose 文件,用于启动所有容器、挂载共享目录,并将其暴露出去:
version: '3.7' services: app: image: my-app depends_on: - samba volumes: - smb:/shared-folder:ro db: image: mysql samba: build: context: . dockerfile: Dockerfile-samba volumes: - smb:/shared-folder ports: - "445:445" volumes: smb:
在上面的示例中,我们定义了三个服务:app、db 和 samba。其中 samba 服务使用了上面的 Dockerfile 进行构建,并将挂载共享目录 /shared-folder。app 服务则通过将 smb 卷挂载到 /shared-folder 目录来访问共享文件,它还定义了 depends_on 选项来确保 samba 服务在 app 服务之前启动,以便挂载共享文件。因为 samba 服务需要监听 445 端口,我们在该服务的端口映射中开放了 445 端口。
在以上示例中,我们使用了 ro 选项以只读方式挂载共享目录。在其他情况下,我们可能还需要使用 uid 和 gid 选项来确保共享目录中的权限和容器内部的权限一致。
总结
本文介绍了 Docker Compose 中多容器共享文件的两种实现方式:使用 Docker Compose 的 volume,将文件挂载到多个容器中,以及在一个容器中运行 Samba 服务,其它容器可以访问共享文件。这些实现方式可以广泛应用于 Docker Compose 的多容器环境,帮助我们更好地满足共享文件的需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6497a32c48841e98944a12f9