如何确保Docker容器在Swarm的工作节点而非管理节点上运行

98次阅读
没有评论

问题描述

在使用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,如果你在使用其他容器编排工具或平台,可能会有不同的解决方案。

正文完