Dockerを使って1ホストでスモールスタートできる構成を作る。
作りたい構成は普通のWebアプリがホストできるような、DBとWebサーバーが分離していて、ロードバランサがある構成だ。
全体の構成
1ホストだけubuntuで適当なクラウドサービスにセットアップする。
Dockerのマルチホストネットワークを利用する構成にする。docker-machineはややこしいので使わない。
参考:
Get started with multi-host networking
Build a Swarm cluster for production
コマンドはdocker-composeを利用してコマンド一発で構築できるようにしたい。
ちなみに、docker-xxが多くて混乱するが、このスライドがとても参考になった。
セットアップ手順
事前準備
ホストとなるマシンはでSSHと必要なポート443,80以外は閉じておく。クラスタを構築するホストはローカルで接続されている方がセキュリティ的に無難だし、セットアップが楽だ。
また、ユーザはdockerグループに属してないと、dockerコマンドが打てない。
usermod -a -G docker ubuntu
クラスタ構築
と言いつつ全部1ホストで実施している。
マネージャの構築
まず、docker-swarmでクラスタを構成する。swarmは複数あるdockerのホストをまとめて管理するためのツールであり、docker-composeをクラスタ構成で使うには必要そうだ。
設定同期のためのconsulコンテナを立ち上げる。
docker run -d --name consul -p "8500:8500" -h "consul" progrium/consul -server -bootstrap
swarmのmanagerを立ち上げる。これがdockerのクライアント(dockerコマンド)からの命令を受け付けて、consulに格納された情報を元にクラスタのメンバに命令を転送する。
docker run -d --name swarm-manager -p 4000:4000 swarm manage -H :4000 --advertise 192.168.1.10:4000 consul://192.168.1.10:8500
エージェントの設定
エージェント上で起動するdockerがswarmからコントロール可能なようにTCPでも待ち受けるようにする。エージェントとはmanagerによって操られる側のノードのことだ。
/etc/default/docker
に1行追加してデーモンを再起動する。ここで--cluster-advertise
と --cluster-store
をつけておかないと、ネットワーク作成時に"address space GlobalDefault not found"でエラーになる。
DOCKER_OPTS="-H tcp://0.0.0.0:2375 --cluster-store=consul://192.168.1.10:8500 --cluster-advertise=192.168.1.10:2375"
sudo systemctl restart docker.service
エージェントを起動する。
docker run --name swarm-agent -d swarm join --addr=192.168.1.10:2375 consul://192.168.1.10:8500/
ネットワークの作成
overlayドライバでネットワークを作成する。これは特にクラスタなど関係なくやっても良いみたい。
docker network create --driver overlay --subnet=10.0.9.0/24 my-net
おためし起動
コンテナをクラスタで起動できる。
docker -H :4000 run --net=my-net -it busybox /bin/sh
docker -H :4000 ps