この記事の続きです:
"Play with Docker" で遊ぶ(1)

前回は Play with Docker(以下 "PwD")というサービスを使うことで Docker をインストールすることなく、ブラウザだけで docker コマンドを体験できることを紹介しました。今回はこのサービスの標準機能として提供されている Docker Swarm を使ったクラスタリング環境構築の手順を確認してみます。

Docker Swarm は Docker に対応したネイティブ&軽量なクラスタリング用のツールです。Docker の標準機能の一部として提供されているので、Kubernetes のように Docker 導入の後から追加でインストールする必要なく(Swarm モードに切り替えるだけで)利用できます。

では早速 PwD で Docker Swarm を使ってみましょう。まずは前回同様、Docker Hub のアカウントで PwD にログインします:
2019041901


PwD のダッシュボード画面が表示されます。まずは前回同様に "+ ADD NEW INSTANCE" をクリックして Docker インスタンスを追加します:
2019042101


"node1" という名称の Docker ノードインスタンスが追加され、操作するためのコンソールも表示されました。ここまでは前回と同じです:
2019042102


今回はクラスタリング環境を構築したいので、更に2つの Docker ノードインスタンスを追加します(合計3つにします)。あともう2回 "+ ADD NEW INSTANCE" をクリックして、"node2" と "node3" を追加します。こんな感じで Docker ノードを気軽に増やせるのは本当に便利です。。
2019042103


この時点で3つの Docker が(独立した状態で)準備できました。ではこの3つの Docker ノードを使ってクラスタリング環境を構築します。今回は node1 を管理ノード、node2 と node3 をワーカーノードとするクラスタリング環境とします。

まずは管理ノードを準備します。node1 を選択して、node1 のコンソールに以下のコマンドを入力します:
$ docker swarm init --advertise-addr eth0

2019042104


成功すると出力結果に
$ docker swarm join --token XXXXXX...
という内容が表示されます。これはワーカーノードとなるノードで入力すべきコマンドです。これで管理ノードの準備はできました。


では次にワーカーノードをこの管理ノードに接続します。先程の管理ノードでのコマンド出力結果の "docker swarm join --token XXXXXX..." 部分をそのまま node2 のコンソールにコピー&ペーストして実行します:
2019042105


"This node joined a swarm as a worker." というメッセージが表示されれば正しくワーカーノードとしてクラスタリングに追加し、初期化できたことになります。

同様に node3 でも同じコマンドを実行して、ワーカーノードとしてクラスタリングに追加します:
2019042106


これで3つの Docker インスタンスノードによるクラスタリング環境が構築できているはずです。念の為、node1 ノードで以下のコマンドを実行します:
$ docker node ls

実行結果を見ると、node1, node2, node3 の3つのノードがクラスタリングを構成している様子が表示され、かつ node1 が "Leader" (管理ノード)と表示されているはずです:2019042107



では、このクラスタリング環境でアプリケーションを実行してみます。なお原則的には以下のコマンドはすべて管理ノードである node1 ノードのコンソールを使います。

改めて node1 ノードで nginx のイメージを使って 80 番ポートで、1インスタンスで、"web" という名前でサービスを作成します:
$ docker service create --replicas 1 --name web -p 80:80 nginx

初回はイメージのダウンロードもあるので少し時間がかかりますが、以下のようなメッセージが表示され、正しくサービスが作成されます:
2019042108


動作確認する前に、この時点でサービスの様子を確認します。node1 ノードで以下のコマンドを実行します:
$ docker service ls

"web" というサービスがレプリカ1つで定義され、そのうちの1つが動いている形で 80 番ポートで作成されている様子が確認できます:
2019042109


実際に動作確認してみます。80 番ポートで公開されているので、curl コマンドを使って以下のコマンドを実行します(このコマンドは node2 や node3 で実行しても確認できます):
$ curl http://localhost/

Nginx 標準のトップページの HTML が表示されます。正しくサービスが動いている様子が確認できました:
2019042110


では、現在1インスタンスで稼働しているこのサービスを複数インスタンスとなるように node1 でスケールアウトさせてみます:
$ docker service scale web=3

3インスタンスで稼働するように指定しました。少し待ちますが、3つのインスタンスが "running" となることを確認します:
2019042101


改めてnode1 でレプリカ数を確認します:
$ docker service ls

結果、以下のように3つのレプリカが定義されており、そのうちの3つが動いている様子が確認できます:
2019042102


最後に作成したサービス(web)を削除する方法を紹介しておきます。node1 で以下のコマンドを実行します:
$ docker service rm web

これで web サービスはクラスタリング環境から削除されました:
2019042103



PwD 環境を使ったクラスタリング環境構築と、簡単なサービス作成&スケールアウト&削除といった手順を紹介しました。 通常、同じことを行うには3台のマシンを用意した上で、それぞれに Docker をインストールしておかないとこのような動作確認はできないのですが、PwD を使うと Docker 導入の手順を省略することができる上、全ての操作を1つのブラウザ画面上で行うことができるという点が勉強しやすいと感じました。