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

我的主要目标是在Docker群中公开端口并进行堆栈部署(通常我们可以从Docker群集群中的任何机器访问公开的服务),使得只有一台机器可以使用Nginx服务。 为此,我已经看到 mode: host选项。

但是当我在Docker组合文件中使用它,并做堆栈部署,然后我得到错误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

我的主要目标是在暴露端口和进行堆栈部署时,使Nginx服务仅从一台机器上提供(通常我们可以从Docker群集中的任何机器访问公开的服务)

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

当你为服务发布和公开端口时(在你的情况下是Nginx),那么默认情况下,你可以从Docker群的任何一个节点访问这个服务。

但是,如果你希望你的服务应该只能从一个节点获得,那么你可以使用你的端口部分

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

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

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

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