我的主要目标是在我暴露端口时在一台机器上提供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
答案 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 scatter
和https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/。
答案 3 :(得分:0)