Docker Swarm - 策略似乎没有任何效果

Docker Swarm - strategy doesn't seem to have any effect

我已经使用 Docker 机器配置了 swarm master 和 swarm 节点(如 here 所述)。一切正常;所有机器都已创建并 运行ning,它们都已被发现并接受容器。

'docker-machine ls' 的输出是:

$ docker-machine ls
NAME         ACTIVE      DRIVER         STATE     URL                          SWARM               DOCKER    ERRORS
default      -           virtualbox     Stopped                                                    Unknown   
local        -           virtualbox     Stopped                                                    Unknown   
my-swarm     * (swarm)   digitalocean   Running   tcp://104.131.161.197:2376   my-swarm (master)   v1.11.1   
node0        -           digitalocean   Running   tcp://104.236.29.169:2376    my-swarm            v1.11.1   
node1        -           digitalocean   Running   tcp://104.236.216.164:2376   my-swarm            v1.11.1   

我遇到的问题是容器的分发。无论我为 swarm 设置哪种策略,它似乎一次只将容器分发到其中一个节点。 IE。我运行一堆容器,都是在同一个节点启动的,如下图(策略Spread):

$ docker ps
5c075d7ccddc        stress              "/bin/sh -c /stress.s"   32 seconds ago       Up 31 seconds                           node0/elated_goldstine
5bae22a15829        stress              "/bin/sh -c /stress.s"   46 seconds ago       Up 44 seconds                           node0/cocky_booth
dc52b3dfa0e6        stress              "/bin/sh -c /stress.s"   About a minute ago   Up About a minute                       node0/goofy_kalam
3b9e69c694da        stress              "/bin/sh -c /stress.s"   About a minute ago   Up About a minute                       node0/focused_fermat
ef0e006ff3e0        stress              "/bin/sh -c /stress.s"   About a minute ago   Up About a minute                       node0/stoic_engelbart
53e46b19ab33        stress              "/bin/sh -c /stress.s"   About a minute ago   Up About a minute                       node0/condescending_rosalind
e9e126c7f4c6        stress              "/bin/sh -c /stress.s"   About a minute ago   Up About a minute                       node0/sleepy_jang
f9c0003d509d        stress              "/bin/sh -c /stress.s"   About a minute ago   Up About a minute                       node0/amazing_bhaskara

我在这里期望的是容器大致均匀地分布在 3 个节点上,特别是因为我 运行 在容器中设置的脚本旨在占用尽可能多的 CPU 尽可能。但是它们都在 node0 上(我只希望 Binpack 有)。随机策略具有完全相同的行为。

'docker info' 的 swarm master 设置为活动的输出似乎是正确的:

$ docker info
Containers: 15
 Running: 4
 Paused: 0
 Stopped: 11
Images: 5
Server Version: swarm/1.2.1
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 3 
 my-swarm: 104.131.161.197:2376
  └ ID: L2HK:F6S3:WWIM:BHNI:M4XL:KLEA:4U22:J6CE:ZHZI:OGGT:76KF:MTQU
  └ Status: Healthy
  └ Containers: 2
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 513.4 MiB
  └ Labels: executiondriver=, kernelversion=4.2.0-27-generic, operatingsystem=Ubuntu 15.10, provider=digitalocean, storagedriver=aufs
  └ Error: (none)
  └ UpdatedAt: 2016-05-09T10:25:24Z
  └ ServerVersion: 1.11.1
 node0: 104.236.29.169:2376
  └ ID: I3TQ:5BMS:TM2P:GLL4:64OH:BDMY:SWBU:3QG4:TOZ2:LEDW:A6SQ:X34H
  └ Status: Healthy
  └ Containers: 12
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 513.4 MiB
  └ Labels: executiondriver=, kernelversion=4.2.0-27-generic, operatingsystem=Ubuntu 15.10, provider=digitalocean, storagedriver=aufs
  └ Error: (none)
  └ UpdatedAt: 2016-05-09T10:25:02Z
  └ ServerVersion: 1.11.1
 node1: 104.236.216.164:2376
  └ ID: OTQH:UBSV:2HKE:ZVHL:2K7Z:BYGC:ZX25:Y6BQ:BN5J:UWEB:65KE:DABM
  └ Status: Healthy
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 513.4 MiB
  └ Labels: executiondriver=, kernelversion=4.2.0-27-generic, operatingsystem=Ubuntu 15.10, provider=digitalocean, storagedriver=aufs
  └ Error: (none)
  └ UpdatedAt: 2016-05-09T10:25:10Z
  └ ServerVersion: 1.11.1
Plugins: 
 Volume: 
 Network: 
Kernel Version: 4.2.0-27-generic
Operating System: linux
Architecture: amd64
CPUs: 3
Total Memory: 1.504 GiB
Name: my-swarm
Docker Root Dir: 
Debug mode (client): false
Debug mode (server): false
WARNING: No kernel memory limit support

是否有一些我遗漏的部分是让这种类型的自动分发按我期望的方式工作所必需的?

问题

很可能您 Docker 代理没有您尝试 运行 在他们身上的图像。

请注意,swarm buildswarm pull 不会在每个 Docker 代理上 buildpull

解决方案 A

运行 pull 在每个 Docker 代理上手动

解决方案 B (未测试)

运行 本地 Docker registry,其中 Docker 代理将从中提取图像。


与 Swarm 一起玩得开心!另外,如果可以的话,我建议您阅读 this answer,其中详细介绍了有关 Swarm 的整个分步教程。