Docker-Compose Swarm:强制容器在特定主机上运行

8

尝试使用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 的输出,以查看节点名称。 - Bernard
哦,还请澄清您正在询问的是传统的Docker Swarm,而不是新的“Swarm模式”。 - Bernard
在问题中添加了缺失的信息。 - user3292147
3个回答

10

我的第一个回答是关于“swarm mode”的。您已经澄清了您正在使用遗留的Swarm并添加了更多信息,因此在这里:

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

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

6
环境变量constraint仅适用于旧版(单独的)Swarm。较新的"Swarm Mode"使用modeconstraints选项(不使用环境变量)。
要在每个节点上强制执行一个且仅一个任务(容器),请使用mode = global
docker service create --name proxy --mode global nginx

默认模式是replicated,这意味着Swarm管理器将在所有可用的节点上创建任务(容器),以满足--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。需要注意的是,目前“swarm mode”不支持docker-compose。可以使用新的dab格式,但是转换工具还处于实验阶段。建议直接调用docker service create ...命令。从docker 1.13 (17.03)开始,可以直接使用docker-compose在swarm环境中进行部署。

抱歉,我忘记说明我正在使用独立的Swarm,而不是新版Docker支持的命令。我使用旧版本的原因是它不支持docker-compose,除非你安装Docker实验版本。 - user3292147
我没有遗留下来的暖环境设置,但是假设你有一个名为“node-1”的主机,你的限制应该可以工作。我真的建议你转移到“群模式”。将docker-compose文件转换为愚蠢的bash或Makefile花费的时间仍然值得,因为你将节省大量精力,无需设置Consul、TLS和其他东西。 - Bernard
谢谢您的建议。我正在使用Swarm运行Elasticsearch集群,其中节点不是完全相同的副本,而是彼此通信,并且有一些是主节点和一些是客户端/数据节点。我不确定这是否可行,如果没有docker-compose是否太复杂了。 - user3292147
1
“--constraint "node.hostname!=node01"” 对我帮助很大。谢谢! - Ben

0

相关问题 - 我最近有一个Swarm项目,其中包含混合的工作节点(3个Linux + 4个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  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接