Docker Compose入門
今日から始めるComposeの初歩からswarm mode対応まで
Engineer / Technology Evangelist, SAKURA Internet, Inc.
@zembutsu 前佛 雅人 ZEMBUTSU Masahito
2017年6月14日(水) #mastercloud
今日お伝えすること
Docker Compose 基本概念
Compose を YAML で動かす
docker stack と swarm mode
3
Compose とは?
基本概念と役割
Docker Compose
4
Introducing Moby Project: a new open-source project to advance the software containerization movement - Docker Blog
https://blog.docker.com/2017/04/introducing-the-moby-project/
A new upstream project to break up Docker into independent components by shykes · Pull Request #32691 · moby/moby
https://github.com/moby/moby/pull/32691
Docker と周辺ツールやプロジェクトとの関係性まとめ
references
2013
Docker
LXC
+
2014
libcontainer
ver0.9
デーモン
Linux向けコンテナ用
ライブラリ(当時開発中)
独自にライブラリを実装
2015
Docker Engine
デーモンの呼称を変更
補助ツール群の登場
Docker Swarm
Docker Compose
Docker Machine
2016 2017
runC
v1.11
OCI基準のランタイムの1つ
“docker”バイナリから
dockerd デーモンに代わり
Linux capabilityの管理
Engine (dockerd)
containerD
OCI準拠のランタイムを
動かすスーパーバイザ
v1.11
Docker独自規格
業界規格・共通技術
CNCF (Cloud Native
Computing Foundation)
の規格の1つに採用
v1.12
infrakit
v1.12
SwarmKit
platform agnostic
インフラの差違を埋めるためのツール
カーネルとユーザスペースを提供
イミュータブルなインフラのため
派生
swarm
モード
派生
hyperkit
vpnkit
datakit
コンテナシステムの組立に
特化したフレームワークを
開発するプロジェクト
https://github.com/mobyhttps://github.com/docker
5
“Compose is a tool for defining and running
multi-container Docker applications.”
複数コンテナのDockerアプリケーションを
定義し、実行するツールがCompose
6
“Compose is a tool for defining and running
multi-container Docker applications.”
複数コンテナのDockerアプリケーションを
定義し、実行するツールがCompose
docker-compose.yml
YAMLファイル
docker-compose
CLI
7
Why?
Docker Engine
8
エ ン ジ ン
$ docker run …
$ docker run …
$ docker run …
$ docker run …
Docker Swarm
9
ス ウ ォ ー ム
$ docker run …
$ docker run …
$ docker run …
$ docker run …
10
• 複数のコンテナを一斉に
操作できない
• 複数台のサーバ上で一斉に
操作できない
管理が
面倒
“Docker allows you to package an application
with all of its dependencies into a standardized
unit for software development.”
www.docker.com
11
全ての依存関係をパッケージ化して、コンテナとして動かす
12
“Fast, isolated development environments
using Docker”
www.fig.sh
13
“Fast, isolated development environments
using Docker”
www.fig.sh
Docker Compose
14
コ ン ポ ー ズ
“Compose is a tool for
defining and running
multi-container Docker
applications.”
15
16
17
Mastodon
18
Mastodon
19
version: "3"
services:
db:
restart: always
image: postgres:alpine
networks:
mastodon:
volumes:
- mastodon_postgres:/var/lib/postgresql/data
redis:
restart: always
image: redis:alpine
networks:
mastodon:
volumes:
- mastodon_redis:/data
frontend:
build:
context: ./frontend
dockerfile: Dockerfile.nginx
image: mastodon_frontend:alpine
ports:
- "80:80"
- "443:443"
depends_on:
- web
- streaming
networks:
mastodon:
volumes:
- /etc/localtime:/etc/localtime:ro
- certbot:/etc/letsencrypt
sidekiq:
restart: always
build: .
image: gargron/mastodon
env_file: .env.production
command: bundle exec sidekiq -q default -q mailers -q pull -q push
depends_on:
- db
- redis
networks:
mastodon:
volumes:
- system:/mastodon/public/system
mta:
restart: always
image: namshi/smtp
env_file: .env.smtp
networks:
mastodon:
volumes:
- /etc/localtime:/etc/localtime:ro
networks:
mastodon:
external: true
volumes:
certbot:
external: true
mastodon_postgres:
mastodon_redis:
assets:
packs:
system:
web:
restart: always
build: .
image: gargron/mastodon
env_file: .env.production
command: bundle exec rails s -p 3000 -b '0.0.0.0'
#ports:
# - "3000:3000"
depends_on:
- db
- redis
networks:
mastodon:
aliases:
- mastodon_web
volumes:
- assets:/mastodon/public/assets
- packs:/mastodon/public/packs
- system:/mastodon/public/system
streaming:
restart: always
build: .
image: gargron/mastodon
env_file: .env.production
command: npm run start
ports:
- "4000:4000"
networks:
mastodon:
aliases:
- mastodon_streaming
depends_on:
- db
- redis
docker-compose.yml
20
version: "3"
services:
db:
restart: always
image: postgres:alpine
networks:
mastodon:
volumes:
- mastodon_postgres:/var/lib/postgresql/data
redis:
restart: always
image: redis:alpine
networks:
mastodon:
volumes:
- mastodon_redis:/data
frontend:
build:
context: ./frontend
dockerfile: Dockerfile.nginx
image: mastodon_frontend:alpine
ports:
- "80:80"
- "443:443"
depends_on:
- web
- streaming
networks:
mastodon:
volumes:
- /etc/localtime:/etc/localtime:ro
- certbot:/etc/letsencrypt
sidekiq:
restart: always
build: .
image: gargron/mastodon
env_file: .env.production
command: bundle exec sidekiq -q default -q mailers -q pull -q push
depends_on:
- db
- redis
networks:
mastodon:
volumes:
- system:/mastodon/public/system
mta:
restart: always
image: namshi/smtp
env_file: .env.smtp
networks:
mastodon:
volumes:
- /etc/localtime:/etc/localtime:ro
networks:
mastodon:
external: true
volumes:
certbot:
external: true
mastodon_postgres:
mastodon_redis:
assets:
packs:
system:
web:
restart: always
build: .
image: gargron/mastodon
env_file: .env.production
command: bundle exec rails s -p 3000 -b '0.0.0.0'
#ports:
# - "3000:3000"
depends_on:
- db
- redis
networks:
mastodon:
aliases:
- mastodon_web
volumes:
- assets:/mastodon/public/assets
- packs:/mastodon/public/packs
- system:/mastodon/public/system
streaming:
restart: always
build: .
image: gargron/mastodon
env_file: .env.production
command: npm run start
ports:
- "4000:4000"
networks:
mastodon:
aliases:
- mastodon_streaming
depends_on:
- db
- redis
docker-compose.yml
21
22
コンテナ単位
Engine
(プロジェクト内の)
サービス単位
Compose
23
開発、テスト、ステージング
CI ワークフローに適している
• 単一ホスト上でも環境を分けたい場合に
• コンテナが作成したボリューム(データ領域)を
残したり、共有できる
• Compose ファイルを再利用できる
24
セットアップ方法
docker-compose CLI
Compose形式v1~v3
Composeを使う
フォーマット
25
セットアップ
https://github.com/docker/compose/releases
から、各OSに対応したバイナリのセットアップが簡単
curl -L https://github.com/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m`¥
> /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
26
docker CLI風のコマンド群
27
docker-compose up
docker-compose ps
docker-compose stop
docker-compose logs
docker-compose rm
28
docker-compose.yml
version: '3.1'
services:
wordpress:
image: wordpress
ports:
- 80:80
environment:
WORDPRESS_DB_PASSWORD: example
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
• プロジェクトを定義・操作
• サービス、ネットワーク、
ボリュームを定義など、
アプリケーションに依存する
すべての情報を定義
• 必要なイメージ名やタグの情報
• 環境変数
• 外部(external)ネットワーク
• 外部(external)ボリューム
• などなど
29
より有効活用
するには…?
30
Orchestration
( ( )
Scheduling Cluster Management
複数のホスト・システム上を横
断するアプリケーションをス
ケール(拡大・縮小)できる機能
※コンテナに依存しない
• Marathon, chronos
• Docker swarm
• Deis
• fleet
• Apache Mesos
• DCOS (Mesosphere)
• Kubernetes
• Docker Engine
(swarm mode)
+ Docker Compose
• Rancher
• Nomad
設定ファイルをベースに
サービスを定義・維持
計算資源の抽象化
内部分散ステート・ストア
Internal Distrubuted State Store
マネージャ
Manager
マネージャ
Manager
マネージャ
Manager
ワーカ
Worker
ワーカ
Worker
ワーカ
Worker
ワーカ
Worker
ワーカ
Worker
ワーカ
Worker
internet
仮想マシン 仮想マシン 仮想マシン
ingress
Virtual Router
(IPVS)
タスク タスク タスク
Routing mesh
network
サービス作成
$ docker service create
「--constraint」でノードの指定
「--mode=global」で全ノードに展開
33
docker stack
34
docker stack deploy -c docker-compose.yml [NAME]
docker service は「サービス」単位
docker stack は「アプリケーション全体」かつ
swarm mode で Docker Compose 互換機能を提供
ポイント
35
docker stack deploy -c docker-compose.yml [NAME]
36
$ docker stack deploy -c docker-compose.yml web
Creating service web_web
$ docker stack ps web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
ERROR PORTS
uhm1xxq1u70w web_web.1 zembutsu/docker-sample-nginx:latest frontend-01 Running Running 45
seconds ago
ccmokdadpjqx web_web.2 zembutsu/docker-sample-nginx:latest frontend-02 Running Running 28
seconds ago
cflckriidpt0 web_web.3 zembutsu/docker-sample-nginx:latest frontend-03 Running Running 33
seconds ago
$ docker stack services web
ID NAME MODE REPLICAS IMAGE PORTS
yunncblhngu6 web_web replicated 3/3 zembutsu/docker-sample-nginx:latest *:80->80/tcp
= docker service ps web
= docker service ls
37
version: '3'
services:
web:
image: zembutsu/docker-sample-nginx
deploy:
replicas: 3
resources:
limits:
cpus: "0.1"
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
internal:
aliases:
- web
volumes:
- /etc/localtime:/etc/localtime:ro
networks:
internal:
docker-compose.yml
Compose format は 3種類
v1 v2 v3
・ネットワーク非対応
・ボリューム非対応
・ネットワーク対応
・ボリューム対応
・スケール(swarm)
・リソース制限
Docker Swarm
Docker Compose
Docker Engine
swarm mode
docker
stack
Docker Swarm
Docker Compose
Docker Engine
swarm mode
docker
stack
Compose format
v3
swarm mode 基本コマンド
$ docker swarm init --listen-addr <host>:2377
$ docker swarm join <host>:<port>
$ docker service create ¥
--replicas N –p <公開port>:<内部> --name <名前> <イメージ>
$ docker service ls
$ docker service tasks <サービス名>
$ docker service update --replicas N <サービス名>
$ docker service update --image <イメージ> <サービス名>
$ docker service rm
クラスタ初期化
クラスタ参加
サービス作成
サービス一覧
タスク一覧
サービス更新
ローリング・アップデート
サービス削除
① Docker Engine “swarm モード” の初期化
マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2
Docker Engine
(dockerd)
Manager node Worker node Worker node
Docker Engine のクラスタを「swarm」(”群れ”の意味)と呼ぶ
「docker swarm」コマンドはクラスタ上のサービスやタスクを管理する
はじめに「docker swarm init」コマンドでクラスタを初期する
192.168.39.1
(node-01)
192.168.39.2
(node-02)
192.168.39.3
(node-03)
docker swarm init –listen-addr 192.168.39.1:2377
クラスタの初期化
docker@node-01:~$ docker node ls
ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS
dhrbvl6o9xqvprsq2uzq8o9ev * node-01 Accepted Ready Active Leader
各ホスト上では Docker Engine (dockerd)が
稼働している。通常の docker コマンド利用と
swarm モードは併用可能
Docker Engine
(dockerd)
Docker Engine
(dockerd)
ノードは swarm クラスタ内の Docker エンジンのこと
「docker node」はクラスタのノード管理するコマンド群で、マネージャ・ノードのみ実行可能
「docker node ls」は、マネージャ用のノード一覧を表示
swarm クラスタ
② swarm node join でクラスタに追加
マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2
Manager node Worker node Worker node
swarm クラスタ
192.168.39.1
(node-01)
192.168.39.2
(node-02)
192.168.39.3
(node-03)
docker swarm join 192.168.39.1:2377
クラスタに worker (ワーカ)として参加
docker@node-01:~$ docker node ls
ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS
6puvbl7tgxislfha5iaha40jm node-03 Accepted Ready Active
9zj16or3durdh5i7c6khlench node-02 Accepted Ready Active
dhrbvl6o9xqvprsq2uzq8o9ev * node-01 Accepted Ready Active Leader
「MANAGER STATUS」が無ければ、ワーカ・ノードとして動作
ただし、この例のマネージャはワーカも兼ねている
TCP Port 2377 は、クラスタ管理の通信用
TCP/UDP Port 7946 はノード間通信用
TCP/UDP Port 4789 はオーバレイ・ネットワーク用
ワーカはマネージャから
タスクを受け取る
マネージャでサービスを定義
タスクをワーカに割り振る
③ swarm service create でサービス作成
マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2
Manager node Worker node Worker node
swarm クラスタ
192.168.39.1
(node-01)
192.168.39.2
(node-02)
192.168.39.3
(node-03)
$ docker service create --replicas 1 –name web -p 80:80 nginx
f218o6xshkyt7zzxujhnz1a2h
nginx イメージを使う web という名前のサービスを作成
docker@node-01:~$ docker service ls
ID NAME REPLICAS IMAGE COMMAND
13765buws9fr web 0/1 nginx
サービスはレプリカの期待数を定義
「0/1」は期待数は 1 だが現状は 0
レプリカ数:1
swarmのポート80をコンテナ内の80に割り当て
マネージャでサービスを定義
タスクをワーカに割り振る
ID NAME REPLICAS IMAGE COMMAND
13765buws9fr web 1/1 nginx
マネージャはノードにタスクを割り当て(スケジュールし)、
タスク(としてのコンテナ)が起動すると「1/1」になる
サービス タスク
(コンテナ)
nginxweb
スケジュール
コンテナ起動
④ ポートの公開と Ingress オーバレイ・ネットワーク
マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2
Manager node Worker node Worker node
swarm クラスタ
192.168.39.1
(node-01)
192.168.39.2
(node-02)
192.168.39.3
(node-03)
サービス タスク
(コンテナ)
nginxweb
Port 80(tcp)
オーバレイ・ネットワーク
Port 80(tcp)
Ingress
Port 80(tcp)Port 80(tcp)
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
bbb5e37b01e8 bridge bridge local
6550c72b075f docker_gwbridge bridge local
84baeb90cbb2 host host local
9i5hmgqr20jh ingress overlay swarm
7ab4c321bbe5 none null local
⑤ Ingress Load Balancing
マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2
Manager node Worker node Worker node
swarm クラスタ
192.168.39.1
(node-01)
192.168.39.2
(node-02)
192.168.39.3
(node-03)
タスク
(コンテナ)
nginx
Port 80(tcp)
オーバレイ・ネットワーク
Port 80(tcp)
Ingress
タスク
(コンテナ)
nginx
Port 80(tcp)
タスク
(コンテナ)
nginx
Port 80(tcp)
48
49
50
51
https://alpinelinux.org/
52
超小容量Linuxディストリビューション
Alpine Linux
$ docker images ls
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest a41a7446062d 11 days ago 3.96MB
53
54
FROM alpine:latest
RUN apk update && apk add openssl
Dockerfile
55
56
57
58
コンテナの
サービス群を
Composeで
梱包
する話でした。
サービスを梱包する話
Docker Compose 基本概念
Compose を YAML で動かす
docker stack と swarm mode
Compose
Compose v3 や
swarm モードを始めるなら
今が旬ではないでしょうか
私からは以上です
ありがとうございました
何か気になる所がありますか?
ご参考:Docker 日本語ドキュメント
http://docs.docker.jp/
http://slideshare.net/zembutsu
twitter: @zembutsu

Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで

  • 1.
    Docker Compose入門 今日から始めるComposeの初歩からswarm mode対応まで Engineer/ Technology Evangelist, SAKURA Internet, Inc. @zembutsu 前佛 雅人 ZEMBUTSU Masahito 2017年6月14日(水) #mastercloud
  • 2.
    今日お伝えすること Docker Compose 基本概念 Composeを YAML で動かす docker stack と swarm mode
  • 3.
  • 4.
    4 Introducing Moby Project:a new open-source project to advance the software containerization movement - Docker Blog https://blog.docker.com/2017/04/introducing-the-moby-project/ A new upstream project to break up Docker into independent components by shykes · Pull Request #32691 · moby/moby https://github.com/moby/moby/pull/32691 Docker と周辺ツールやプロジェクトとの関係性まとめ references 2013 Docker LXC + 2014 libcontainer ver0.9 デーモン Linux向けコンテナ用 ライブラリ(当時開発中) 独自にライブラリを実装 2015 Docker Engine デーモンの呼称を変更 補助ツール群の登場 Docker Swarm Docker Compose Docker Machine 2016 2017 runC v1.11 OCI基準のランタイムの1つ “docker”バイナリから dockerd デーモンに代わり Linux capabilityの管理 Engine (dockerd) containerD OCI準拠のランタイムを 動かすスーパーバイザ v1.11 Docker独自規格 業界規格・共通技術 CNCF (Cloud Native Computing Foundation) の規格の1つに採用 v1.12 infrakit v1.12 SwarmKit platform agnostic インフラの差違を埋めるためのツール カーネルとユーザスペースを提供 イミュータブルなインフラのため 派生 swarm モード 派生 hyperkit vpnkit datakit コンテナシステムの組立に 特化したフレームワークを 開発するプロジェクト https://github.com/mobyhttps://github.com/docker
  • 5.
    5 “Compose is atool for defining and running multi-container Docker applications.” 複数コンテナのDockerアプリケーションを 定義し、実行するツールがCompose
  • 6.
    6 “Compose is atool for defining and running multi-container Docker applications.” 複数コンテナのDockerアプリケーションを 定義し、実行するツールがCompose docker-compose.yml YAMLファイル docker-compose CLI
  • 7.
  • 8.
    Docker Engine 8 エ ンジ ン $ docker run … $ docker run … $ docker run … $ docker run …
  • 9.
    Docker Swarm 9 ス ウォ ー ム $ docker run … $ docker run … $ docker run … $ docker run …
  • 10.
  • 11.
    “Docker allows youto package an application with all of its dependencies into a standardized unit for software development.” www.docker.com 11 全ての依存関係をパッケージ化して、コンテナとして動かす
  • 12.
    12 “Fast, isolated developmentenvironments using Docker” www.fig.sh
  • 13.
    13 “Fast, isolated developmentenvironments using Docker” www.fig.sh
  • 14.
    Docker Compose 14 コ ンポ ー ズ “Compose is a tool for defining and running multi-container Docker applications.”
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
    19 version: "3" services: db: restart: always image:postgres:alpine networks: mastodon: volumes: - mastodon_postgres:/var/lib/postgresql/data redis: restart: always image: redis:alpine networks: mastodon: volumes: - mastodon_redis:/data frontend: build: context: ./frontend dockerfile: Dockerfile.nginx image: mastodon_frontend:alpine ports: - "80:80" - "443:443" depends_on: - web - streaming networks: mastodon: volumes: - /etc/localtime:/etc/localtime:ro - certbot:/etc/letsencrypt sidekiq: restart: always build: . image: gargron/mastodon env_file: .env.production command: bundle exec sidekiq -q default -q mailers -q pull -q push depends_on: - db - redis networks: mastodon: volumes: - system:/mastodon/public/system mta: restart: always image: namshi/smtp env_file: .env.smtp networks: mastodon: volumes: - /etc/localtime:/etc/localtime:ro networks: mastodon: external: true volumes: certbot: external: true mastodon_postgres: mastodon_redis: assets: packs: system: web: restart: always build: . image: gargron/mastodon env_file: .env.production command: bundle exec rails s -p 3000 -b '0.0.0.0' #ports: # - "3000:3000" depends_on: - db - redis networks: mastodon: aliases: - mastodon_web volumes: - assets:/mastodon/public/assets - packs:/mastodon/public/packs - system:/mastodon/public/system streaming: restart: always build: . image: gargron/mastodon env_file: .env.production command: npm run start ports: - "4000:4000" networks: mastodon: aliases: - mastodon_streaming depends_on: - db - redis docker-compose.yml
  • 20.
    20 version: "3" services: db: restart: always image:postgres:alpine networks: mastodon: volumes: - mastodon_postgres:/var/lib/postgresql/data redis: restart: always image: redis:alpine networks: mastodon: volumes: - mastodon_redis:/data frontend: build: context: ./frontend dockerfile: Dockerfile.nginx image: mastodon_frontend:alpine ports: - "80:80" - "443:443" depends_on: - web - streaming networks: mastodon: volumes: - /etc/localtime:/etc/localtime:ro - certbot:/etc/letsencrypt sidekiq: restart: always build: . image: gargron/mastodon env_file: .env.production command: bundle exec sidekiq -q default -q mailers -q pull -q push depends_on: - db - redis networks: mastodon: volumes: - system:/mastodon/public/system mta: restart: always image: namshi/smtp env_file: .env.smtp networks: mastodon: volumes: - /etc/localtime:/etc/localtime:ro networks: mastodon: external: true volumes: certbot: external: true mastodon_postgres: mastodon_redis: assets: packs: system: web: restart: always build: . image: gargron/mastodon env_file: .env.production command: bundle exec rails s -p 3000 -b '0.0.0.0' #ports: # - "3000:3000" depends_on: - db - redis networks: mastodon: aliases: - mastodon_web volumes: - assets:/mastodon/public/assets - packs:/mastodon/public/packs - system:/mastodon/public/system streaming: restart: always build: . image: gargron/mastodon env_file: .env.production command: npm run start ports: - "4000:4000" networks: mastodon: aliases: - mastodon_streaming depends_on: - db - redis docker-compose.yml
  • 21.
  • 22.
  • 23.
    23 開発、テスト、ステージング CI ワークフローに適している • 単一ホスト上でも環境を分けたい場合に •コンテナが作成したボリューム(データ領域)を 残したり、共有できる • Compose ファイルを再利用できる
  • 24.
  • 25.
  • 26.
  • 27.
    27 docker-compose up docker-compose ps docker-composestop docker-compose logs docker-compose rm
  • 28.
    28 docker-compose.yml version: '3.1' services: wordpress: image: wordpress ports: -80:80 environment: WORDPRESS_DB_PASSWORD: example mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example • プロジェクトを定義・操作 • サービス、ネットワーク、 ボリュームを定義など、 アプリケーションに依存する すべての情報を定義 • 必要なイメージ名やタグの情報 • 環境変数 • 外部(external)ネットワーク • 外部(external)ボリューム • などなど
  • 29.
  • 30.
    30 Orchestration ( ( ) SchedulingCluster Management 複数のホスト・システム上を横 断するアプリケーションをス ケール(拡大・縮小)できる機能 ※コンテナに依存しない • Marathon, chronos • Docker swarm • Deis • fleet • Apache Mesos • DCOS (Mesosphere) • Kubernetes • Docker Engine (swarm mode) + Docker Compose • Rancher • Nomad 設定ファイルをベースに サービスを定義・維持 計算資源の抽象化
  • 31.
    内部分散ステート・ストア Internal Distrubuted StateStore マネージャ Manager マネージャ Manager マネージャ Manager ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker
  • 32.
    internet 仮想マシン 仮想マシン 仮想マシン ingress VirtualRouter (IPVS) タスク タスク タスク Routing mesh network サービス作成 $ docker service create 「--constraint」でノードの指定 「--mode=global」で全ノードに展開
  • 33.
  • 34.
    34 docker stack deploy-c docker-compose.yml [NAME] docker service は「サービス」単位 docker stack は「アプリケーション全体」かつ swarm mode で Docker Compose 互換機能を提供 ポイント
  • 35.
    35 docker stack deploy-c docker-compose.yml [NAME]
  • 36.
    36 $ docker stackdeploy -c docker-compose.yml web Creating service web_web $ docker stack ps web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS uhm1xxq1u70w web_web.1 zembutsu/docker-sample-nginx:latest frontend-01 Running Running 45 seconds ago ccmokdadpjqx web_web.2 zembutsu/docker-sample-nginx:latest frontend-02 Running Running 28 seconds ago cflckriidpt0 web_web.3 zembutsu/docker-sample-nginx:latest frontend-03 Running Running 33 seconds ago $ docker stack services web ID NAME MODE REPLICAS IMAGE PORTS yunncblhngu6 web_web replicated 3/3 zembutsu/docker-sample-nginx:latest *:80->80/tcp = docker service ps web = docker service ls
  • 37.
    37 version: '3' services: web: image: zembutsu/docker-sample-nginx deploy: replicas:3 resources: limits: cpus: "0.1" restart_policy: condition: on-failure ports: - "80:80" networks: internal: aliases: - web volumes: - /etc/localtime:/etc/localtime:ro networks: internal:
  • 38.
  • 39.
  • 40.
    Docker Swarm Docker Compose DockerEngine swarm mode docker stack
  • 41.
    Docker Swarm Docker Compose DockerEngine swarm mode docker stack Compose format v3
  • 42.
    swarm mode 基本コマンド $docker swarm init --listen-addr <host>:2377 $ docker swarm join <host>:<port> $ docker service create ¥ --replicas N –p <公開port>:<内部> --name <名前> <イメージ> $ docker service ls $ docker service tasks <サービス名> $ docker service update --replicas N <サービス名> $ docker service update --image <イメージ> <サービス名> $ docker service rm クラスタ初期化 クラスタ参加 サービス作成 サービス一覧 タスク一覧 サービス更新 ローリング・アップデート サービス削除
  • 43.
    ① Docker Engine“swarm モード” の初期化 マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2 Docker Engine (dockerd) Manager node Worker node Worker node Docker Engine のクラスタを「swarm」(”群れ”の意味)と呼ぶ 「docker swarm」コマンドはクラスタ上のサービスやタスクを管理する はじめに「docker swarm init」コマンドでクラスタを初期する 192.168.39.1 (node-01) 192.168.39.2 (node-02) 192.168.39.3 (node-03) docker swarm init –listen-addr 192.168.39.1:2377 クラスタの初期化 docker@node-01:~$ docker node ls ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS dhrbvl6o9xqvprsq2uzq8o9ev * node-01 Accepted Ready Active Leader 各ホスト上では Docker Engine (dockerd)が 稼働している。通常の docker コマンド利用と swarm モードは併用可能 Docker Engine (dockerd) Docker Engine (dockerd) ノードは swarm クラスタ内の Docker エンジンのこと 「docker node」はクラスタのノード管理するコマンド群で、マネージャ・ノードのみ実行可能 「docker node ls」は、マネージャ用のノード一覧を表示 swarm クラスタ
  • 44.
    ② swarm nodejoin でクラスタに追加 マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2 Manager node Worker node Worker node swarm クラスタ 192.168.39.1 (node-01) 192.168.39.2 (node-02) 192.168.39.3 (node-03) docker swarm join 192.168.39.1:2377 クラスタに worker (ワーカ)として参加 docker@node-01:~$ docker node ls ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS 6puvbl7tgxislfha5iaha40jm node-03 Accepted Ready Active 9zj16or3durdh5i7c6khlench node-02 Accepted Ready Active dhrbvl6o9xqvprsq2uzq8o9ev * node-01 Accepted Ready Active Leader 「MANAGER STATUS」が無ければ、ワーカ・ノードとして動作 ただし、この例のマネージャはワーカも兼ねている TCP Port 2377 は、クラスタ管理の通信用 TCP/UDP Port 7946 はノード間通信用 TCP/UDP Port 4789 はオーバレイ・ネットワーク用 ワーカはマネージャから タスクを受け取る マネージャでサービスを定義 タスクをワーカに割り振る
  • 45.
    ③ swarm servicecreate でサービス作成 マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2 Manager node Worker node Worker node swarm クラスタ 192.168.39.1 (node-01) 192.168.39.2 (node-02) 192.168.39.3 (node-03) $ docker service create --replicas 1 –name web -p 80:80 nginx f218o6xshkyt7zzxujhnz1a2h nginx イメージを使う web という名前のサービスを作成 docker@node-01:~$ docker service ls ID NAME REPLICAS IMAGE COMMAND 13765buws9fr web 0/1 nginx サービスはレプリカの期待数を定義 「0/1」は期待数は 1 だが現状は 0 レプリカ数:1 swarmのポート80をコンテナ内の80に割り当て マネージャでサービスを定義 タスクをワーカに割り振る ID NAME REPLICAS IMAGE COMMAND 13765buws9fr web 1/1 nginx マネージャはノードにタスクを割り当て(スケジュールし)、 タスク(としてのコンテナ)が起動すると「1/1」になる サービス タスク (コンテナ) nginxweb スケジュール コンテナ起動
  • 46.
    ④ ポートの公開と Ingressオーバレイ・ネットワーク マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2 Manager node Worker node Worker node swarm クラスタ 192.168.39.1 (node-01) 192.168.39.2 (node-02) 192.168.39.3 (node-03) サービス タスク (コンテナ) nginxweb Port 80(tcp) オーバレイ・ネットワーク Port 80(tcp) Ingress Port 80(tcp)Port 80(tcp) $ docker network ls NETWORK ID NAME DRIVER SCOPE bbb5e37b01e8 bridge bridge local 6550c72b075f docker_gwbridge bridge local 84baeb90cbb2 host host local 9i5hmgqr20jh ingress overlay swarm 7ab4c321bbe5 none null local
  • 47.
    ⑤ Ingress LoadBalancing マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2 Manager node Worker node Worker node swarm クラスタ 192.168.39.1 (node-01) 192.168.39.2 (node-02) 192.168.39.3 (node-03) タスク (コンテナ) nginx Port 80(tcp) オーバレイ・ネットワーク Port 80(tcp) Ingress タスク (コンテナ) nginx Port 80(tcp) タスク (コンテナ) nginx Port 80(tcp)
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
    52 超小容量Linuxディストリビューション Alpine Linux $ dockerimages ls REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest a41a7446062d 11 days ago 3.96MB
  • 53.
  • 54.
    54 FROM alpine:latest RUN apkupdate && apk add openssl Dockerfile
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
    サービスを梱包する話 Docker Compose 基本概念 Composeを YAML で動かす docker stack と swarm mode Compose
  • 60.
    Compose v3 や swarmモードを始めるなら 今が旬ではないでしょうか
  • 61.
  • 62.