我的主要目标是在我公开端口时在一台机器上提供Nginx服务,并在docker swarm中进行堆栈部署(通常我们可以从docker swarm集群中的任何机器访问公开的服务) . 为此我有seen mode: host
选项 .
但是当我在docker compose文件中使用它并进行堆栈部署时,我收到错误 service nginx: Unknown mode: host
.
nginx.yml file
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
3 回答
我的理解是,
publish and expose ports to only one node and access it only from that node.
当您发布和公开服务的端口(在您的情况下是Nginx)时,默认情况下,您可以从docker swarm的任何节点访问该服务 .
但是,如果您希望您的服务只能在一个节点上使用,那么您可以将端口部分用作from
在ports部分中使用
mode: host
这使您的服务只能从运行其容器的计算机上获得 .
现在,如果您希望您的服务容器只能在特定的机器上运行,那么您可以使用@Miguel A.C.提到的约束 .
当Docker通知您时,主机不是受支持的模式 . Supported modes是全球性的并且是复制的 . 在全局模式下,您将选择多个容器作为副本数,并且可以根据调度程序的决定将这些容器部署在相同或不同的主机中 . 如果要在特定主机中仅部署一个容器,则可以使用mode:replicated,将replicas设置为1并使用约束来指定要使用的节点,例如使用node.hostname约束 . 有关可能有助于您定义文件的示例,请参阅docs .
在Docker swarm中,只有两种服务部署模式,全局和复制 . 默认为复制模式,在此模式下,您可以指定要运行的相同任务的数量 .
全局服务在每个节点上运行一个任务 . 简而言之,每次向swarm添加额外节点时,orchestrator都会创建一个任务,并且调度程序会将任务分配给新节点 .
复制服务具有预定义数量的相同任务,例如,如果您有4个工作节点,但是您定义了3个副本,则一个工作节点上不会有容器 .
现在,根据您的部署方案,如果您打算在每个节点上执行任务,则需要使用全局服务部署模式 . 所以定义看起来像这样:
对于复制,它将是:
暴露端口(HOST:CONTAINER)后,它将自动反映在所有工作节点上 . 如需进一步阅读,请参阅https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/和https://www.aquasec.com/wiki/display/containers/Docker+Swarm+101 .