Docker Swarm: サービス稼働


前提


ドキュメント


ルーティング・メッシュ: デフォルトのロードバランシング

ロードバランシングしない場合は、hostモードを使う。


Swarm構成確認: docker node ls

docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
x1x2ydctuyw59gwr3wgn2rrut     g11                 Down                Pause                                   18.09.4
lnjx9rfbwyxs9ugyxebmmnez1     g151                Ready               Drain                                   18.09.5
nt0jy9ultanvgvy7wg58nrinp     g152                Ready               Active                                  18.09.5
bp3f23uufxh3g61arqiporoea *   host                Ready               Active              Leader              18.09.5

サービス

例: 負荷分散のためWebサーバ(コンテナ)を複数稼働させるとき、Webサーバの定義がサービスで、定義を満たすようにマネージャからワーカーへの個々のコンテナ発注がタスク。


docker serviceコマンド

サブコマンド流れ

  1. create: サービス作成・稼働
  2. ls: サービスリスト
  3. ps: タスクリスト
  4. inspect: サービス詳細
  5. logs: ログ
  6. scale: スケーリング
  7. rm: サービス停止・削除

途中、メンテ等でノードの可用性を変えるとき、docker node update --availabilityを使う。


サービス作成・稼働: docker service create

nginxサーバを3台稼働

# マネージャで
docker service create \
  --name hello-swarm \
  --replicas 3 \
  --publish published=8080,target=80 \
  nginx:stable-alpine

サービスのリスト: docker service ls

docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
sndvhnr9atb9        hello-swarm         replicated          3/3                 nginx:stable-alpine   *:8080->80/tcp

タスクのリスト: docker service ps

docker service ps hello-swarm
ID             NAME            IMAGE                 NODE   DESIRED STATE   CURRENT STATE           ERROR   PORTS
nz2rwoxke4em   hello-swarm.1   nginx:stable-alpine   g152   Running         Running 4 minutes ago
5hgmvwo57wpg   hello-swarm.2   nginx:stable-alpine   g152   Running         Running 4 minutes ago
zuc34146cn17   hello-swarm.3   nginx:stable-alpine   host   Running         Running 4 minutes ago

サービス詳細: docker service inspect

docker service inspect --pretty hello-swarm
ID:        sndvhnr9atb93kjm0hbh5jo0a
Name:        hello-swarm
Service Mode:    Replicated
 Replicas:    3
Placement:
UpdateConfig:
 Parallelism:    1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:    1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:        nginx:stable-alpine@sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7
 Init:        false
Resources:
Endpoint Mode:    vip
Ports:
 PublishedPort = 8080
  Protocol = tcp
  TargetPort = 80
  PublishMode = ingress

ログ: docker service logs

docker service logs hello-swarm
hello-swarm.1.phgjsecoo7uq@g152    | 10.255.0.3 - - [12/Apr/2019:07:20:56 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
hello-swarm.2.iz75avf130ka@host    | 10.255.0.2 - - [12/Apr/2019:07:23:05 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"
hello-swarm.3.58j1vf2dppoe@host    | 10.255.0.4 - - [12/Apr/2019:07:22:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

スケーリング: docker service scale

docker service scale hello-swarm=4

ノードの可用性を変更: docker node update

# ノードg151を復活してg152のタスク割当をやめる
docker node update --availability active g151
docker node update --availability drain g152

# タスク確認
docker service ps hello-swarm
ID            NAME              IMAGE                 NODE   DESIRED STATE   CURRENT STATE           ERROR   PORTS
sfyjb6mjma38  hello-swarm.1     nginx:stable-alpine   g151   Running         Starting 2 seconds ago
nz2rwoxke4em   \_ hello-swarm.1 nginx:stable-alpine   g152   Shutdown        Shutdown 2 seconds ago
# (略)

サービス削除: docker service rm

docker service rm hello-swarm

hostモード: ロードバランシングせず、そのノードのコンテナにアクセス