"UbuntuでDocker Swarmクラスタをセットアップする。"

はじめに

Ubuntu 16.0.4 のサーバーを3台用意してそれを Docker Swarm でクラスタを組んだのでそれをまとめました。

docker-whales-transparent.png


# 構成 今回行う構成は3台とも _manager&worker_ でクラスタを組む構成です。

イメージ docker-swarm.png


# Dockerインストール とりあえず全てのサーバーに _docker-engine_ をインストールします。

イメージ スクリーンショット 2017-09-29 13.22.14.png

まず、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 をインストールします。

$ sudo apt-get install docker-engine

今回使うわけではないですが、docker compose もインストールしておきます。

$ apt-get install docker-compose

# master(Leader) nodeの作成 今回は3台とも _manager node_ にします。まずは _manager_ の _master_ となる1台を作成します。

イメージ スクリーンショット 2017-09-29 14.21.34.png

$ 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 に追加します。

イメージ スクリーンショット 2017-09-29 13.26.12.png

$ 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-1docker node ls を実行したということです。 また、 MANAGER STATUSLeader となっているのがはじめに swarm init した master となる nodeReachable となっているのが追加した _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](https://kubernetes.io) が盛り上がっているみたいですが、 _Swarm_ もそんなに利用勝手は悪くなさそうです。 _compose_ のymlもそのまま利用できますし、どれを使うかは場合によりけり何だろうなと思います。