【问题标题】:docker-compose swarm: force containers to run on specific hostsdocker-compose swarm:强制容器在特定主机上运行
【发布时间】:2016-09-05 08:31:28
【问题描述】:

尝试使用 Swarm 单机版和 docker-compose 版本“2”在不同的虚拟机上运行集群应用程序。覆盖网络已设置。但是想强制某些容器在特定主机上运行。

在文档中有以下建议,但使用此参数我根本无法启动任何容器:

environment:
  - "constraint:node==node-1"

ERROR: for elasticsearch1  Cannot create container for service elasticsearch1: Unable to find a node that satisfies the following conditions
[available container slots]
[node==node-1]

我们应该将主机注册为node-1 node-2...还是默认完成。

[root@ux-test14 ~]# docker node ls
Error response from daemon: 404 page not found
[root@ux-test14 ~]# docker run swarm list
[root@ux-test14 ~]#  

[root@ux-test14 ~]# docker info
Containers: 8
 Running: 6
 Paused: 0
 Stopped: 2
Images: 8
Server Version: swarm/1.2.5
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 2
 ux-test16.rs: 10.212.212.2:2375
  â ID: JQPG:GKFF:KJZJ:AY3N:NHPZ:HD6J:SH36:KEZR:2SSH:XF65:YW3N:W4DG
  â Status: Healthy
  â Containers: 4 (4 Running, 0 Paused, 0 Stopped)
  â Reserved CPUs: 0 / 2
  â Reserved Memory: 0 B / 3.888 GiB
  â Labels: kernelversion=3.10.0-327.28.3.el7.x86_64, operatingsystem=CentOS Linux 7 (Core), storagedriver=devicemapper
  â UpdatedAt: 2016-09-05T11:11:31Z
  â ServerVersion: 1.12.1
 ux-test17.rs: 10.212.212.3:2375
  â ID: Z27V:T5NU:QKSH:DLNK:JA4M:V7UX:XYGH:UIL6:WFQU:FB5U:J426:7XIR
  â Status: Healthy
  â Containers: 4 (2 Running, 0 Paused, 2 Stopped)
  â Reserved CPUs: 0 / 2
  â Reserved Memory: 0 B / 3.888 GiB
  â Labels: kernelversion=3.10.0-327.28.3.el7.x86_64, operatingsystem=CentOS Linux 7 (Core), storagedriver=devicemapper
  â UpdatedAt: 2016-09-05T11:11:17Z
  â ServerVersion: 1.12.1
Plugins:
 Volume:
 Network:
Swarm:
 NodeID:
 Is Manager: false
 Node Address:
Security Options:
Kernel Version: 3.10.0-327.28.3.el7.x86_64
Operating System: linux
Architecture: amd64
CPUs: 4
Total Memory: 7.775 GiB
Name: 858ac2fdd225
Docker Root Dir:
Debug Mode (client): false
Debug Mode (server): false
WARNING: No kernel memory limit support

【问题讨论】:

  • 打印docker run swarm list 的输出以查看您的节点名称。
  • 哦,另外请澄清一下,您问的是旧版 Docker Swarm,而不是新的“Swarm 模式”。
  • 添加了有问题的缺失信息

标签: docker docker-compose docker-swarm


【解决方案1】:

我的第一个答案是关于“群模式”。你已经澄清你正在使用旧版 Swarm 并添加了更多信息,所以在这里:

您列出的约束假定您有一个名为node-1 的主机。您的主机名为 ux-test16.rsux-test17.rs。只需在约束中使用它而不是 node-1 即可。例如:

environment:
  - "constraint:node==ux-test16.rs"

【讨论】:

    【解决方案2】:

    环境变量 constraint 仅对 Swarm 的旧(独立)版本有效。较新的“Swarm 模式”使用modeconstraints 选项(不是环境变量)。

    要对每个节点强制执行一项且仅一项任务(容器),请使用mode=global

    docker service create --name proxy --mode global nginx
    

    默认模式是replicated,这意味着swarm manager将在所有可用节点上创建任务(容器)以满足--replicas选项中指定的数量。例如:

    docker service create --name proxy --replicas 5 nginx
    

    要根据主机名(节点)、标签、角色、id 强制执行其他约束,请使用--constraint 选项。例如:

    docker service create --name proxy --constraint "node.hostname!=node01" nginx
    

    https://docs.docker.com/engine/reference/commandline/service_create/#/specify-service-constraints

    2016 年 9 月编辑:

    其他的。 docker-compose 目前在“群模式”中不受支持。 Swarm 模式可以理解新的dab 格式。有一种方法可以将 docker-compose 文件转换为 dab,但它是实验性的,目前不能依赖。最好创建一个bash脚本,直接调用所有docker service create ...

    2017 年 3 月编辑:

    从 docker 1.13 (17.03) 开始,docker-compose 现在可用于直接配置 swarm 环境,而无需处理 dab 步骤。

    【讨论】:

    • 对不起,我忘记指定我使用的是独立的 swarm,而不是新 docker 版本支持的命令。我使用旧版本的原因是因为它不支持 docker-compose 除非你安装 docker 实验版本。
    • 我没有任何传统的暖环境设置,但假设您有一个名为 node-1 的主机,您的约束应该可以工作。我真的建议你转向“群模式”。将您的 docker-compose 文件转换为哑 bash 或 Makefile 所花费的时间仍然值得,因为您无需设置 Consul、TLS 和其他东西就可以节省无数的精力。
    • 感谢您的建议。我正在使用 swarm 运行 elasticserch 集群,节点不是相同的副本,而是相互通信,有些是一些客户端/数据节点的主节点。我不确定这是否可行,如果没有 docker-compose 会不会太复杂
    • --constraint "node.hostname!=node01" 帮助了我很多。谢谢!
    【解决方案3】:

    相关问题 - 我最近有一个 Swarm 项目,其中包含多个工作节点(3 x Linux + 4 x Windows)。我的容器需要在特定的操作系统上运行,而不是在任何特定的节点上。 Swarm 模式现在支持在 docker-compose 文件的“约束”下指定操作系统。无需为每个节点创建标签:

    version: '3'  
    services:  
        service_1:  
            restart: on-failure  
            image: 'service_1'  
            deploy:  
                placement:  
                    constraints:  
                        - node.platform.os == windows  
        junittestsuite:  
            restart: on-failure  
            image: 'junit_test_suite:1.0'  
            command: ant test ...  
            deploy:  
                placement:  
                    constraints:  
                        - node.platform.os == linux  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2019-08-25
      • 1970-01-01
      相关资源
      最近更新 更多