当前位置: 首页 > 面试题库 >

如何使用docker compose v3在容器中直接挂载NFS共享/卷

苏嘉歆
2023-03-14
问题内容

我有一个v3的撰写文件,其中有3个服务共享/使用相同的卷。在使用群模式时,我们需要创建额外的容器和卷来管理整个集群中的服务。

我打算使用NFS服务器,以便单个NFS共享将直接安装在群集内的所有主机上。

我发现以下两种实现方法,但是它需要在Docker主机上执行额外的步骤-

  • 在主机上使用“ fstab”或“ mount”命令挂载NFS共享,然后将其用作Docker服务的主机卷。

  • 使用Netshare插件-https: //github.com/ContainX/docker-volume-netshare

有没有一种标准方法,我可以通过在Docker主机上执行很少/不需要任何步骤(我知道无论如何都需要“ nfs-common”软件包)来直接使用docker
compose v3来使用/挂载NFS共享?


问题答案:

在发现大量未记录的文件之后,这是使用堆栈和docker compose挂载NFS卷的正确方法。

最重要的是,您需要使用version: "3.2"或更高。如果没有的话,将会有奇怪而又不明显的错误。

第二个问题是,卷的定义更改时 不会 自动更新。当您所做的更改尚未应用时,这会使您陷入困境,认为更改是不正确的。确保您docker rm VOLUMENAME可能在任何地方都可以使用,就像该卷存在一样,它不会被验证。

第三个问题更多是NFS问题- 如果不存在,则不会在服务器 上创建 NFS文件夹。这就是NFS的工作方式。在执行任何操作之前,您需要确保它存在。

(除非确定您知道自己在做什么,否则不要删除’soft’和’nolock’-如果NFS服务器消失,这将使docker停止冻结)

这是一个完整的示例:

[root@docker docker-mirror]# cat nfs-compose.yml
version: "3.2"

services:
  rsyslog:
    image: jumanjiman/rsyslog
    ports:
      - "514:514"
      - "514:514/udp"
    volumes:
      - type: volume
        source: example
        target: /nfs
        volume:
          nocopy: true
volumes:
  example:
    driver_opts:
      type: "nfs"
      o: "addr=10.40.0.199,nolock,soft,rw"
      device: ":/docker/example"



[root@docker docker-mirror]# docker stack deploy --with-registry-auth -c nfs-compose.yml rsyslog
Creating network rsyslog_default
Creating service rsyslog_rsyslog
[root@docker docker-mirror]# docker stack ps rsyslog
ID                  NAME                IMAGE                       NODE                DESIRED STATE       CURRENT STATE                     ERROR               PORTS
tb1dod43fe4c        rsyslog_rsyslog.1   jumanjiman/rsyslog:latest   swarm-4             Running             Starting less than a second ago
[root@docker docker-mirror]#

现在,在swarm-4上:

root@swarm-4:~# docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS               NAMES
d883e0f14d3f        jumanjiman/rsyslog:latest   "rsyslogd -n -f /e..."   6 seconds ago       Up 5 seconds        514/tcp, 514/udp    rsyslog_rsyslog.1.tb1dod43fe4cy3j5vzsy7pgv5
root@swarm-4:~# docker exec -it d883e0f14d3f df -h /nfs
Filesystem                Size      Used Available Use% Mounted on
:/docker/example          7.2T      5.5T      1.7T  77% /nfs
root@swarm-4:~#

将在运行堆栈的任何群集节点上创建( 但不会销毁 )该卷。

root@swarm-4:~# docker volume inspect rsyslog_example
[
    {
        "CreatedAt": "2017-09-29T13:53:59+10:00",
        "Driver": "local",
        "Labels": {
            "com.docker.stack.namespace": "rsyslog"
        },
        "Mountpoint": "/var/lib/docker/volumes/rsyslog_example/_data",
        "Name": "rsyslog_example",
        "Options": {
            "device": ":/docker/example",
            "o": "addr=10.40.0.199,nolock,soft,rw",
            "type": "nfs"
        },
        "Scope": "local"
    }
]
root@swarm-4:~#


 类似资料:
  • 问题内容: 有谁知道如何使用centos基本映像在docker容器中安装nfs共享?我已经尝试过以下命令: 并得到下一个错误: 当我尝试将其与 -o nolock 选项一起使用时,错误是: 问题答案: 对于使用,您需要具有此功能,Docker在创建容器时会丢弃该功能。 有几种解决方案: 用标志启动容器。这将导致Docker保留该功能,从而使您可以从容器内挂载NFS共享。这可能是一个安全问题;不要在

  • 问题内容: 我有一个在Docker容器中运行的Web应用程序。此应用程序需要访问我们公司文件服务器(带有Active Directory域控制器的Windows Server)上的某些文件。我尝试访问的文件是为我们的客户创建的图像文件,Web应用程序将它们显示为客户产品组合的一部分。 在我的开发机器上,我通过条目安装了适当的文件夹,并且通过参数将主机安装点安装在Docker容器中。这很完美。 现在

  • 问题内容: 示例(为简便起见,省略了许多选项): 这是错误的,因为没有名称名称的卷,这意味着该卷名称必须是文件的完整路径(即,您不能在该卷名称后附加路径)? 尝试设置只会返回错误。 有没有办法将单个文件安装到容器中? 问题答案: 您不能在命名卷中装入文件或子目录,源是命名卷或主机路径。NFS本身,以及您将在Linux中挂载的大多数文件系统,都要求您挂载整个文件系统,而不是单个文件,当下降到inod

  • 我正试图将一个持久卷装入windows容器中,但总是会出现以下错误: my PersistentVolumeClaim: 和我的容器的部署: 我做错了什么?有其他方法挂载卷吗?

  • 对于开发:我有一个部署在docker容器中的节点API。该docker容器运行在Linux虚拟机中。对于部署:我将docker映像推送到Azure(ARC),然后我们的管理员创建容器(ACI)。 有什么需要帮忙的吗?

  • 实现的计划是向现有的DB连接添加DTO/TABLE。我将添加一个高优先级过滤器或auth机制,如果状态未设置,则检查缓存,然后检查数据库中的现有数据。对于auth机制实现,如果不存在状态或cookie,我将返回到default/super。 是我把这件事搞得太复杂了,有一个包可以管理它,还是这是问题的解决方案?任何反馈都将不胜感激!