2017年10月6日金曜日

VirtualBox 上で docker swarm 環境を構築してみた

概要

前回 VirtualBox 上で docker-machine コマンドを試してみました
今回は swarm クラスタを構築してみます

環境

  • macOS X 10.12.6
  • docker 17.09.0-ce
  • docker-machine 0.12.2
  • VirtualBox 5.1.26 r117224 (Qt5.6.2)

swarm コンテナの作成

まず docker swarm を管理するための swarm コンテナを作成します
swarm コンテナを作成することでクラスタを管理するトークンが払い出されます

  • docker run swarm create
Unable to find image 'swarm:latest' locally
latest: Pulling from library/swarm
237b7f0588af: Pull complete 
25637219010c: Pull complete 
5a434bba05af: Pull complete 
Digest: sha256:cc94ce2e6d4603fe9077919db5a4508f7441cad7ae57ccd420fd14af3b3d4383
Status: Downloaded newer image for swarm:latest
Token based discovery is now deprecated and might be removed in the future.
It will be replaced by a default discovery backed by Docker Swarm Mode.
Other mechanisms such as consul and etcd will continue to work as expected.
15600e5fd4539b9bed3247ef6df12a28

最後の文字列がトークンになります

swarm マスタ用のコンテナホストの作成

まずは swarm クラスタ内でマスタとなるコンテナホストを作成します

  • docker-machine create --driver virtualbox --swarm --swarm-master --swarm-discovery token://15600e5fd4539b9bed3247ef6df12a28 swarm-manager

先ほどのトークンを付与してコンテナホストを作成します
名前は swarm-manager にしました

  • docker-machine ls
NAME            ACTIVE   DRIVER       STATE     URL                         SWARM                    DOCKER        ERRORS
dev             *        virtualbox   Running   tcp://192.168.99.100:2376                            v17.09.0-ce   
swarm-manager   -        virtualbox   Running   tcp://192.168.99.101:2376   swarm-manager (master)   v17.09.0-ce   

こんな感じで作成されました
SWARM の欄に (master) が付与されているのがわかると思います

swarm 用のノードを追加する

マスタノードが追加できたら通常のノードの追加してスケールさせてみましょう

  • docker-machine create --driver virtualbox --swarm --swarm-discovery token://15600e5fd4539b9bed3247ef6df12a28 node1

これで node1 というコンテナホストが swarm クラスタに追加されました

  • docker-machine ls
NAME            ACTIVE   DRIVER       STATE     URL                         SWARM                    DOCKER        ERRORS
dev             *        virtualbox   Running   tcp://192.168.99.100:2376                            v17.09.0-ce   
node1           -        virtualbox   Running   tcp://192.168.99.102:2376   swarm-manager            v17.09.0-ce   
swarm-manager   -        virtualbox   Running   tcp://192.168.99.101:2376   swarm-manager (master)   v17.09.0-ce   

コンテナを作成してみる

では swarm クラスタ上にコンテナを作成してみます
docker コマンドは master に対して行います
--swarm オプションを付けて env を eval します

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

クラスタ内に同一ポートで LISTEN する複数の nginx を起動してみましょう
そして後で気がついたのですがクラスタ上のコンテナホストが pull している間はプログレスバーが表示されないのでプロンプトが返ってこないときは少し待ちましょう

  • docker run -d -p 80:80 nginx

本来なら 80 ポートは 1 つしか LISTEN できませんがクラスタ構成を組んでいるため複数の 80 ポートでコンテナを立ち上げても問題ありません

  • docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                     NAMES
667ee2d80055        nginx               "nginx -g 'daemon ..."   29 seconds ago      Up 28 seconds       192.168.99.102:80->80/tcp                 swarm-manager/hungry_jepsen
14a25c2c6a10        nginx               "nginx -g 'daemon ..."   12 minutes ago      Up 12 minutes       192.168.99.101:80->80/tcp                 node1/focused_shirley
b7a6149eaaab        swarm:latest        "/swarm join --adv..."   20 minutes ago      Up 20 minutes       2375/tcp                                  swarm-manager/swarm-agent
508de153df38        swarm:latest        "/swarm manage --t..."   21 minutes ago      Up 21 minutes       2375/tcp, 192.168.99.102:3376->3376/tcp   swarm-manager/swarm-agent-master
5ad4d9075986        swarm:latest        "/swarm join --adv..."   25 minutes ago      Up 25 minutes       2375/tcp                                  node1/swarm-agent

ただ、今回の場合クラスタ内のコンテナホストは 2 台しかないのでもう 1 つ 80 ポートで LISTEN するコンテナを立ち上げようとするとエラーとなります

docker: Error response from daemon: Unable to find a node that satisfies the following conditions 
[port 80 (Bridge mode)].
See 'docker run --help'.

最後に

VirtualBox で docker swarm を試してみました

かつては consul or etcd など KVS が必要だったのですが現在では不要です
代わりにトークンを使って swarm を管理しています
もちろん etcd or consul or zookeeper などの KVS を使って swarm を管理することも可能です

swarm create したコンテナはクラスタ構築後には不要なので rm して問題ないです
ちなみに swarm create したコンテナホストも削除して問題ないです
swarm コマンドを後々叩くのであればとっておいても良いかと思います (failover の設定など)
swarm コマンドは swarm-master 上でも叩けます (docker run swarm list token://15600e5fd4539b9bed3247ef6df12a28)

master ではないコンテナホストが再起動すると内部で動いている swarm-agent 用のコンテナは自動起動しませんでした
なので、コンテナホストが再起動した場合 swarm-agent コンテナは手動で起動する必要があります

docker swarm の failover については別途いろいろと設定が必要になるようです
今回の記事の内容では触れていないので興味があればこちらをご覧ください

今回のように複数のホストをまたがってコンテナを動作させる場合コンテナのロードバランシングも必要になります
コンテナホスト側の IP のバランシングも必要ですが、クラスタ内のコンテナのバランシングも必要になります
docker swarm には service 機能を使った Ingress Load balancing という標準の機能もあります

とまぁ一重に docker swarm と言ってもいろいろと考えることは多いです

次回は docker swarm 上で overlay ネットワークを作成して別ホストにあるコンテナ同士で直接通信させてみたいと思います

参考サイト

0 件のコメント:

コメントを投稿