docker swarm:如何只在运行任务的特定节点上发布服务
docker swarm: how to publish a service only on a specific node that runs a task
我创建了一个 docker-compose.yml
文件,其中包含在两个不同节点上 运行 的两个服务。这两个服务旨在在与客户端和服务器相同的端口上进行通信。下面是我的 docker-compose.yml 文件。
version: "3"
services:
service1:
image: localrepo/image1
deploy:
placement:
constraints: [node.hostname == node1]
replicas: 1
resources:
limits:
cpus: "1"
memory: 1000M
restart_policy:
condition: on-failure
ports:
- 8000:8000
networks:
- webnet
service2:
image: localrepo/image2
deploy:
placement:
constraints: [node.hostname == node2]
replicas: 1
resources:
limits:
cpus: "1"
memory: 500M
restart_policy:
condition: on-failure
ports:
- "8000:8000"
networks:
- webnet
networks:
webnet:
当我发出 docker stack deploy -c
时出现错误,读取
> Error response from daemon: rpc error: code = 3 desc = port '8000' is already in use by service.
在这个 thread 中,我读到在群中部署服务可以使群中的任何节点都可以访问该端口。如果我理解正确的话,这使得该端口被集群中的任何节点占用。在同一个线程中,建议使用 mode=host
发布,这只会暴露容器 运行 所在的实际主机上的端口。我在端口中将其应用为:
端口:
- "mode=host, target=8000, published=8000"
在服务中进行更改并尝试发出 docker 堆栈会产生另一个错误:
> 1 error(s) decoding:
* Invalid containerPort: mode=host, target=8000, published=8000
有谁知道如何解决这个问题?
p.s: "Version3" 和 "Version3.2" 我都试过了,但问题没有解决。
我不知道你是如何指定 host mode
的,因为你的 docker-compose.yml
并不代表 host mode
任何地方。
顺便说一下,尝试使用 long syntax 可以在 docker-compose.yml
文件中指定 host mode
。
这个长语法是 v3.2
中的新语法,下面是示例(我检查它有效)
(This 兼容 docker engine
版本与 docker-compose
语法版本。)
version: '3.4' # version: '3.2' also will works
networks:
swarm_network:
driver: overlay
services:
service1:
image: asleea/test
command: ["nc", "-vlkp", "8000"]
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.hostname == node1
ports:
- published: 8000
target: 8000
mode: host
networks:
swarm_network:
service2:
image: asleea/test
command: ["nc", "service1", "8000"]
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.hostname == node2
ports:
- published: 8000
target: 8000
mode: host
networks:
swarm_network:
升级到最新的docker版本后问题已解决,18.01.0-ce
我创建了一个 docker-compose.yml
文件,其中包含在两个不同节点上 运行 的两个服务。这两个服务旨在在与客户端和服务器相同的端口上进行通信。下面是我的 docker-compose.yml 文件。
version: "3"
services:
service1:
image: localrepo/image1
deploy:
placement:
constraints: [node.hostname == node1]
replicas: 1
resources:
limits:
cpus: "1"
memory: 1000M
restart_policy:
condition: on-failure
ports:
- 8000:8000
networks:
- webnet
service2:
image: localrepo/image2
deploy:
placement:
constraints: [node.hostname == node2]
replicas: 1
resources:
limits:
cpus: "1"
memory: 500M
restart_policy:
condition: on-failure
ports:
- "8000:8000"
networks:
- webnet
networks:
webnet:
当我发出 docker stack deploy -c
时出现错误,读取
> Error response from daemon: rpc error: code = 3 desc = port '8000' is already in use by service.
在这个 thread 中,我读到在群中部署服务可以使群中的任何节点都可以访问该端口。如果我理解正确的话,这使得该端口被集群中的任何节点占用。在同一个线程中,建议使用 mode=host
发布,这只会暴露容器 运行 所在的实际主机上的端口。我在端口中将其应用为:
端口: - "mode=host, target=8000, published=8000"
在服务中进行更改并尝试发出 docker 堆栈会产生另一个错误:
> 1 error(s) decoding:
* Invalid containerPort: mode=host, target=8000, published=8000
有谁知道如何解决这个问题?
p.s: "Version3" 和 "Version3.2" 我都试过了,但问题没有解决。
我不知道你是如何指定 host mode
的,因为你的 docker-compose.yml
并不代表 host mode
任何地方。
顺便说一下,尝试使用 long syntax 可以在 docker-compose.yml
文件中指定 host mode
。
这个长语法是 v3.2
中的新语法,下面是示例(我检查它有效)
(This 兼容 docker engine
版本与 docker-compose
语法版本。)
version: '3.4' # version: '3.2' also will works
networks:
swarm_network:
driver: overlay
services:
service1:
image: asleea/test
command: ["nc", "-vlkp", "8000"]
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.hostname == node1
ports:
- published: 8000
target: 8000
mode: host
networks:
swarm_network:
service2:
image: asleea/test
command: ["nc", "service1", "8000"]
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.hostname == node2
ports:
- published: 8000
target: 8000
mode: host
networks:
swarm_network:
升级到最新的docker版本后问题已解决,18.01.0-ce