web-dev-qa-db-ja.com

docker-compose 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-1node-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
7
user3292147

私の最初の答えは「スウォームモード」についてです。それ以来、レガシーSwarmを使用していることを明確にし、さらに情報を追加したので、ここに:

リストする制約は、node-1という名前のホストがあることを前提としています。ホストの名前はux-test16.rsおよびux-test17.rsです。制約でnode-1の代わりにそれを使用してください。例えば:

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

環境変数constraintは、Swarmのレガシー(スタンドアロン)バージョンでのみ有効です。新しい「スウォームモード」は、modeまたはconstraintsオプションのいずれかを使用します(環境変数ではありません)。

ノードごとに1つだけのタスク(コンテナ)を適用するには、mode=globalを使用します。

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

デフォルトのモードはreplicatedです。これは、群れマネージャーが--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は現在、「スウォームモード」ではサポートされていません。スウォームモードは、代わりに新しい dab 形式を理解します。 docker-composeファイルをdabに変換する方法はありますが、これは実験的なものであり、現時点では信頼できません。すべてのdocker service create ...を直接呼び出すbashスクリプトを作成することをお勧めします。

2017年3月の編集:

Docker 1.13(17.03)以降、docker-composeを使用して、軽くたたくステップを処理することなく、スウォーム環境を直接プロビジョニングできるようになりました。

5
Bernard