CentOS 7
 

Docker : Docker Swarm を利用する
2017/04/08
 
Docker Swarm を利用して、複数の Docker ホストでクラスター環境を構成します。
当例では以下の 3台の Docker ホストを使用して設定します。
Swarm クラスターではマネージャーノード [Manager nodes] とワーカーノード [Worker nodes] の二つの役割がありますが、 いずれの役割も複数ノード設定可能ですが、当例では以下のように node01 をマネージャーノード、その他をワーカーノードとして設定します。
 -----------+---------------------------+--------------------------+------------
            |                           |                          |
        eth0|10.0.0.51              eth0|10.0.0.52             eth0|10.0.0.53
 +----------+-----------+   +-----------+----------+   +-----------+----------+
 | [ node01.srv.world ] |   | [ node02.srv.world ] |   | [ node03.srv.world ] |
 |       Manager        |   |        Worker        |   |        Worker        |
 +----------------------+   +----------------------+   +----------------------+

[1] こちらを参照して全ノードで Docker サービスを起動しておきます。
なお、当例では Docker Engine 内蔵の Swarm モード機能を利用します。よって、Docker Engine のバージョンが v1.12 以降であることが前提です。 Docker のバージョンを確認し、v1.12 以前の場合は [yum update docker] してください。CentOS Extras リポジトリから更新可能です。
[root@node01 ~]#
docker -v

Docker version 1.12.6, build 96d83a5/1.12.6
[2] 全ノードでライブリストアオプションを無効にしておきます。(Swarm モードと共存不可のため)
[root@node01 ~]#
vi /etc/docker/daemon.json
{
    "live-restore": false
}

[root@node01 ~]#
systemctl restart docker

[3] マネージャーノードで Swarm クラスターの設定をします。
[root@node01 ~]#
docker swarm init

Swarm initialized: current node (2f7pmmoilf753g7wfctcik7yh) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-1l6o776w0ktvg6vw4cony5et76gkrjzw4xke0cmas3ftl6ghnm-8ppur7wbl9bej6fjcrdtaufsg \
    10.0.0.51:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[4] ワーカーノードから Swarm クラスターへの参加を実行します。
実行コマンドはマネージャーノードで swarm init した際に表示されたコマンドをそのまま実行すれば OK です。
[root@node02 ~]#
docker swarm join \
--token SWMTKN-1-1l6o776w0ktvg6vw4cony5et76gkrjzw4xke0cmas3ftl6ghnm-8ppur7wbl9bej6fjcrdtaufsg \
10.0.0.51:2377

This node joined a swarm as a worker.
[5] ワーカーノードが正常に Swarm クラスターに参加できていれば、マネージャーノードで node ls するとクラスター参加ノードの一覧が表示されます。
[root@node01 ~]#
docker node ls

ID                           HOSTNAME          STATUS  AVAILABILITY  MANAGER STATUS
2f7pmmoilf753g7wfctcik7yh *  node01.srv.world  Ready   Active        Leader
6ok99v3dkt9mg4jvzg7qi4zqb    node02.srv.world  Ready   Active
a3dtuaqibnrym3u3wg32cuq7p    node03.srv.world  Ready   Active
[6]
Swarm クラスターが正常に設定できたら、次に Swarm クラスターで提供するサービスを設定します。
当例では、こちらの例で作成したような httpd サービスを提供するコンテナイメージを利用して設定します。 コンテナイメージは全ノードで準備しておきます。ただし、当例では動作確認のため HTTP アクセス時の表示メッセージはノード毎に異なるものを設定しています。
[7] コンテナイメージが準備できたら、マネージャーノードでサービスを定義します。
サービス起動後は、マネージャーノードの設定したポート宛てにアクセスすると、サービスに設定したレプリカのノード数分の Dockerノードが応答します。 クラスター内のノードへのアクセスはラウンドロビン方式で振り分けられるため、アクセスごとに応答ノードが切り替わります。
[root@node01 ~]#
docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
web_server          latest              b7cf7440922c        4 minutes ago       306.4 MB
docker.io/centos    latest              98d35105a391        3 weeks ago         192.5 MB

# レプリカ数 2 でサービスを新規作成する

[root@node01 ~]#
docker service create --name swarm_cluster --replicas=2 -p 80:80 web_server:latest

7xg4yssy516xwgkjx2vxbw05d
# サービスの一覧を表示する

[root@node01 ~]#
docker service ls

ID            NAME           REPLICAS  IMAGE              COMMAND
7xg4yssy516x  swarm_cluster  2/2       web_server:latest

# サービスを調査する

[root@node01 ~]#
docker service inspect swarm_cluster --pretty

ID:             7xg4yssy516xwgkjx2vxbw05d
Name:           swarm_cluster
Mode:           Replicated
 Replicas:      2
Placement:
UpdateConfig:
 Parallelism:   1
 On failure:    pause
ContainerSpec:
 Image:         web_server:latest
Resources:
Ports:
 Protocol = tcp
 TargetPort = 80
 PublishedPort = 80

# サービスの稼働状況を表示する

[root@node01 ~]#
docker service ps swarm_cluster

ID              NAME             IMAGE              NODE              DESIRED STATE  CURRENT STATE               ERROR
78lh8sn1myw...  swarm_cluster.1  web_server:latest  node01.srv.world  Running        Running about a minute ago
4ag74wr59rb...  swarm_cluster.2  web_server:latest  node03.srv.world  Running        Running about a minute ago

# マネージャーノードにアクセスして動作確認

# ラウンドロビン方式で各ノードへ振り分けられる

[root@node01 ~]#
curl http://node01.srv.world/

Docker Node : node03.srv.world
[root@node01 ~]#
curl http://node01.srv.world/

Docker Node : node01.srv.world
[root@node01 ~]#
curl http://node01.srv.world/

Docker Node : node03.srv.world
[root@node01 ~]#
curl http://node01.srv.world/

Docker Node : node01.srv.world
[8] 設定したサービスのレプリカ数を変更したい場合は以下のように設定します。
# レプリカ数を 3 に変更する

[root@node01 ~]#
docker service scale swarm_cluster=3

swarm_cluster scaled to 3
[root@node01 ~]#
docker service ps swarm_cluster

ID              NAME             IMAGE              NODE              DESIRED STATE  CURRENT STATE           ERROR
78lh8sn1myw...  swarm_cluster.1  web_server:latest  node01.srv.world  Running        Running 34 minutes ago
4ag74wr59rb...  swarm_cluster.2  web_server:latest  node03.srv.world  Running        Running 34 minutes ago
46ecs1c0tjv...  swarm_cluster.3  web_server:latest  node02.srv.world  Running        Running 13 seconds ago

# アクセスして動作確認

[root@node01 ~]#
curl http://node01.srv.world/

Docker Node : node01.srv.world
[root@node01 ~]#
curl http://node01.srv.world/

Docker Node : node02.srv.world
[root@node01 ~]#
curl http://node01.srv.world/

Docker Node : node03.srv.world
 
Tweet