Docker Machine で Swarm クラスタ構築

Docker Machine を使って Docker Swarm クラスタをプロビジョン(自動構築)できます。Docker Machine とは Docker のプロビジョニング・ツールです。Machine はホストをプロビジョンし、そこに Docker Engine をインストールし、Docker CLI クライアント用の設定を行います。Machine で Swarm 用のオプションを指定したら、プロビジョニングの過程で Swarm クラスタ用の設定も迅速に行えます。

このページでは、Machine で基本的な Swarm クラスタを構築するために必要なコマンドを紹介します。ローカルの Mac もしくは Windows 上に環境を構築します。流れを理解してしまえば、クラウド・プロバイダ上や、あるいは会社のデータセンタ内にも Swarm クラスタをセットアップできるようになるでしょう。

Swarm クラスタの構築が初めてであれば、まず Swarm について学び、 Swarm を検証環境で試すにはプロダクション用の Swarm クラスタ構築 を読んでおく必要があります。Machine を使うのが初めてであれば、 Machine を使う前に概要の理解 が望ましいでしょう。

何が必要ですか?

Mac OS X や Windows で Docker Toolbox を使ってインストールしていた場合は、既に Docker Machine がインストール済みです。インストールの必要があれば、 Mac OS X または Windows のページをご覧ください。

Machine を使ったインストールをサポートしているのは、AWS 、 Digital Ocean 、 Google Cloud Platform 、 IBM SoftLayer 、 Microsoft Azure 、 Hyper-V 、 OpenStack 、 RackSpace 、 VirtualBox 、 VMware Fusion 、vCloud Air 、 vSphere です。このページの例では VirtualBox 上で boot2docker.iso イメージを使った仮想マシンをいくつか起動します。このイメージは Docker Engine を実行するための最小ディストリビューションです。

Toolbox をインストールしたら、 VirtualBox と必要に応じて boot2docker.iso イメージが用意されます。また、Machine がサポートするあらゆるシステム上へプロビジョン可能です。

注釈

この例では Mac OS X もしくは Windows の利用を想定していますが、 Docker Machine は Linux システム上に直接インストール可能です

Swarm トークンをホスト上で生成

Swarm の設定を始める前に、Docker Engine の動くホストをプロビジョニングする必要があります。Machine をインストールしたホスト上のターミナルを開きます。それから local という名称のホストをプロビジョニングするため、次のように実行します。

docker-machine create -d virtualbox local

この例では VirtualBox を指定していますが、DigitalOcean やデータセンタ内のホストでも簡単に作成できます。 local の値はホスト名です。作成したら、自分のターミナル上で local ホストと通信できるように、環境変数を指定します。

eval "$(docker-machine env local)"

各 Swarm ホストでは、 Engine の設定時にトークンも指定します。このトークンは Swarm ディスカバリ・バックエンドが Swarm クラスタの適切なノードであることを認識するために必要です。クラスタ用のトークンを作成するには、 swarm イメージを実行します。

docker run swarm create
Unable to find image 'swarm' locally
1.1.0-rc2: Pulling from library/swarm
892cb307750a: Pull complete
fe3c9860e6d5: Pull complete
cc01ef3f1fbc: Pull complete
b7e14a9c9c72: Pull complete
3ec746117013: Pull complete
703cb7acfce6: Pull complete
d4f6bb678158: Pull complete
2ad500e1bf96: Pull complete
Digest: sha256:f02993cd1afd86b399f35dc7ca0240969e971c92b0232a8839cf17a37d6e7009
Status: Downloaded newer image for swarm
0de84fa62a1d9e9cc2156111f63ac31f

swarm create コマンドの出力結果がクラスタ用のトークンです。このトークンを安全な場所にコピーして覚えておきます。このトークンは、Swarm ノードのプロビジョニング時や、そのノードをクラスタに追加する時のクラスタ ID として使います。トークンはこの後で環境変数 SWARM_CLUSTER_TOKEN として参照します。

Swarm ノードのプロビジョン

クラスタの全てのノードは Engine をインストールしている必要があります。Machine で SWARM_CLUSTER_TOKEN を使えば、Machine でコマンドを1つ実行するだけで、Engine のホストをプロビジョニングし、Swarm のノードとして設定された状態にします。新しい仮想マシンを Swarm マネージャ・ノードの swarm-manager として作成します。

docker-machine create \
    -d virtualbox \
    --swarm \
    --swarm-master \
    --swarm-discovery token://SWARM_CLUSTER_TOKEN \
    swarm-manager

次に追加用のノードをプロビジョニングします。ここでも SWARM_CLUSTER_TOKEN を指定する必要があります。そして、各ホストには HOST_NODE_NAME でユニークな名前を付ける必要があります。

docker-machine create \
    -d virtualbox \
    --swarm \
    --swarm-discovery token://SWARM_CLUSTER_TOKEN \
    HOST_NODE_NAME

例えば、 HOST_NODE_NAME には node-01 のような名前を指定するでしょう。

注釈

ここまで実行したコマンドは Docker Hub が提供している Docker Swarm のホステッド・ディスカバリ・サービスに依存しています。もしも Docker Hub あるいはネットワークに問題があれば、これらのコマンド実行に失敗するでしょう。サービスが利用可能かどうか、 Docker Hub ステータス・ページ をご確認ください。Docker Hub で問題がある場合は復旧まで待つか、あるいは、別のディスカバリ・バックエンドの設定をご検討ください。

Machine でノード環境に接続

Machine 接続先のホストを環境変数で指定するには、 env サブコマンドの利用が一般的です。

eval "$(docker-machine env local)"

Docker Machine には、 env コマンドで Swarm ノードに接続するための、特別な --swarm フラグがあります。

docker-machine env --swarm HOST_NODE_NAME
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.101:3376"
export DOCKER_CERT_PATH="/Users/mary/.docker/machine/machines/swarm-manager"
export DOCKER_MACHINE_NAME="swarm-manager"
# Run this command to configure your shell:
# eval $(docker-machine env --swarm HOST_NODE_NAME)

シェル上の操作を swarm-manager という名称の Swarm ノードに切り替えるには、次のように実行します。

eval "$(docker-machine env --swarm swarm-manager)"

これで Docker CLI を使ってクラスタと相互に通信できるようになりました。

docker info
Containers: 2
Images: 1
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 1
 swarm-manager: 192.168.99.101:2376
  └ Status: Healthy
  └ Containers: 2
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=4.1.13-boot2docker, operatingsystem=Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015, provider=virtualbox, storagedriver=aufs
CPUs: 1
Total Memory: 1.021 GiB
Name: swarm-manager