開発用の Swarm クラスタ作成

このページでは、自分のネットワーク上に Docker Swam を作成する方法を紹介します。用途は、デバッグやテストや開発目的のみ対象です。この構築手順は、Docker Swam 向けの何らかのアプリケーション開発や、貢献のためにも使えます。

ご用心

セットアップは、ファイアーウォールや他の手法によって、安全なネットワーク環境上で行ってください。

事前準備

単一システム上に Docker Swarm をインストールします。インストールするのは Docker Swarm マネージャです。これを使い、クラスタの作成や、ネットワーク上の更なるノードを登録を行います。Swram クラスタの各ノードが必要になる環境は、次の通りです。

  • Swarm Manager が自分のネットワークにアクセス可能
  • Docker エンジン 1.6.0 以上のインストール
  • Swarm Manager 向けに TCP ポートをオープン

Docker Swarm は Linux の 64 bit アーキテクチャ上で実行できます。64 bit の Windows や Mac OSX でもインストール・実行可能ですが、いくつかのアーキテクチャ上での互換性は十分に検証されていません。

ネットワーク上のシステムによって認識され、利用可能になるまでは、まだ少々の時間がかかります。上記の動作条件を満たしているかどうか、ご確認ください。

Swarm イメージの取得とクラスタ作成

Swarm を使い始めるには、 公式 Docker イメージ の利用が最も簡単です。

  1. Swarm イメージを取得します。
$ docker pull swarm
  1. docker コマンドを使用して Swarm クラスタを作成します。
$ docker run --rm swarm create
6856663cdefdec325839a4b7e1de38e8 #

create コマンドを実行すると、ユニークなクラスタ ID ( cluster_id )を返します。この ID は、ノード上で Docker Swarm エージェントの開始時に使います。

Swarm ノードの作成

各 Swam ノードでは Swam ノードのエージェントを実行します。エージェントは Docker デーモンや監視のために登録され、ノードの状態とディスカバリ・バックエンドを更新します。

この例では、Docker Hub を使う token ディスカバリ・サービスを使います。 各ノード にログインし、同じ作業を行います。

  1. Docker デーモンに -H フラグを付けて起動します。これにより、 Swarm エージェントSwarm マネージャ と TCP を通して通信可能になります。Docker リモート API と同様に、Docker 標準インストール時に利用可能な標準 UNIX ソケットも利用できます。
$ docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

注釈

Docker 1.8 よりも前のバージョンでは、 docker daemon サブコマンドの代わりに、 -d フラグを使います。

Swarm エージェントをディスカバリ・サービスに登録します。このノードの IP アドレスは、Swarm マネージャからアクセスできる必要があります。次のコマンドを実行する時は、 ノードIDクラスタ ID を適切なものに置き換えてください。

docker run -d swarm join --addr=<ノードIP:2375> token://<クラスタID>

実行例:

$ docker run -d swarm join --addr=172.31.40.100:2375 token://6856663cdefdec325839a4b7e1de38e8

マネージャの設定

ノードの準備が完了したら、Swarm を制御するマネージャをセットアップします。

  1. Swarm マネージャを、任意のマシンまたは自分の PC 上で起動します。実行するコマンドは、次の通りです。
docker run -d -p <管理用ポート>:2375 swarm manage token://<クラスタID>

マネージャは 管理用ポート で指定したポートの公開とリッスンします。

  1. マネージャを起動後、次のように docker info を実行して、設定を確認します。
docker -H tcp://<manager_ip:manager_port> info

例えば、マネージャをローカルのマシン上で実行している場合は、次のように表示されます。

$ docker -H tcp://0.0.0.0:2375 info
Containers: 0
Nodes: 3
 agent-2: 172.31.40.102:2375
    └ Containers: 0
    └ Reserved CPUs: 0 / 1
    └ Reserved Memory: 0 B / 514.5 MiB
 agent-1: 172.31.40.101:2375
    └ Containers: 0
    └ Reserved CPUs: 0 / 1
    └ Reserved Memory: 0 B / 514.5 MiB
 agent-0: 172.31.40.100:2375
    └ Containers: 0
    └ Reserved CPUs: 0 / 1
    └ Reserved Memory: 0 B / 514.5 MiB

テスト用のクラスタで、TLS を有効にせずに実行しようとしても、エラーが起こるでしょう。このような場合は、環境変数 DOCKER_TLS_VERIFY を次のように無効化します。

$ unset DOCKER_TLS_VERIFY

docker CLI を使う

通常の Docker CLI を使い、ノードにアクセスできるようになります。

docker -H tcp://<manager_ip:manager_port> info
docker -H tcp://<manager_ip:manager_port> run ...
docker -H tcp://<manager_ip:manager_port> ps
docker -H tcp://<manager_ip:manager_port> logs ...

クラスタ上のノード一覧を表示

稼働中のノード一覧を取得するには、 swarm list コマンドを使います。

docker run --rm swarm list token://<クラスタID>
<ノードIP:2375>

実行例:

$ docker run --rm swarm list token://6856663cdefdec325839a4b7e1de38e8
172.31.40.100:2375
172.31.40.101:2375
172.31.40.102:2375

TLS

Swam は CLI と Swam 間の TLS 認証をサポートしているだけでなく、Swam と Docker ノード間でもサポートしています。 しかしながら 、全ての Docker デーモンと Docker ノードが同じ CA 証明書を使って認証されている 必要があります

クライアントとサーバいずれも TLS を有効にするには、Docker で指定時と同様のコマンドライン・オプションを使います。

swarm manage --tlsverify --tlscacert=<CACERT> --tlscert=<CERT> --tlskey=<KEY> [...]

Docker の TLS 認証設定や証明書の生成に関する詳細情報は、 Docker のドキュメント を参照ください。

Swam 証明書の生成には、 extendedKeyUsage = clientAuth,serverAuth を使う必要があります。