未知模式:docker堆栈部署中的主机

时间:2017-12-26 09:16:20

标签: docker-swarm

我的主要目标是在我暴露端口时在一台机器上提供Nginx服务,并在docker swarm中进行堆栈部署(通常我们可以从docker swarm集群中的任何机器访问公开的服务)。为此,我有seen mode: host选项。

但是当我在docker compose文件中使用它并进行堆栈部署时,我收到错误service nginx: Unknown mode: host

nginx.yml文件

version: "3.4"
services:
    nginx:
        image: ramidavalapati/nginx:tag1
        deploy:
            mode: host
            restart_policy:
                condition: on-failure
            placement:
                constraints: [node.hostname == ram-ThinkPad-E470]
        ports:
            - 80:80
            - 443:443
        volumes:
            - /home/ram/nginxDocker/nginx.conf:/etc/nginx/nginx.conf
            - /home/ram/nginxDocker/logs/access.log:/var/log/nginx/access.log
            - /home/ram/nginxDocker/logs/error.log:/var/log/nginx/error.log
        networks:
            - all
        command: ["nginx", '-g', 'daemon off;']

networks:
    all:
        external: true

部署: $ sudo docker stack deploy -c nginx.yml nginx

4 个答案:

答案 0 :(得分:5)

  

我的主要目标是在我公开端口并进行堆栈部署时,只从一台机器上获取Nginx服务(通常我们可以从docker swarm集群中的任何机器访问公开的服务)

我理解的是,publish and expose ports to only one node and access it only from that node.

当您发布和公开服务的端口时(在您的情况下为Nginx),默认情况下,您可以从docker swarm的任何节点访问该服务。

但是如果您希望您的服务只能在一个节点上使用,那么您可以将端口部分用作from

ports:
  - target: 80
    published: 80
    protocol: tcp
    mode: host
  - target: 443
    published: 443
    protocol: tcp
    mode: host

在端口部分

中使用mode: host

这使您的服务只能从运行其容器的计算机上获得。

现在,如果您希望您的服务容器只能在特定的机器上运行,那么您可以使用@Miguel A.C.提到的约束。

答案 1 :(得分:2)

当Docker通知您时,主机不是受支持的模式。 Supported modes是全球性的并且是复制的。在全局模式下,您将在Swarm的每个工作节点上运行一个容器,在复制模式下,您将选择多个容器作为副本数量,并且这些容器可以部署在相同或不同的主机中,具体取决于调度程序。如果要在特定主机中仅部署一个容器,则可以使用mode:replicated,将replicas设置为1并使用约束来指定要使用的节点,例如使用node.hostname约束。有关可能有助于您定义文件的示例,请参阅docs

答案 2 :(得分:1)

在Docker swarm中,只有两种服务部署模式,全局和复制。默认为复制模式,在此模式下,您可以指定要运行的相同任务的数量。

全局服务在每个节点上运行一个任务。简而言之,每次向swarm添加额外节点时,orchestrator都会创建一个任务,并且调度程序会将任务分配给新节点。

复制服务具有预定义数量的相同任务,例如,如果您有4个工作节点,但是您定义了3个副本,则一个工作节点上没有容器。

现在,根据您的部署方案,如果您打算在每个节点上执行任务,则需要使用全局服务部署模式。所以定义看起来像这样:

deploy:
      mode: global

对于复制,它将是:

deploy:
      mode: replicated
      replicas: 3

暴露端口(HOST:CONTAINER)后,它将自动反映在所有工作节点上。如需进一步阅读,请参阅documentation of scatterhttps://docs.docker.com/engine/swarm/how-swarm-mode-works/services/

答案 3 :(得分:0)