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-master`` として作成します。

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

次に追加用のノードをプロビジョニングします。ここでも 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-master"
export DOCKER_MACHINE_NAME="swarm-master"
# Run this command to configure your shell:
# eval $(docker-machine env --swarm HOST_NODE_NAME)

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

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

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

docker info
Containers: 2
Images: 1
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 1
 swarm-master: 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-master