Swarm を検証環境で試すには

この導入ガイドでは、Docker Swarm という Docker 用のネイティブなクラスタリング・ツールを使う方法を紹介します。

作業では、Docker Machine がインストールされた Docker Toolbox と、コンピュータ上の他のツールをいくつか使います。Docker Machine は Docker Engine ホスト群をプロビジョン(自動構築)するために使います。そして、Docker クライアントはホストに接続するために使います。ここでのホストとは、ディスカバリ・トークンを作成する場所であり、Swarm マネージャとノードでクラスタを作成・管理するための場所でもあります。

準備が完了したら、ローカルの Mac か Windows コンピュータで動く VirtualBox 上で Docker Swarm を起動します。この Swarm 環境は個人的な開発環境(サンドボックス)として使えます。

Docker Swarm を Linux 上で使う場合は、 プロダクション用の Swarm クラスタ構築 をご覧ください。

Docker Toolbox のインストール

Docker Toolbox のダウンロードとインストールをします。

Toolbox はローカルの Windows や Mac OS X コンピュータ上に便利なツールをインストールします。この練習では、3つのツールを使います。

  • Docker Machine: Docker Engine を実行する仮想マシンをデプロイします。
  • VirtualBox: Docker Machine を使い、仮想マシンのホストをデプロイします。
  • Docker クライアント: ローカルのコンピュータから仮想マシン上の Docker Engine に接続します。また、docker コマンドで Swarm クラスタを作成します。

以下のセクションでは各ツールの詳細を説明します。以降は仮想マシン(Virtual Machine)を VM と略します。

Docker Engine で3つの VM を作成

ここでは Docker Machine を使い、Docker Engine を動かす3つの VM を作成(プロビジョン)します。

  1. 自分のコンピュータ上のターミナルを開きます。Docker Machine で VirtualBox 上の VM 一覧を表示します。
$ docker-machine ls
NAME         ACTIVE   DRIVER       STATE     URL                         SWARM
default    *        virtualbox   Running   tcp://192.168.99.100:2376
  1. オプション: システム・リソースを節約するために、使っていない仮想マシンを停止します。例えば、 default という名前の VM を停止するには、次のようにします。
$ docker-machine stop default
  1. manager (マネージャ)という名前の VM を作成・実行します。
$ docker-machine create -d virtualbox manager
  1. agent1 (エージェント1)という名前の VM を作成・実行します。
$ docker-machine create -d virtualbox agent1
  1. agent2 (エージェント2)という名前の VM を作成・実行します。
$ docker-machine create -d virtualbox agent2

各 create コマンドの実行時、 boot2docker.iso と呼ばれる VM イメージの 最新版 がローカルにコピーされているかどうか(自動的に)確認します。ファイルが存在しないか最新版でなければ、Docker Machine は Docker Hub からイメージをダウンロードします。それから Docker Machine は boot2docker.iso を使い、Docker Engine を自動的に実行する VM を作成します。

注釈

トラブルシューティング:コンピュータやホストが Docker Hub にアクセスできなければ、 docker-machinedocker run コマンドは失敗します。そのような場合、サービスが利用可能かどうか Docker Hub ステータス・ページ を確認します。その次は、自分のコンピュータがインターネットに接続しているか確認します。それから VirtualBox のネットワーク設定で、ホストがインターネット側に接続可能かどうかを確認してください。

Swarm ディスカバリ・トークンの作成

ここでは Docker Hub 上にあるディスカバリ・バックエンドを使い、自分のクラスタ用のユニークなディスカバリ・トークンを作成します。このディスカバリ・バックエンドは、小規模の開発環境やテスト目的のためであり、プロダクション向けではありません。Swarm マネージャとノードを起動後、ディスカバリ・バックエンドにノードをクラスタのメンバとして登録します。クラスタとユニークなトークンを結び付けるのが、このバックエンドの役割です。ディスカバリ・バックエンドはクラスタのメンバのリストを最新情報に更新し続け、その情報を Swarm マネージャと共有します。Swarm マネージャはこのリストを使いノードに対してタスクを割り当てます。

  1. コンピュータ上の Docker クライアントを Docker Engine が動いている manager に接続します。
$ eval $(docker-machine env manager)

以降の手順では、 クライアント側の docker コマンドは manager 上の Docker Engine に送信します。

  1. Swarm クラスタに対するユニーク ID を作成します。
$ docker run --rm swarm create
.
.
.
Status: Downloaded newer image for swarm:latest
0ac50ef75c9739f5bfeeaf00503d4e6e

docker run コマンドは最新(latest)の swarm を取得し、コンテナとして実行します。引数 create は Swarm コンテナを Docker Hub ディスカバリ・サービスに接続し、ユニークな Swarm ID を取得します。この ID を「ディスカバリ・トークン」(discovery token)と呼びます。トークンは出力(アウトプット)されるだけであり、ホスト上のファイルには保管されません。 --rm オプションは自動的にコンテナを削除するものです。コンテナが終了したら、コンテナのファイルシステムを自動的に削除します。

トークンを利用しなければ、およそ一週間後にディスカバリ・サービスによって削除されます。

  1. 先ほどの出力されたディスカバリ・トークンを安全な場所にコピーします。

Swarm マネージャとノードの作成

ここでは、各ホストに接続し、Swarm マネージャまたはノードを作成します。

  1. 3つの VM の IP アドレスを取得します。例:
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER   ERRORS
agent1    -        virtualbox   Running   tcp://192.168.99.102:2376           v1.9.1
agent2    -        virtualbox   Running   tcp://192.168.99.103:2376           v1.9.1
manager   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.9.1
  1. クライアントは manager を実行する Docker Engine を指し示しているままでしょう。次の構文は manager 上で Swarm コンテナをプライマリ Swarm マネージャとして実行します。
$ docker run -d -p <your_selected_port>:3376 -t -v /var/lib/boot2docker:/certs:ro swarm manage -H 0.0.0.0:3376 --tlsverify --tlscacert=/certs/ca.pem --tlscert=/certs/server.pem --tlskey=/certs/server-key.pem token://<cluster_id>

例:

$ docker run -d -p 3376:3376 -t -v /var/lib/boot2docker:/certs:ro swarm manage -H 0.0.0.0:3376 --tlsverify --tlscacert=/certs/ca.pem --tlscert=/certs/server.pem --tlskey=/certs/server-key.pem token://0ac50ef75c9739f5bfeeaf00503d4e6e

-p オプションは、コンテナのポート 3376 をホスト上の 3376 に割り当てています。 -v オプションは TLS 証明書が入っているディレクトリ( manager VM 上の /var/lib/boot2docker )をマウントします。これは Swarm マネージャの中では読み込み専用(read-only)モードで扱われます。

  1. Docker クライアントを agent1 に接続します。
$ eval $(docker-machine env agent1)
  1. 次の構文は agent1 上で Swarm コンテナをエージェントとして起動します。IP アドレスは VM のものに書き換えます。
$ docker run -d swarm join --addr=<node_ip>:<node_port> token://<cluster_id>

例:

$ docker run -d swarm join --addr=192.168.99.102:2376 token://0ac50ef75c9739f5bfeeaf00503d4e6e
  1. Docker クライアントを agent2 に接続します。
$ eval $(docker-machine env agent2)
  1. agent2 上で Swarm コンテナをエージェントとして起動します。
$ docker run -d swarm join --addr=192.168.99.103:2376 token://0ac50ef75c9739f5bfeeaf00503d4e6e

Swarm クラスタを管理

ここではクラスタに接続し、Swarm マネージャとノードの情報を見ていきます。Swarm に対してコンテナ実行を命令し、どのノードで動作しているかを確認します。

  1. Docker クライアントを Swarm に接続するため、 DOCKER_HOST 環境変数を更新します。
$ DOCKER_HOST=<manager_ip>:<your_selected_port>

この例では manager の IP アドレスは 192.168.99.100 です。Swarm マネージャ用のポートは 3376 を選びました。

$ DOCKER_HOST=192.168.99.100:3376

Docker Swarm は標準 Docker API を使うため、Docker クライアントで接続できます。他にも Docker Compose や、Dokku、Jenkins、Krane などのツールが利用できます。

  1. Swarm に関する情報を取得します。
$ docker info

実行したら、Swarm 上にあるマネージャ1つと、エージェント・ノード2つの情報を表示します。

  1. Swarm 上で実行中のイメージを確認します。
$ docker ps
  1. Swarm 上でコンテナを実行します。
$ docker run hello-world
Hello from Docker.
.
.
.
  1. docker ps コマンドを使い、どのノードでコンテナが実行されているかを確認します。実行例:
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
0b0628349187        hello-world         "/hello"                 20 minutes ago      Exited (0) 20 minutes ago                       agent1
.
.
.

この例では、 swarm1 上で hello-world が動いていました。

Docker Swarm がコンテナをどのノードで実行するかを決めるには、デフォルトでは「spread」(スプレッド)ストラテジを使います。複数のコンテナを実行する場合、スプレッド・ストラテジはコンテナの実行数が最も少ないノードに対してコンテナを割り当てます。

更に詳しく

ここまでは次の作業を行いました。

  • Swarm ディスカバリ・トークンの作成
  • Docker Machine を使って Swarm ノードを作成
  • Swarm を使ってコンテナを実行
  • Swarm に関連する概念と技術を学んだ

この他にもDocker Swarm には多くの特徴や能力があります。より詳しい情報は、 Swarm のランディング・ページ(英語)Swarm ドキュメント をご覧ください。

参考

Evaluate Swarm in a sandbox
https://docs.docker.com/swarm/install-w-machine/