Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

複数のノードで 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) 参照。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした