docker-compose swarm:强制容器在特定主机上运行

时间:2016-09-05 08:31:29

标签: docker docker-compose docker-swarm

尝试使用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

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:4)

环境变量 constraint仅对Swarm的旧版(独立版)有效。较新的" Swarm模式"使用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

2016年9月编辑:

别的。 " swarm模式"目前不支持docker-compose。 Swarm模式可以理解新的dab格式。有一种方法可以将docker-compose文件转换为dab,但它是实验性的,此时不再依赖它。最好创建一个直接调用所有docker service create ...的bash脚本。

2017年3月编辑:

自Docker 1.13(17.03)开始,现在可以使用docker-compose直接提供swarm环境,而无需处理dab步骤。