如何使用 Docker Compose v3 直接挂载 NFS 共享/卷到容器中?


Docker 是一个广泛用于开发和管理容器化应用程序的工具。它使程序员能够将他们的应用程序及其依赖项组合到小型、可移植的容器中,这些容器易于在任何平台上设置和使用。使用 Docker Compose v3 直接在容器内挂载网络文件系统 (NFS) 共享或卷是 Docker 的一项实用功能。

在本文中,我们将探讨如何使用 Docker Compose v3 直接在容器中挂载 NFS 共享或卷。

使用 Docker Compose v3 直接挂载容器中 NFS 共享/卷的方法

以下是一些我们需要理解和学习才能使用 Docker Compose v3 直接挂载容器中 NFS 共享/卷的重要术语和事实:

  • 目标路径 − “target” 键用于指定应在容器内挂载 NFS 共享或卷的位置。可以使用容器内任何您希望挂载卷的目录路径作为此路径。

  • 卷类型 − 使用 “type” 键指示正在挂载的卷类型。对于 NFS 共享或卷,应将类型设置为“volume”。

  • 源路径 − 使用 “source” 键指定主机上 NFS 共享或卷的路径。此处可以使用指向主机系统上 NFS 共享或磁盘的任何目录路径。

  • 卷选项 − “volume” 键可用于指定其他卷选项。其中一个选项是 “nocopy”;可以将其设置为 true 以阻止将卷的内容复制到容器中。这有助于优化最终映像的大小并减少层数。

我们现在将通过一个示例更好地理解和演示这一点。

示例

步骤 1 − 为您的项目创建一个新目录并导航到该目录:

$ mkdir directoryname 
$ cd directoryname

步骤 2 − 在此新目录中创建一个名为 docker-compose.yml 的文件,内容如下:

version: "3" 
services: 
web-server: 
   image: nginx:latest 
   ports: 
      - 80:80 
   volumes: 
      - type: volume 
      source: nfs-volume 
      target: /nfs 
      volume: 
      nocopy: true 
volumes: 
   nfs-volume: 
   driver_opts: 
   type: "nfs" 
   o: "addr=10.40.0.199,nolock,soft,rw" 
   device: ":/var/data"

这指示在文件中使用的 Docker Compose 版本,为服务命名,指定合适的镜像来定义它,在服务下添加一个 volumes 键,并指定卷的类型、源路径和目标路径。此外,它还将 volume 键下的 nocopy 选项设置为 true,以阻止将卷的内容复制到容器中。

步骤 3 − 在同一目录中创建一个 Dockerfile,内容如下:

FROM nginx:latest 
COPY . /usr/share/nginx/html 
EXPOSE 80 
CMD ["nginx", "-g", "daemon off;"]

在此示例中,我们使用 `nginx:latest` 镜像将主机系统上 `/mnt/nfs/share` 中存储的 NFS 共享或卷挂载到容器内的 `/app`。为了防止将卷的内容复制到容器中,将 `nocopy` 选项指定为 `true`。

步骤 4 − 使用 `docker-compose up` 命令启动带有已挂载卷的容器:

docker-compose up

输出

`docker-compose up` 命令的输出应类似于此:

[+] Running 2/2
- Network examp_default Created                                                        0.9s
- Container examp-web-1 Created                                                        0.1s
Attaching to examp-web-1
examp-web-1 | * Serving Flask app 'app'
examp-web-1 | * Debug mode: on
examp-web-1 | WARNING: This is a development server. Do not use it in a production
deployment. Use a production WSGI server instead.
examp-web-1 | * Running on all addresses (0.0.0.0)
examp-web-1 | * Running on http://127.0.0.1:5000
examp-web-1 | * Running on http://172.19.0.2:5000
examp-web-1 | Press CTRL+C to quit
examp-web-1 | * Restarting with stat 
examp-web-1 | * Debugger is active! 
examp-web-1 | * Debugger PIN: 630-981-535 
examp-web-1 | 172.19.0.1 - - [09/Jan/2023 16:46:53] "GET / HTTP/1.1" 200 - 
examp-web-1 | 172.19.0.1 - - [09/Jan/2023 16:46:53] "GET /favicon.ico HTTP/1.1" 404 -
Gracefully stopping... (press Ctrl+C again to force) 
[+] Running 1/1 
- Container examp-web-1 Stopped                                                        2.0s
canceled 
PS C:\DikshaDen\docker-apps\examp> cd .. 
PS C:\DikshaDen\docker-apps> docker-compose up
no configuration file provided: not found 
PS C:\DikshaDen\docker-apps> docker-compose up 
no configuration file provided: not found 
PS C:\DikshaDen\docker-apps> docker-compose up --build 
no configuration file provided: not found 
PS C:\DikshaDen\docker-apps> docker-compose up --build 
no configuration file provided: not found 
PS C:\DikshaDen\docker-apps> docker-compose build 
no configuration file provided: not found 
PS C:\DikshaDen\docker-apps> cd mount-nfs 
PS C:\DikshaDen\docker-apps\mount-nfs> docker-compose up --build
[+] Running 7/7 
- web-server Pulled                                                                    40.6s 
- 3f4ca61aafcd Pull complete                                                           18.0s 
- 50c68654b16f Pull complete                                                           19.3s 
- 3ed295c083ec Pull complete                                                           19.4s 
- 40b838968eea Pull complete                                                           19.6s 
- 88d3ab68332d Pull complete                                                           19.7s 
- 5f63362a3fa3 Pull complete                                                           19.8s
time="2023-01-09T22:48:42+05:30" level=warning msg="Found orphan containers ([mount-nfs-web-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up."

此输出演示了主机系统的 `/mnt/nfs/share` NFS 共享或卷已使用 `nginx:latest` 镜像挂载到容器的 `/app`。为了防止将卷的内容复制到容器中,`nocopy` 选项设置为 `true`。

结论

在本文中,我们探讨了如何使用 Docker Compose v3 直接在 Docker 容器中挂载网络文件系统 (NFS) 共享或卷。我们讨论了相关的各种术语和事实,例如卷类型、源路径、目标路径和卷选项。我们还提供了一个示例代码和输出,以显示该过程的工作方式。您可以按照本文中的说明,成功地使用 Docker Compose v3 在 Docker 容器中挂载 NFS 共享或卷。这将使您能够访问外部 NFS 服务器上的存储数据或在容器之间传输文件。

更新于:2023年1月17日

8K+ 阅读量

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告