Docker : Docker Swarm を利用する2018/11/07 |
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] |
当例では、Firewalld 停止 および SELnux は Permissive または Disabled を前提に進めます。
|
[2] |
こちらを参照して全ノードで Docker サービスを起動しておきます。
|
[3] | 全ノードでライブリストアオプションを無効化しておきます。ライブリストアとSwarmモードは共存不可です。 |
[root@node01 ~]#
vi /etc/sysconfig/docker # 4行目:コメント化し5行目に [live-restore] を削除した行を追記 # ライブリストアとSwarmモードは共存不可 # OPTIONS='--selinux-enabled --log-driver=journald --live-restore'OPTIONS='--selinux-enabled --log-driver=journald'
systemctl restart docker |
[4] | マネージャーノードで Swarm クラスターの設定をします。 |
[root@node01 ~]# docker swarm init Swarm initialized: current node (pojsu8tvixbfwpnrsj2tadlwg) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-2kvisbt5skhhq4temzsqn21vgjdfgn7mowe01dsorgaduamx80-c04zx7stbda65p8d56iiajg4m \ 10.0.0.51:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. |
[5] | ワーカーノードから Swarm クラスターへの参加を実行します。 実行コマンドはマネージャーノードで swarm init した際に表示されたコマンドをそのまま実行すれば OK です。 |
[root@node02 ~]# docker swarm join \
--token SWMTKN-1-2kvisbt5skhhq4temzsqn21vgjdfgn7mowe01dsorgaduamx80-c04zx7stbda65p8d56iiajg4m \
10.0.0.51:2377
This node joined a swarm as a worker.
|
[6] | ワーカーノードが正常に Swarm クラスターに参加できていれば、マネージャーノードで node ls するとクラスター参加ノードの一覧が表示されます。 |
[root@node01 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS pojsu8tvixbfwpnrsj2tadlwg * node01.srv.world Ready Active Leader tjjn75t9tmhmfwk6ftoz1gsp0 node03.srv.world Ready Active vq7ycrxgpf8jhri1x1md5t5ry node02.srv.world Ready Active |
[7] |
Swarm クラスターが正常に設定できたら、次に Swarm クラスターで提供するサービスを設定します。
当例では、こちらの例で作成したような httpd サービスを提供するコンテナイメージを利用して設定します。 コンテナイメージは全ノードで準備しておきます。ただし、当例では動作確認のため HTTP アクセス時の表示メッセージはノード毎に異なるものを設定しています。 |
[8] | コンテナイメージが準備できたら、マネージャーノードでサービスを定義します。 サービス起動後は、マネージャーノードの設定したポート宛てにアクセスすると、サービスに設定したレプリカのノード数分の Dockerノードが応答します。 クラスター内のノードへのアクセスはラウンドロビン方式で振り分けられるため、アクセスごとに応答ノードが切り替わります。 |
[root@node01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE web_server latest 016a56dd6080 11 minutes ago 512 MB docker.io/fedora latest 8c568f104326 3 hours ago 267 MB # レプリカ数 2 でサービスを新規作成する [root@node01 ~]# docker service create --name swarm_cluster --replicas=2 -p 80:80 web_server:latest 1xixq7jmy6la590k3d54uin0k # サービスの一覧を表示する [root@node01 ~]# docker service ls ID NAME MODE REPLICAS IMAGE 1xixq7jmy6la swarm_cluster replicated 2/2 web_server:latest # サービスを調査する [root@node01 ~]# docker service inspect swarm_cluster --pretty ID: 1xixq7jmy6la590k3d54uin0k Name: swarm_cluster Service Mode: Replicated Replicas: 2 Placement: UpdateConfig: Parallelism: 1 On failure: pause Max failure ratio: 0 ContainerSpec: Image: web_server:latest Resources: Endpoint Mode: vip Ports: PublishedPort 80 Protocol = tcp TargetPort = 80 # サービスの稼働状況を表示する [root@node01 ~]# docker service ps swarm_cluster ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS sgro87htqs3h swarm_cluster.1 web_server:latest node03.srv.world Running Running 7 minutes ago a5vqor24ceg1 swarm_cluster.2 web_server:latest node01.srv.world Running Running 7 minutes ago # マネージャーノードにアクセスして動作確認 # ラウンドロビン方式で各ノードへ振り分けられる [root@node01 ~]# curl http://node01.srv.world/ node02 [root@node01 ~]# curl http://node01.srv.world/ node03 [root@node01 ~]# curl http://node01.srv.world/ node02 [root@node01 ~]# curl http://node01.srv.world/ node03 |
[9] | 設定したサービスのレプリカ数を変更したい場合は以下のように設定します。 |
# レプリカ数を 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 PORTS sgro87htqs3h swarm_cluster.1 web_server:latest node03.srv.world Running Running 10 minutes ago a5vqor24ceg1 swarm_cluster.2 web_server:latest node01.srv.world Running Running 10 minutes ago obm0zzilqptz swarm_cluster.3 web_server:latest node02.srv.world Running Preparing 14 seconds ago # アクセスして動作確認 [root@node01 ~]# curl http://node01.srv.world/ node02 [root@node01 ~]# curl http://node01.srv.world/ node03 [root@node01 ~]# curl http://node01.srv.world/ node01 |
Sponsored Link |