LoginSignup
7

More than 5 years have passed since last update.

Docker Compose with Swarm 指定したノードでコンテナを起動させる方法

Last updated at Posted at 2017-04-06

概要

複数のノードで 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 でコンテナが起動するノードが指定されたラベルのものにさせる

deployplacementconstraints 属性があるので、ここに条件を書くことができる。
node.labels.<LABEL_NAME> == <VALUE> と書くとノードにつけたラベルの指定ができました。
ここでは、1.で付けたラベル type が web のものであることを条件として書いてあります。

docker-compose.yml
version: '3'
services:
    web:
        image: nginx
        deploy:
          placement:
            constraints:
              - node.labels.type == web

起動するWorkerノードに限定する方法

ごく一般的な要件で、公式ドキュメントにも書いてありますが、一応書いときます。
node.role == worker とすると workerノードでしかコンテナが上がらないようになります。

docker-compose.yml
version: '3'
services:
    web:
        image: nginx
        deploy:
          placement:
            constraints:
              - node.role == worker

課題

== といった記述ができるってことは、他の条件もかけるのではなかろうか。。。数値だったら、不等号なども利用できるのだろうか。。。
まだ必要にかられていないので、調べたり試したりしてませんが、きっと行けるはず。

また、labelsrole以外の nodeオブジェクトの子要素や、node以外のオブジェクトの参照も可能っぽいが、どういうものが参照可能なのかは調べてないですが、いろいろ書けそうです。
詳しくは、Specify service constraints (–constraint) 参照。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7