概要
複数のノードで Docker Swarm を使用してクラスタを組織している場合、クラスタに参加しているノードはそれぞれスペックが異なったり、単純に役割を分けたかったりなど様々な理由でコンテナ(サービス)を起動させたいノードを縛りたい要求がある。
この要件に対応する docker-compose.yml の記述方法を以下に記載。
Compose file version 3 reference 等を読み込むと確かにわかるんでしょうが、わかりにくかったので自分なりの整理で書いときます。
システム要件
Swarmモード で Docker Compose が利用できるようになった Docker Engine のバージョン 1.13 (Composeバージョン3)以降。
ノードにラベルを付けて起動するノードを限定する方法
Docker Swarm に JOIN しているノードあるいは、JOINさせるノードにはラベルをつけることができる。
ここでは、Webサーバ専用クラスタのノードとしてあつかい、そのノードでだけ nginx が起動するように設定する方法を書いてみる。
1. ノードにラベルを付ける
docker node update --label-add type=web <NODE_ID | HOSTNAME>
2. docker-compose.yml でコンテナが起動するノードが指定されたラベルのものにさせる
deploy
の placement
に constraints
属性があるので、ここに条件を書くことができる。
node.labels.<LABEL_NAME> == <VALUE>
と書くとノードにつけたラベルの指定ができました。
ここでは、1.で付けたラベル type が web のものであることを条件として書いてあります。
version: '3'
services:
web:
image: nginx
deploy:
placement:
constraints:
- node.labels.type == web
起動するWorkerノードに限定する方法
ごく一般的な要件で、公式ドキュメントにも書いてありますが、一応書いときます。
node.role == worker
とすると workerノードでしかコンテナが上がらないようになります。
version: '3'
services:
web:
image: nginx
deploy:
placement:
constraints:
- node.role == worker
課題
==
といった記述ができるってことは、他の条件もかけるのではなかろうか。。。数値だったら、不等号なども利用できるのだろうか。。。
まだ必要にかられていないので、調べたり試したりしてませんが、きっと行けるはず。
また、labels
やrole
以外の nodeオブジェクトの子要素や、node以外のオブジェクトの参照も可能っぽいが、どういうものが参照可能なのかは調べてないですが、いろいろ書けそうです。
詳しくは、Specify service constraints (–constraint) 参照。