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 を作成(プロビジョン)します。
- 自分のコンピュータ上のターミナルを開きます。Docker Machine で VirtualBox 上の VM 一覧を表示します。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
default * virtualbox Running tcp://192.168.99.100:2376
- オプション: システム・リソースを節約するために、使っていない仮想マシンを停止します。例えば、
default
という名前の VM を停止するには、次のようにします。
$ docker-machine stop default
manager
(マネージャ)という名前の VM を作成・実行します。
$ docker-machine create -d virtualbox manager
agent1
(エージェント1)という名前の VM を作成・実行します。
$ docker-machine create -d virtualbox agent1
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-machine
や docker run
コマンドは失敗します。そのような場合、サービスが利用可能かどうか Docker Hub ステータス・ページ を確認します。その次は、自分のコンピュータがインターネットに接続しているか確認します。それから VirtualBox のネットワーク設定で、ホストがインターネット側に接続可能かどうかを確認してください。
Swarm ディスカバリ・トークンの作成¶
ここでは Docker Hub 上にあるディスカバリ・バックエンドを使い、自分のクラスタ用のユニークなディスカバリ・トークンを作成します。このディスカバリ・バックエンドは、小規模の開発環境やテスト目的のためであり、プロダクション向けではありません。Swarm マネージャとノードを起動後、ディスカバリ・バックエンドにノードをクラスタのメンバとして登録します。クラスタとユニークなトークンを結び付けるのが、このバックエンドの役割です。ディスカバリ・バックエンドはクラスタのメンバのリストを最新情報に更新し続け、その情報を Swarm マネージャと共有します。Swarm マネージャはこのリストを使いノードに対してタスクを割り当てます。
- コンピュータ上の Docker クライアントを Docker Engine が動いている
manager
に接続します。
$ eval $(docker-machine env manager)
以降の手順では、 クライアント側の docker
コマンドは manager
上の Docker Engine に送信します。
- 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
オプションは自動的にコンテナを削除するものです。コンテナが終了したら、コンテナのファイルシステムを自動的に削除します。
トークンを利用しなければ、およそ一週間後にディスカバリ・サービスによって削除されます。
- 先ほどの出力されたディスカバリ・トークンを安全な場所にコピーします。
Swarm マネージャとノードの作成¶
ここでは、各ホストに接続し、Swarm マネージャまたはノードを作成します。
- 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
- クライアントは
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)モードで扱われます。
- Docker クライアントを
agent1
に接続します。
$ eval $(docker-machine env agent1)
- 次の構文は
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
- Docker クライアントを
agent2
に接続します。
$ eval $(docker-machine env agent2)
agent2
上で Swarm コンテナをエージェントとして起動します。
$ docker run -d swarm join --addr=192.168.99.103:2376 token://0ac50ef75c9739f5bfeeaf00503d4e6e
Swarm クラスタを管理¶
ここではクラスタに接続し、Swarm マネージャとノードの情報を見ていきます。Swarm に対してコンテナ実行を命令し、どのノードで動作しているかを確認します。
- 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 などのツールが利用できます。
- Swarm に関する情報を取得します。
$ docker info
実行したら、Swarm 上にあるマネージャ1つと、エージェント・ノード2つの情報を表示します。
- Swarm 上で実行中のイメージを確認します。
$ docker ps
- Swarm 上でコンテナを実行します。
$ docker run hello-world
Hello from Docker.
.
.
.
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/