问题描述
在使用Docker Swarm时遇到了一个问题:在启动堆栈时,容器却在管理节点上运行,而不是工作节点上。他希望能够在工作节点上运行容器。
解决方案
请注意以下操作可能涉及版本差异及风险,请在执行前做好备份。
在Docker Swarm中,管理节点和工作节点都可以运行容器。如果你希望控制容器的运行位置,你可以使用placement
配置来设置约束条件。下面是解决方案的步骤:
步骤1:编辑docker-stack.yml文件
在你的docker-stack.yml
文件中,添加placement
配置以约束容器的运行位置。你可以使用constraints
来指定约束条件,这里我们将约束条件设置为只在工作节点上运行。
以下是修改后的docker-stack.yml
文件示例:
version: "3.4"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
# 添加以下placement配置
placement:
constraints:
- node.role == worker
networks:
frontend:
volumes:
db-data:
在上面的示例中,我们在redis
服务的配置中添加了placement
部分,通过constraints
指定了容器只在工作节点上运行。
步骤2:重新部署堆栈
保存修改后的docker-stack.yml
文件,并在命令行中执行以下命令,重新部署堆栈:
docker stack deploy -c docker-stack.yml redis-stack
现在,堆栈中的容器将会根据约束条件,在工作节点上运行。
其他信息
如果你想要更多了解关于放置策略和约束条件的信息,可以参考以下链接:
– Docker Compose文件版本3中的放置策略
– 使用Docker命令行指定服务约束条件
请注意,对于只有一个管理节点的情况,如果管理节点出现故障,所有任务都无法重新调度,因此在设计约束条件时需要考虑这一点。
以上解决方案适用于Docker Swarm,如果你在使用其他容器编排工具或平台,可能会有不同的解决方案。
正文完