#author("2018-08-31T09:49:15+09:00","","")

#author("2018-08-31T09:51:47+09:00","","")

[[CentOS7]]

*Docker : Docker Swarm を利用する [#la235ad7]

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.hoge.com ] |   | [ node02.hoge.com ] |   | [ node03.hoge.com ] |
 |       Manager        |   |        Worker        |   |        Worker        |
 +----------------------+   +----------------------+   +----------------------+



[[こちらを参照して全ノードで Docker サービスを起動>Dockerインストール]]しておきます。

なお、当例では Docker Engine 内蔵の Swarm モード機能を利用します。よって、Docker Engine のバージョンが v1.12 以降であることが前提です。 Docker のバージョンを確認し、v1.12 以前の場合は [yum update docker] してください。CentOS Extras リポジトリから更新可能です。

|BGCOLOR(black):COLOR(white):|c
|[root@node01 ~]# docker -v|
|Docker version 1.12.6, build 96d83a5/1.12.6|



全ノードでライブリストアオプションを無効にしておきます。(Swarm モードと共存不可のため)

|BGCOLOR(black):COLOR(white):|c
|[root@node01 ~]# vi /etc/docker/daemon.json|
|{ &br;     "live-restore": false &br; }|
|[root@node01 ~]# systemctl restart docker|



マネージャーノードで Swarm クラスターの設定をします。

|BGCOLOR(black):COLOR(white):|c
|[root@node01 ~]# docker swarm init|
|Swarm initialized: current node (2f7pmmoilf753g7wfctcik7yh) is now a manager. &br;  &br; To add a worker to this swarm, run the following command: &br;  &br;     docker swarm join \ &br;     --token SWMTKN-1-1l6o776w0ktvg6vw4cony5et76gkrjzw4xke0cmas3ftl6ghnm-8ppur7wbl9bej6fjcrdtaufsg \ &br;     10.0.0.51:2377 &br;  &br; To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. &br; |



ワーカーノードから Swarm クラスターへの参加を実行します。

実行コマンドはマネージャーノードで swarm init した際に表示されたコマンドをそのまま実行すれば OK です。

|BGCOLOR(black):COLOR(white):|c
|[root@node02 ~]# docker swarm join \ &br; --token SWMTKN-1-1l6o776w0ktvg6vw4cony5et76gkrjzw4xke0cmas3ftl6ghnm-8ppur7wbl9bej6fjcrdtaufsg \ &br; 10.0.0.51:2377  &br; This node joined a swarm as a worker. &br; |



ワーカーノードが正常に Swarm クラスターに参加できていれば、マネージャーノードで node ls するとクラスター参加ノードの一覧が表示されます。

|BGCOLOR(black):COLOR(white):|c
|[root@node01 ~]# docker node ls|
|ID                           HOSTNAME          STATUS  AVAILABILITY  MANAGER STATUS &br; 2f7pmmoilf753g7wfctcik7yh *  node01.hoge.com  Ready   Active        Leader &br; 6ok99v3dkt9mg4jvzg7qi4zqb    node02.hoge.com  Ready   Active &br; a3dtuaqibnrym3u3wg32cuq7p    node03.hoge.com  Ready   Active &br; |



Swarm クラスターが正常に設定できたら、次に Swarm クラスターで提供するサービスを設定します。
当例では、こちらの例で作成したような httpd サービスを提供するコンテナイメージを利用して設定します。 コンテナイメージは全ノードで準備しておきます。ただし、当例では動作確認のため HTTP アクセス時の表示メッセージはノード毎に異なるものを設定しています。



コンテナイメージが準備できたら、マネージャーノードでサービスを定義します。

サービス起動後は、マネージャーノードの設定したポート宛てにアクセスすると、サービスに設定したレプリカのノード数分の Dockerノードが応答します。 クラスター内のノードへのアクセスはラウンドロビン方式で振り分けられるため、アクセスごとに応答ノードが切り替わります。

|BGCOLOR(black):COLOR(white):|c
|[root@node01 ~]# docker images|
|REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE &br; web_server          latest              b7cf7440922c        4 minutes ago       306.4 MB &br; docker.io/centos    latest              98d35105a391        3 weeks ago         192.5 MB &br; |
|&color(lightpink){# レプリカ数 2 でサービスを新規作成する};|
|[root@node01 ~]# docker service create --name swarm_cluster --replicas=2 -p 80:80 web_server:latest|
|7xg4yssy516xwgkjx2vxbw05d|
|&color(lightpink){# サービスの一覧を表示する};|
|[root@node01 ~]# docker service ls|
|ID            NAME           REPLICAS  IMAGE              COMMAND &br; 7xg4yssy516x  swarm_cluster  2/2       web_server:latest|
|&color(lightpink){# サービスを調査する};|
|[root@node01 ~]# docker service inspect swarm_cluster --pretty|
|ID:             7xg4yssy516xwgkjx2vxbw05d &br; Name:           swarm_cluster &br; Mode:           Replicated &br;  Replicas:      2 &br; Placement: &br; UpdateConfig: &br;  Parallelism:   1 &br;  On failure:    pause &br; ContainerSpec: &br;  Image:         web_server:latest &br; Resources: &br; Ports: &br;  Protocol = tcp &br;  TargetPort = 80 &br;  PublishedPort = 80 &br; |






|&color(lightpink){# サービスの稼働状況を表示する};|
|[root@node01 ~]# docker service ps swarm_cluster|
|ID      NAME            IMAGE             NODE             DESIRED STATE CURRENT STATE   ERROR &br; 

78lh... swarm_cluster.1 web_server:latest node01.hoge.com Running       Running about.. &br; 

4ag7... swarm_cluster.2 web_server:latest node03.hoge.com Running       Running about.. &br; |

|&color(lightpink){# マネージャーノードにアクセスして動作確認 &br; # ラウンドロビン方式で各ノードへ振り分けられる|

|ID      NAME            IMAGE             NODE             DESIRED STATE CURRENT STATE   ERROR &br; 78lh... swarm_cluster.1 web_server:latest node01.hoge.com Running       Running about.. &br; 4ag7... swarm_cluster.2 web_server:latest node03.hoge.com Running       Running about.. &br; |

|&color(lightpink){# マネージャーノードにアクセスして動作確認 &br; # ラウンドロビン方式で各ノードへ振り分けられる};|

|[root@node01 ~]# curl http://node01.hoge.com/|
|Docker Node : node03.hoge.com|
|[root@node01 ~]# curl http://node01.hoge.com/|
|Docker Node : node01.hoge.com|
|[root@node01 ~]# curl http://node01.hoge.com/|
|Docker Node : node03.hoge.com|
|[root@node01 ~]# curl http://node01.hoge.com/|
|Docker Node : node01.hoge.com|



設定したサービスのレプリカ数を変更したい場合は以下のように設定します。

|BGCOLOR(black):COLOR(white):|c
|&color(lightpink){# レプリカ数を 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 &br; 78l... swarm_cluster.1 web_server:latest node01.hoge.com Running       Running 34 mi.. &br; 4ag... swarm_cluster.2 web_server:latest node03.hoge.com Running       Running 34 mi.. &br; 46e... swarm_cluster.3 web_server:latest node02.hoge.com Running       Running 13 se..|
|&color(lightpink){# アクセスして動作確認};|
|[root@node01 ~]# curl http://node01.hoge.com/|
|Docker Node : node01.hoge.com|
|[root@node01 ~]# curl http://node01.hoge.com/|
|Docker Node : node02.hoge.com|
|[root@node01 ~]# curl http://node01.hoge.com/|
|Docker Node : node03.hoge.com|

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS