はじめに
Ubuntu 16.0.4 のサーバーを3台用意してそれを Docker Swarm でクラスタを組んだのでそれをまとめました。
構成
今回行う構成は3台とも manager&worker でクラスタを組む構成です。
Dockerインストール
とりあえず全てのサーバーに docker-engine をインストールします。
まず、aptをhttps越しで利用できるようにするためのライブラリをインストールします。
$ sudo apt-get install apt-transport-https ca-certificates
次に docker のインストールに使うリポジトリを追加します。
$ sudo vim /etc/apt/sources.list.d/docker.list
$ cat /etc/apt/sources.list.d/docker.list
deb https://apt.dockerproject.org/repo ubuntu-xenial main
$ sudo apt-get update
準備できたら docker-engine をインストールします。
$ apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ sudo apt-get install docker-engine
今回使うわけではないですが、docker compose もインストールしておきます。
$ apt-get install docker-compose
また、ubuntuユーザーで docker コマンドを使えるように dockerグループについしておきます。
$ sudo gpasswd -a ubuntu docker
追加したらログインし直して作業を進めます。
master(Leader) nodeの作成
今回は3台とも manager node にします。まずは manager の master となる1台を作成します。
$ docker swarm init
Swarm initialized: current node (71uuiqwvlcizxln4bfk3gvr4a) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0ymf7p2vy09a15usvwbb6ya04hqg7b0aaupj0xp3vfy137nrhr-5k87wh49qn3j7ml6b8kxiz5t7 \
172.31.17.88:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
ここで init した際に出てくるのは _worker_用の token です。今回は _manager_用の token が欲しいので以下のコマンドを実行して取得します。
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0ymf7p2vy09a15usvwbb6ya04hqg7b0aaupj0xp3vfy137nrhr-0blrkkwxwghkddo7hk5tkcy2y \
172.31.17.88:2377
これであとは各ノードとなるサーバーへログインし、追加していく作業となります。
nodeへの参加
それでは node-2 を先ほど作成した manager node に追加します。
$ docker swarm join --token SWMTKN-1-0ymf7p2vy09a15usvwbb6ya04hqg7b0aaupj0xp3vfy137nrhr-0blrkkwxwghkddo7hk5tkcy2y 172.31.17.88:2377
This node joined a swarm as a manager.
これで、追加されました。残りの1台も同様に追加します。
もし、 manager ではなく worker として追加したい場合は --token オプションの値を worker のにしてあげるだけでOKです。
以上で完了です。それでは確認してみましょう。
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
71uuiqwvlcizxln4bfk3gvr4a * node-1 Ready Active Leader
musl2m94jqx7gb0fa953rd43j node-3 Ready Active Reachable
nwhmqq24zkvgbxlbsq8zut4vo node-2 Ready Active Reachable
ここで「*」が付いているのがコマンドを実行したnodeです。つまりここでは node-1 で docker node ls
を実行したということです。
また、 MANAGER STATUS が Leader となっているのがはじめに swarm init
した master となる node で Reachable となっているのが追加した _node_となります。もし、 worker として node を追加した場合は、ここの項目は blank になります。
デプロイ
クラスタが組めたので、何かデプロイしてみます。
今回は nginx のコンテナをデプロイしてみました。
$ docker service create --replicas 1 --name web -p 80:80 nginx
zelm5elrp6czm1mtisk942ujx
デプロイができたらサービスを確認してみます。
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
zelm5elrp6cz web replicated 1/1 nginx:latest *:80->80/tcp
$ docker service ps web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
mjbwdr63zfyo web.1 nginx:latest node1 Running Running 3 minutes ago
node1 で nginx コンテナが1台 web というサービス名で起動しているのが確認できました。
それではこのサービスをコンテナ3台にスケールしてみます。
$ docker service scale web=3
web scaled to 3
$ docker service ps web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
mjbwdr63zfyo web.1 nginx:latest node1 Running Running 4 minutes ago
jmm52jos2vgl web.2 nginx:latest node3 Running Running 8 seconds ago
sbpa751k6wwa web.3 nginx:latest node2 Running Running 8 seconds ago
各nodeに1台ずつコンテナが起動しているのが確認できました。
おわりに
最近は kubernetes が盛り上がっているみたいですが、
Swarm もそんなに利用勝手は悪くなさそうです。 compose のymlもそのまま利用できますし、どれを使うかは場合によりけり何だろうなと思います。