概要
前回 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 件のコメント:
コメントを投稿