docker
swarm
ubuntu16.04

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
apt更新
$ sudo apt-get update

準備できたら docker-engine をインストールします。

dockerインストール
$ apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ sudo apt-get install docker-engine

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

composeインストール
$ apt-get install docker-compose

また、ubuntuユーザーで docker コマンドを使えるように dockerグループについしておきます。

グループ追加
$ sudo gpasswd -a ubuntu docker

追加したらログインし直して作業を進めます。

master(Leader) nodeの作成

今回は3台とも manager node にします。まずは managermaster となる1台を作成します。

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

manager(Leader)作成
$ 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 が欲しいので以下のコマンドを実行して取得します。

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

manager(Leader)へ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です。

以上で完了です。それでは確認してみましょう。

node確認
$ 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 が盛り上がっているみたいですが、
Swarm もそんなに利用勝手は悪くなさそうです。 compose のymlもそのまま利用できますし、どれを使うかは場合によりけり何だろうなと思います。