D o c k e r の 新 し い 技 術 と s w a r m m o d e の 紹 介
@zembutsu
Docker 1.12 & Swarm Mode
Introduction
Docker のおさらい
Docker 1.12 の技術概要
新しいswarmモードの紹介と基本コマンド(デモ)
Docker?
開発環境でDockerを使用
アプリ環境の管理のため
Dockerを使用
開発の機敏性を高めるため
Dockerを使用
アプリのポータビリティを
達成するためにDockerを使用
プロダクション用の
アプリでDocker使用
伝統的データベース
分散データベース
ビッグデータ
アプリ・サーバ
ウェブ・アプリ
ウェブ API
Dockerの役割
開発環境周辺で
Dockerの利用を計画
DevOps周辺で
Dockerの利用を計画
“Docker provides the software supply chain with agility, control and portability for app development.”
Dockerは開発のための機敏なソフトウェアのサプライチェーン、管理、ポータビリティを提供 [1]
The Evolution of the Modern Software Supply Chain - The Docker Survey, 2016
https://www.docker.com/survey-2016
Dockerイメージ
コンテナ実行時に必要なファイルシステム
tar アーカイブの中に Linux 用のファイル群が存在
イメージ・レイヤ(層)は読み込み専用
イメージはレイヤを共有
レイヤは親子関係を持つ
ディスク容量消費を回避し、移動しやすく
コンテナ起動時にイメージを使用
読み書き可能なレイヤを追加する
イメージ内のファイルを(isolate状態で)実行する
$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
203137e8afd5: Pull complet
2ff1bbbe9310: Pull complete
933ae2486129: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:1bea66e185d3464fec1abda32ffaf2a11de69833cfcf81bd2b9a5be147776814
Status: Downloaded newer image for ubuntu:latest/
Dockerコンテナの操作
OS ( Linux )
物理/仮想サーバ
Docker エンジン
( dockerd デーモン )
Linux kernel
コンテナ コンテナ コンテナ
リモート
API
docker
クライアント TCP あるいは
Unix ソケットドメイン
containerd
Runtime: runC (OCI規格準拠)
・docker コマンド
Linux, Mac OS X, Windows
・Kitematic (GUI)
Mac OS X, Windows
・Docker Compose
・Docker Swarm
コンテナのプロセス
httpd
PID 1
コンテナA コンテナB
ruby
PID 1
chris.rb
PID 2
/sbin/init
PID 1
httpd
PID 6
ruby
PID 7
chris.rb
PID 8
alice
PID 2
bob
PID 3
PPID 1 PPID 1
PPID 4
PPID 5 PPID 5
PPID 7
PPID 1
containerd
PID 5
dockerd
PID 4
コンテナのファイルシステム
コンテナAのファイルシステム
… …
コンテナBのファイルシステム
/etc
(/data/ubuntu/etc)
/bin
(/data/ubuntu/bin)
/etc
(/data/centos/etc)
/bin
(/data/centos/bin)
/ /
/
/etc
/data/ubuntu /data/centos
/bin /data
コンテナの実行
コンテナAのファイルシステム
… …
コンテナBのファイルシステム
/etc
(/data/ubuntu/etc)
/bin
(/data/ubuntu/bin)
/etc
(/data/centos/etc)
/bin
(/data/centos/bin)
/ /
httpd
PID 1
プロセスA プロセスB
ruby
PID 1
chris.rb
PID 2
コンテナA コンテナB
名前空間の isolate
・プロセス
・ファイルシステム
・ネットワーク
・ホスト名
・UID・GID
リソース制限
・CPU
・メモリ
・I/O
・ディスク・クォータ
Docker Engine
Linux Kernel
・namespaces
・cgroups
・capabilities … etc
LXC
libcontaine
r
runC
containerdv0.9~
v1.11~
Version 7 Unix
chroot
jail
dockerd
v1.12~
デーモン
ライブラリ
ランタイム
Dockerコンテナの操作
OS ( Linux )
物理/仮想サーバ
Docker エンジン
( dockerd デーモン )
Linux kernel
コンテナ コンテナ コンテナ
リモート
API
docker
クライアント TCP あるいは
Unix ソケットドメイン
containerd
Runtime: runC (OCI規格準拠)
・docker コマンド
Linux, Mac OS X, Windows
・Kitematic (GUI)
Mac OS X, Windows
・Docker Compose
・Docker Swarm
Docker 1.12
現時点はリリース候補(RC)版
開発バージョンのバイナリ入手
https://github.com/docker/docker/releases
# curl -fsSL https://test.docker.com/ | sh
注意点
仕様変更
バグ
Docker 1.12 概要 [2]
Swarm 機能統合:Built-in Orchestration
Docker Engine に Docker Swarm のクラスタ管理機能を統合
オプションとしての Swarm Mode なので、必須ではない
標準のセキュリティ機能
新しいサービスとイメージ管理
分散アプリケーション・バンドル(.dab) は JOSN 形式のフォーマットでサービス定義
docker deploy、docker stack コマンド (EXPERIMENTAL)
Docker Store 発表 (private bate)
新機能
Dockerfileでヘルスチェックの定義
docker plugin コマンドのサポート
ディスク・クォータ
$ docker run …
$ docker run …
$ docker run …
• 増減する環境
• 日々の運用
• 障害対応
内部分散ステート・ストア
Internal Distrubuted State Store
マネージャ
Manager
マネージャ
Manager
マネージャ
Manager
ワーカ
Worker
ワーカ
Worker
ワーカ
Worker
ワーカ
Worker
ワーカ
Worker
ワーカ
Worker
Built-in Orchestration
シンプルでありながら強力
設計思想は、難しいことなく、とにかく動く(it just work)
クラスタ管理のために、複雑なセットアップが不要
docker service や docker node コマンドを標準サポート
柔軟性 (Resilient)
アプリケーションの実行単位がサービス (service)であり、期待状態を定義
安全 (Secure)
PKI 基盤が組み込まれており、クラスタ間通信は常に TLS 認証が有効
オプション機能と後方互換性
swarmモードを有効化しても CPU やメモリのリソースを消費しない
Swarm マネージャ
Docker 1.12 RC の Docker Engine と Swarm
v1.11まで
swarm manage
Swarm ノード1 Swarm ノード2
swarm join swarm join
Docker Engine
(docker daemon)
ディスカバリ・バックエンド
Consul
Etcd
zookeeper
monitoring
Remote management
v1.12 RC1~
マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2
Docker Engine
(dockerd)
Manager node Worker node Worker node
• Docker Swarmのクラスタを管理するには、
Docker Engineとは別に Swam マネージャと
Swarm ノード、さらにディスカバリ・バックエンド
が必要
• Docker Engine に Swarm 機能を統合
• dockerd は Docker Engine のデーモンの役割と、
Swarm のノード(マネージャまたはワーカ)も担う
• 従来必要だった Swarm コンテナやバイナリだけ
でなく、外部のツールを必要としない
• --replicas オプションは docker-compose scale 風
docker swarm join docker swarm join
サービス
タスク(コンテナの
挙動)と期待状態
(desired state)を
定義
タスク
(task)
タスク
(task)
allocate
Overlay network
docker swam init
(クラスタ初期化)
docker swam
service create
内部DNSはサービス名で
Load balancing
サービスの公開ポートはIngress Load Balancingとして公開
(どのノードのポートにアクセスしても、対象のサービス用ポートに到達。つまり、
コンテナが起動しなくても、ノード内のどこかの IP アドレスさえ分かればよい)Docker Engine クラスタを
“Swarm”(群れ)と呼ぶ
key.pem
key.pem
key.pem
Docker
CLI
....
......
Docker クライアント
"client"
....
......
Swarm クラスタ
認証局(CA)サーバ
"ca"
"node1"
....
......
Swarmマネージャ
"swarm"
ca.cert
key.pem
cert.pem
"node2"
....
...... ca.cert
cert.pem
....
...... ca.cert
cert.pem
....
...... ca.cert
cert.pem
swarm-priv-key.pem
swarm-cert.pem
client-priv-key.pem
client-cert.pem
node1-priv-key.pem
node1-cert.pem
node2-priv-key.pem
node2-cert.pem
ca.pem
Before 1.11
key.pem
key.pem
key.pem
Docker
CLI
....
......
Docker クライアント
"client"
....
......
Swarm モード
認証局(CA)サーバ
"ca"
"node1"
....
......
Swarmマネージャ
"swarm"
ca.cert
key.pem
cert.pem
"node2"
....
...... ca.cert
cert.pem
....
...... ca.cert
cert.pem
....
...... ca.cert
cert.pem
swarm-priv-key.pem
swarm-cert.pem
client-priv-key.pem
client-cert.pem
node1-priv-key.pem
node1-cert.pem
node2-priv-key.pem
node2-cert.pem
ca.pem
After 1.12
Swarm mode
swarmモード
Docker標準搭載のクラスタとサービス管理機構
Docker Engine v1.12RC1 から Docker Swarm と機能統合 (SwarmKit) [3]
クラスタを “Swarm” とよび、マネージャがノード上のサービスを簡単に一括管理
管理はサービスとタスクの単位
アプリケーションの実行単位がサービス (service)であり、期待状態を定義
複製サービスとグローバル・サービスの2種類
タスクがコンテナのスケジューリング単位
マルチホスト対応のルーティング・メッシュ
期待状態を維持するために、タスクの自動増減の対応やヘルスチェック機能
外部サービスはIngressロード・バランシングで負荷分散し、内部も DNS を持つ [4]
nginx
サービス
nginx.1
nginx.2
nginx.3
タスク コンテナ
nginx:latest
nginx:latest
nginx:latest
スタック
stack
.dab
Distributed Application Bundle
(JSON) docker deploy
docker stack
What’s new in Docker 1.12 より [5]
internet
仮想マシン 仮想マシン 仮想マシン
network
Port 80 Port 80 Port 80
internet
仮想マシン 仮想マシン 仮想マシン
network
Port 80 Port 80 Port 80ingress
Overlay network
・ルーティング
・負荷分散
タスク タスク タスク
Swarmモードはクラスタの初期化
$ docker swarm init
$ docker swarm join <host>:2377
internet
仮想マシン 仮想マシン 仮想マシン
ingress
Virtual Router
(IPVS)
タスク タスク タスク
Routing mesh
network
サービス作成
$ docker service create
「--constraint」でノードの指定
「--mode=global」で全ノードに展開
manager-01 worker-01 worker-02
network
ingress
Overlay
network
nginx nginx nginx
worker-03
nginx
Port 8080 Port 8080 Port 8080 Port 8080
サービス期待値 (desired state)は
実際の状態とは異なる
$ docker service crate --replicas 4 –p 80:8080 --name=web nginx
$ docker service update --replicas 4 web
internet
manager-01 worker-01 worker-02
ingress
Overlay
network
nginx nginx nginx
worker-03
nginx
Port 8080 Port 8080 Port 8080 Port 8080
network
サービス期待値 (desired state)は
実際の状態とは異なる
$ docker service crate --replicas 4 –p 80:8080 --name=web nginx
$ docker service update --replicas 4 web
Swarm モード を つかう には
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)
ライブ デモ
Docker image: zembutsu/docker-sample-nginx
FROM nginx:latest
COPY default.conf /etc/nginx/conf.d/
COPY index.html /usr/share/nginx/html/
<html>
<body>
<h1>Host: <!--#echo var="HOSTNAME" --></h1>
</body>
</html>
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
ssi on;
}
Dockerfile
index.html default.conf
Docker 1.12.0-rc2
CentOS Linux release 7.2.1511 (Core)
Linux manager-01 3.10.0-327.18.2.el7.x86_64 #1 SMP Thu May 12 11:03:55 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
まとめ
Docker 1.12 概要 [2]
Swarm 機能統合:Built-in Orchestration
Docker Engine に Docker Swarm のクラスタ管理機能を統合
オプションとしての Swarm Mode なので、必須ではない
標準のセキュリティ機能
新しいサービスとイメージ管理
分散アプリケーション・バンドル(.dab) は JOSN 形式のフォーマットでサービス定義
docker deploy、docker stack コマンド (EXPERIMENTAL)
Docker Store 発表 (private bate)
新機能
Dockerfileでヘルスチェックの定義
docker plugin コマンドのサポート
ディスク・クォータ
どっかで
使おうかな?
最新の Docker に対応した日本語ドキュメント
http://docs.docker.jp
私からのお願い
まず読んで頂ければ…
なにか きになる ところ ありますか?
ありがとうございました
参考
[1] The Evolution of the Modern Software Supply Chain - The Docker Survey, 2016
https://www.docker.com/survey-2016/
[2] Docker 1.12: Now with Built-in Orchestration! | Docker Blog
https://blog.docker.com/2016/06/docker-1-12-built-in-orchestration/
[3] Swarm mode key concepts
https://docs.docker.com/engine/swarm/key-concepts/
[4] Docker for Ops: Docker Networking Deep Dive, Considerations and Troubleshooting http://www.slideshare.net/Docker/docker-for-ops-
docker-networking-deep-dive-considerations-and-troubleshooting-by-madhu-venugopal-and-jana-radhakrishnan
[5] What's New in Docker 1.12 by Mike Goelzer and Andrea Luzzardi
http://www.slideshare.net/Docker/whats-new-in-docker-112-by-mike-goelzer-and-andrea-luzzardi
補足資料:
Swarm mode overview
https://docs.docker.com/engine/swarm/
Docker 1.12: swarm モードと Ingress Load Balancing 概要 · Pocketstudio Technology Log
https://pocketstudio.net/2016/06/23/docker-1-12-swarm-mode-and-ingress-load-balancing/

Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介

  • 1.
    D o ck e r の 新 し い 技 術 と s w a r m m o d e の 紹 介 @zembutsu Docker 1.12 & Swarm Mode Introduction
  • 2.
    Docker のおさらい Docker 1.12の技術概要 新しいswarmモードの紹介と基本コマンド(デモ)
  • 3.
  • 4.
    開発環境でDockerを使用 アプリ環境の管理のため Dockerを使用 開発の機敏性を高めるため Dockerを使用 アプリのポータビリティを 達成するためにDockerを使用 プロダクション用の アプリでDocker使用 伝統的データベース 分散データベース ビッグデータ アプリ・サーバ ウェブ・アプリ ウェブ API Dockerの役割 開発環境周辺で Dockerの利用を計画 DevOps周辺で Dockerの利用を計画 “Docker providesthe software supply chain with agility, control and portability for app development.” Dockerは開発のための機敏なソフトウェアのサプライチェーン、管理、ポータビリティを提供 [1] The Evolution of the Modern Software Supply Chain - The Docker Survey, 2016 https://www.docker.com/survey-2016
  • 5.
    Dockerイメージ コンテナ実行時に必要なファイルシステム tar アーカイブの中に Linux用のファイル群が存在 イメージ・レイヤ(層)は読み込み専用 イメージはレイヤを共有 レイヤは親子関係を持つ ディスク容量消費を回避し、移動しやすく コンテナ起動時にイメージを使用 読み書き可能なレイヤを追加する イメージ内のファイルを(isolate状態で)実行する
  • 6.
    $ docker pullubuntu Using default tag: latest latest: Pulling from library/ubuntu 203137e8afd5: Pull complet 2ff1bbbe9310: Pull complete 933ae2486129: Pull complete a3ed95caeb02: Pull complete Digest: sha256:1bea66e185d3464fec1abda32ffaf2a11de69833cfcf81bd2b9a5be147776814 Status: Downloaded newer image for ubuntu:latest/
  • 8.
    Dockerコンテナの操作 OS ( Linux) 物理/仮想サーバ Docker エンジン ( dockerd デーモン ) Linux kernel コンテナ コンテナ コンテナ リモート API docker クライアント TCP あるいは Unix ソケットドメイン containerd Runtime: runC (OCI規格準拠) ・docker コマンド Linux, Mac OS X, Windows ・Kitematic (GUI) Mac OS X, Windows ・Docker Compose ・Docker Swarm
  • 9.
    コンテナのプロセス httpd PID 1 コンテナA コンテナB ruby PID1 chris.rb PID 2 /sbin/init PID 1 httpd PID 6 ruby PID 7 chris.rb PID 8 alice PID 2 bob PID 3 PPID 1 PPID 1 PPID 4 PPID 5 PPID 5 PPID 7 PPID 1 containerd PID 5 dockerd PID 4
  • 10.
  • 11.
    コンテナの実行 コンテナAのファイルシステム … … コンテナBのファイルシステム /etc (/data/ubuntu/etc) /bin (/data/ubuntu/bin) /etc (/data/centos/etc) /bin (/data/centos/bin) / / httpd PID1 プロセスA プロセスB ruby PID 1 chris.rb PID 2 コンテナA コンテナB 名前空間の isolate ・プロセス ・ファイルシステム ・ネットワーク ・ホスト名 ・UID・GID リソース制限 ・CPU ・メモリ ・I/O ・ディスク・クォータ
  • 12.
    Docker Engine Linux Kernel ・namespaces ・cgroups ・capabilities… etc LXC libcontaine r runC containerdv0.9~ v1.11~ Version 7 Unix chroot jail dockerd v1.12~ デーモン ライブラリ ランタイム
  • 13.
    Dockerコンテナの操作 OS ( Linux) 物理/仮想サーバ Docker エンジン ( dockerd デーモン ) Linux kernel コンテナ コンテナ コンテナ リモート API docker クライアント TCP あるいは Unix ソケットドメイン containerd Runtime: runC (OCI規格準拠) ・docker コマンド Linux, Mac OS X, Windows ・Kitematic (GUI) Mac OS X, Windows ・Docker Compose ・Docker Swarm
  • 14.
  • 15.
  • 16.
    Docker 1.12 概要[2] Swarm 機能統合:Built-in Orchestration Docker Engine に Docker Swarm のクラスタ管理機能を統合 オプションとしての Swarm Mode なので、必須ではない 標準のセキュリティ機能 新しいサービスとイメージ管理 分散アプリケーション・バンドル(.dab) は JOSN 形式のフォーマットでサービス定義 docker deploy、docker stack コマンド (EXPERIMENTAL) Docker Store 発表 (private bate) 新機能 Dockerfileでヘルスチェックの定義 docker plugin コマンドのサポート ディスク・クォータ
  • 17.
    $ docker run… $ docker run … $ docker run … • 増減する環境 • 日々の運用 • 障害対応
  • 18.
    内部分散ステート・ストア Internal Distrubuted StateStore マネージャ Manager マネージャ Manager マネージャ Manager ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker
  • 19.
    Built-in Orchestration シンプルでありながら強力 設計思想は、難しいことなく、とにかく動く(it justwork) クラスタ管理のために、複雑なセットアップが不要 docker service や docker node コマンドを標準サポート 柔軟性 (Resilient) アプリケーションの実行単位がサービス (service)であり、期待状態を定義 安全 (Secure) PKI 基盤が組み込まれており、クラスタ間通信は常に TLS 認証が有効 オプション機能と後方互換性 swarmモードを有効化しても CPU やメモリのリソースを消費しない
  • 20.
    Swarm マネージャ Docker 1.12RC の Docker Engine と Swarm v1.11まで swarm manage Swarm ノード1 Swarm ノード2 swarm join swarm join Docker Engine (docker daemon) ディスカバリ・バックエンド Consul Etcd zookeeper monitoring Remote management v1.12 RC1~ マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2 Docker Engine (dockerd) Manager node Worker node Worker node • Docker Swarmのクラスタを管理するには、 Docker Engineとは別に Swam マネージャと Swarm ノード、さらにディスカバリ・バックエンド が必要 • Docker Engine に Swarm 機能を統合 • dockerd は Docker Engine のデーモンの役割と、 Swarm のノード(マネージャまたはワーカ)も担う • 従来必要だった Swarm コンテナやバイナリだけ でなく、外部のツールを必要としない • --replicas オプションは docker-compose scale 風 docker swarm join docker swarm join サービス タスク(コンテナの 挙動)と期待状態 (desired state)を 定義 タスク (task) タスク (task) allocate Overlay network docker swam init (クラスタ初期化) docker swam service create 内部DNSはサービス名で Load balancing サービスの公開ポートはIngress Load Balancingとして公開 (どのノードのポートにアクセスしても、対象のサービス用ポートに到達。つまり、 コンテナが起動しなくても、ノード内のどこかの IP アドレスさえ分かればよい)Docker Engine クラスタを “Swarm”(群れ)と呼ぶ
  • 21.
    key.pem key.pem key.pem Docker CLI .... ...... Docker クライアント "client" .... ...... Swarm クラスタ 認証局(CA)サーバ "ca" "node1" .... ...... Swarmマネージャ "swarm" ca.cert key.pem cert.pem "node2" .... ......ca.cert cert.pem .... ...... ca.cert cert.pem .... ...... ca.cert cert.pem swarm-priv-key.pem swarm-cert.pem client-priv-key.pem client-cert.pem node1-priv-key.pem node1-cert.pem node2-priv-key.pem node2-cert.pem ca.pem Before 1.11
  • 22.
    key.pem key.pem key.pem Docker CLI .... ...... Docker クライアント "client" .... ...... Swarm モード 認証局(CA)サーバ "ca" "node1" .... ...... Swarmマネージャ "swarm" ca.cert key.pem cert.pem "node2" .... ......ca.cert cert.pem .... ...... ca.cert cert.pem .... ...... ca.cert cert.pem swarm-priv-key.pem swarm-cert.pem client-priv-key.pem client-cert.pem node1-priv-key.pem node1-cert.pem node2-priv-key.pem node2-cert.pem ca.pem After 1.12
  • 23.
  • 24.
    swarmモード Docker標準搭載のクラスタとサービス管理機構 Docker Engine v1.12RC1から Docker Swarm と機能統合 (SwarmKit) [3] クラスタを “Swarm” とよび、マネージャがノード上のサービスを簡単に一括管理 管理はサービスとタスクの単位 アプリケーションの実行単位がサービス (service)であり、期待状態を定義 複製サービスとグローバル・サービスの2種類 タスクがコンテナのスケジューリング単位 マルチホスト対応のルーティング・メッシュ 期待状態を維持するために、タスクの自動増減の対応やヘルスチェック機能 外部サービスはIngressロード・バランシングで負荷分散し、内部も DNS を持つ [4]
  • 26.
  • 27.
    スタック stack .dab Distributed Application Bundle (JSON)docker deploy docker stack What’s new in Docker 1.12 より [5]
  • 28.
  • 29.
    internet 仮想マシン 仮想マシン 仮想マシン network Port80 Port 80 Port 80ingress Overlay network ・ルーティング ・負荷分散 タスク タスク タスク Swarmモードはクラスタの初期化 $ docker swarm init $ docker swarm join <host>:2377
  • 30.
    internet 仮想マシン 仮想マシン 仮想マシン ingress VirtualRouter (IPVS) タスク タスク タスク Routing mesh network サービス作成 $ docker service create 「--constraint」でノードの指定 「--mode=global」で全ノードに展開
  • 31.
    manager-01 worker-01 worker-02 network ingress Overlay network nginxnginx nginx worker-03 nginx Port 8080 Port 8080 Port 8080 Port 8080 サービス期待値 (desired state)は 実際の状態とは異なる $ docker service crate --replicas 4 –p 80:8080 --name=web nginx $ docker service update --replicas 4 web
  • 32.
    internet manager-01 worker-01 worker-02 ingress Overlay network nginxnginx nginx worker-03 nginx Port 8080 Port 8080 Port 8080 Port 8080 network サービス期待値 (desired state)は 実際の状態とは異なる $ docker service crate --replicas 4 –p 80:8080 --name=web nginx $ docker service update --replicas 4 web
  • 33.
    Swarm モード をつかう には
  • 34.
    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 クラスタ初期化 クラスタ参加 サービス作成 サービス一覧 タスク一覧 サービス更新 ローリング・アップデート サービス削除
  • 35.
    ① 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 クラスタ
  • 36.
    ② 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 はオーバレイ・ネットワーク用 ワーカはマネージャから タスクを受け取る マネージャでサービスを定義 タスクをワーカに割り振る
  • 37.
    ③ 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 スケジュール コンテナ起動
  • 38.
    ④ ポートの公開と 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
  • 39.
    ⑤ 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)
  • 40.
  • 41.
    Docker image: zembutsu/docker-sample-nginx FROMnginx:latest COPY default.conf /etc/nginx/conf.d/ COPY index.html /usr/share/nginx/html/ <html> <body> <h1>Host: <!--#echo var="HOSTNAME" --></h1> </body> </html> server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } ssi on; } Dockerfile index.html default.conf Docker 1.12.0-rc2 CentOS Linux release 7.2.1511 (Core) Linux manager-01 3.10.0-327.18.2.el7.x86_64 #1 SMP Thu May 12 11:03:55 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
  • 42.
  • 43.
    Docker 1.12 概要[2] Swarm 機能統合:Built-in Orchestration Docker Engine に Docker Swarm のクラスタ管理機能を統合 オプションとしての Swarm Mode なので、必須ではない 標準のセキュリティ機能 新しいサービスとイメージ管理 分散アプリケーション・バンドル(.dab) は JOSN 形式のフォーマットでサービス定義 docker deploy、docker stack コマンド (EXPERIMENTAL) Docker Store 発表 (private bate) 新機能 Dockerfileでヘルスチェックの定義 docker plugin コマンドのサポート ディスク・クォータ どっかで 使おうかな?
  • 44.
  • 45.
  • 46.
  • 47.
    参考 [1] The Evolutionof the Modern Software Supply Chain - The Docker Survey, 2016 https://www.docker.com/survey-2016/ [2] Docker 1.12: Now with Built-in Orchestration! | Docker Blog https://blog.docker.com/2016/06/docker-1-12-built-in-orchestration/ [3] Swarm mode key concepts https://docs.docker.com/engine/swarm/key-concepts/ [4] Docker for Ops: Docker Networking Deep Dive, Considerations and Troubleshooting http://www.slideshare.net/Docker/docker-for-ops- docker-networking-deep-dive-considerations-and-troubleshooting-by-madhu-venugopal-and-jana-radhakrishnan [5] What's New in Docker 1.12 by Mike Goelzer and Andrea Luzzardi http://www.slideshare.net/Docker/whats-new-in-docker-112-by-mike-goelzer-and-andrea-luzzardi 補足資料: Swarm mode overview https://docs.docker.com/engine/swarm/ Docker 1.12: swarm モードと Ingress Load Balancing 概要 · Pocketstudio Technology Log https://pocketstudio.net/2016/06/23/docker-1-12-swarm-mode-and-ingress-load-balancing/