未知模式:docker 堆栈部署中的主机
Unknown mode: host in docker stack deploy
我的主要目标是当我公开端口并在 docker 群中进行堆栈部署时,使 Nginx 服务仅可从一台机器使用(通常我们可以从 docker 中的任何机器访问公开的服务蜂群)。为此,我有 seen 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
正如 Docker 通知您的那样,主机模式不受支持。 Supported modes are global and replicated. In global mode you'll have a container running on each worker node of your Swarm, in replicated mode you'll have a number of containers selected as the number of replicas and those containers can be deployed in the same or different hosts as decided by the scheduler. If you want to deploy only one container in a specific host you can use mode: replicated, set replicas to 1 and use constraints to specify which node you want to use e.g using node.hostname constraint. See docs 可帮助您定义文件的示例。
My primary goal is to make Nginx service available from only one machine when I expose ports and do stack deploy (Usually we can access exposed service from any machine in the docker swarm cluster)
我理解的是,publish and expose ports to only one node and access it only from that node.
当您发布和公开服务端口(在您的情况下为 Nginx)时,默认情况下您可以从属于 docker 群的任何节点访问该服务。
但是如果您希望您的服务只能从一个节点使用,那么您可以将端口部分用作 from
ports:
- target: 80
published: 80
protocol: tcp
mode: host
- target: 443
published: 443
protocol: tcp
mode: host
在端口部分使用 mode: host
这使得您的服务只能在其容器 运行ning 所在的机器上可用。
现在,如果您希望您的服务容器只在特定机器上 运行,那么您可以使用 @Miguel A.C 的约束。提到。
在Dockerswarm中,服务部署只有两种模式,global和replicated。默认为复制模式,在这种模式下,您可以指定相同任务的数量 运行.
全局服务运行在每个节点上执行一项任务。因此,简而言之,每次您向 swarm 添加一个额外的节点时,编排器都会创建一个任务,而调度器会将任务分配给新节点。
一个复制服务有预定义数量的相同任务,例如,如果你有 4 个工作节点,但你定义了 3 个副本,一个工作节点上不会有容器。
现在根据你的部署场景,如果你打算在每个节点上都有一个任务,你需要使用全局服务部署模式。所以定义将如下所示:
deploy:
mode: global
对于复制,它将是:
deploy:
mode: replicated
replicas: 3
一旦公开端口 (HOST:CONTAINER) - 它将自动反映在所有工作节点上。如需进一步阅读,您可以参考 https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/ and https://www.aquasec.com/wiki/display/containers/Docker+Swarm+101.
有一个错误不允许这样做(和解决方法):
https://success.docker.com/article/services-servicename-ports-0-must-be-a-string-or-number-when-performing-a-docker-stack-deploy
我的主要目标是当我公开端口并在 docker 群中进行堆栈部署时,使 Nginx 服务仅可从一台机器使用(通常我们可以从 docker 中的任何机器访问公开的服务蜂群)。为此,我有 seen 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
正如 Docker 通知您的那样,主机模式不受支持。 Supported modes are global and replicated. In global mode you'll have a container running on each worker node of your Swarm, in replicated mode you'll have a number of containers selected as the number of replicas and those containers can be deployed in the same or different hosts as decided by the scheduler. If you want to deploy only one container in a specific host you can use mode: replicated, set replicas to 1 and use constraints to specify which node you want to use e.g using node.hostname constraint. See docs 可帮助您定义文件的示例。
My primary goal is to make Nginx service available from only one machine when I expose ports and do stack deploy (Usually we can access exposed service from any machine in the docker swarm cluster)
我理解的是,publish and expose ports to only one node and access it only from that node.
当您发布和公开服务端口(在您的情况下为 Nginx)时,默认情况下您可以从属于 docker 群的任何节点访问该服务。
但是如果您希望您的服务只能从一个节点使用,那么您可以将端口部分用作 from
ports:
- target: 80
published: 80
protocol: tcp
mode: host
- target: 443
published: 443
protocol: tcp
mode: host
在端口部分使用 mode: host
这使得您的服务只能在其容器 运行ning 所在的机器上可用。
现在,如果您希望您的服务容器只在特定机器上 运行,那么您可以使用 @Miguel A.C 的约束。提到。
在Dockerswarm中,服务部署只有两种模式,global和replicated。默认为复制模式,在这种模式下,您可以指定相同任务的数量 运行.
全局服务运行在每个节点上执行一项任务。因此,简而言之,每次您向 swarm 添加一个额外的节点时,编排器都会创建一个任务,而调度器会将任务分配给新节点。
一个复制服务有预定义数量的相同任务,例如,如果你有 4 个工作节点,但你定义了 3 个副本,一个工作节点上不会有容器。
现在根据你的部署场景,如果你打算在每个节点上都有一个任务,你需要使用全局服务部署模式。所以定义将如下所示:
deploy:
mode: global
对于复制,它将是:
deploy:
mode: replicated
replicas: 3
一旦公开端口 (HOST:CONTAINER) - 它将自动反映在所有工作节点上。如需进一步阅读,您可以参考 https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/ and https://www.aquasec.com/wiki/display/containers/Docker+Swarm+101.
有一个错误不允许这样做(和解决方法): https://success.docker.com/article/services-servicename-ports-0-must-be-a-string-or-number-when-performing-a-docker-stack-deploy