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

47
Dockerの新しい技術とswarm modeの紹介 @zembutsu Docker 1.12 & Swarm Mode Introduction

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

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

D o c k e r の 新 し い 技 術 と s w a r m m o d e の 紹 介

@zembutsu

Docker 1.12 & Swarm ModeIntroduction

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

Docker のおさらい

Docker 1.12 の技術概要

新しいswarmモードの紹介と基本コマンド(デモ)

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

Docker?

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

開発環境で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, 2016https://www.docker.com/survey-2016

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

Dockerイメージ

コンテナ実行時に必要なファイルシステムtar アーカイブの中に Linux 用のファイル群が存在

イメージ・レイヤ(層)は読み込み専用

イメージはレイヤを共有レイヤは親子関係を持つ

ディスク容量消費を回避し、移動しやすく

コンテナ起動時にイメージを使用読み書き可能なレイヤを追加する

イメージ内のファイルを(isolate状態で)実行する

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

$ docker pull ubuntuUsing default tag: latestlatest: Pulling from library/ubuntu203137e8afd5: Pull complet2ff1bbbe9310: Pull complete933ae2486129: Pull completea3ed95caeb02: Pull completeDigest: sha256:1bea66e185d3464fec1abda32ffaf2a11de69833cfcf81bd2b9a5be147776814Status: Downloaded newer image for ubuntu:latest/

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

Dockerコンテナの操作

OS ( Linux )

物理/仮想サーバ

Docker エンジン( dockerd デーモン )

Linux kernel

コンテナ コンテナ コンテナ

リモートAPI

dockerクライアント TCP あるいは

Unix ソケットドメイン

containerdRuntime: runC (OCI規格準拠)

・docker コマンドLinux, Mac OS X, Windows

・Kitematic (GUI)Mac OS X, Windows

・Docker Compose

・Docker Swarm

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

コンテナのプロセス

httpdPID 1

コンテナA コンテナB

rubyPID 1

chris.rbPID 2

/sbin/initPID 1

httpdPID 6

rubyPID 7

chris.rbPID 8

alicePID 2

bobPID 3

PPID 1 PPID 1

PPID 4

PPID 5 PPID 5

PPID 7

PPID 1

containerdPID 5

dockerdPID 4

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

コンテナのファイルシステム

コンテナ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

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

コンテナの実行

コンテナAのファイルシステム

… …

コンテナBのファイルシステム

/etc(/data/ubuntu/etc)

/bin(/data/ubuntu/bin)

/etc(/data/centos/etc)

/bin(/data/centos/bin)

/ /

httpdPID 1

プロセスA プロセスB

rubyPID 1

chris.rbPID 2

コンテナA コンテナB

名前空間の isolate・プロセス・ファイルシステム・ネットワーク・ホスト名・UID・GID

リソース制限・CPU・メモリ・I/O・ディスク・クォータ

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

Docker Engine

Linux Kernel・namespaces・cgroups・capabilities … etc

LXC

libcontainer

runC

containerdv0.9~v1.11~

Version 7 Unixchrootjail

dockerd

v1.12~

デーモン

ライブラリランタイム

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

Dockerコンテナの操作

OS ( Linux )

物理/仮想サーバ

Docker エンジン( dockerd デーモン )

Linux kernel

コンテナ コンテナ コンテナ

リモートAPI

dockerクライアント TCP あるいは

Unix ソケットドメイン

containerdRuntime: runC (OCI規格準拠)

・docker コマンドLinux, Mac OS X, Windows

・Kitematic (GUI)Mac OS X, Windows

・Docker Compose

・Docker Swarm

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

Docker 1.12

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

現時点はリリース候補(RC)版

開発バージョンのバイナリ入手https://github.com/docker/docker/releases

# curl -fsSL https://test.docker.com/ | sh

注意点仕様変更

バグ

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

Docker 1.12 概要 [2]

Swarm 機能統合:Built-in OrchestrationDocker Engine に Docker Swarm のクラスタ管理機能を統合オプションとしての Swarm Mode なので、必須ではない標準のセキュリティ機能

新しいサービスとイメージ管理分散アプリケーション・バンドル(.dab) は JOSN 形式のフォーマットでサービス定義docker deploy、docker stack コマンド (EXPERIMENTAL)Docker Store 発表 (private bate)

新機能Dockerfileでヘルスチェックの定義docker plugin コマンドのサポートディスク・クォータ

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

$ docker run …

$ docker run …

$ docker run …

• 増減する環境

• 日々の運用

• 障害対応

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

内部分散ステート・ストアInternal Distrubuted State Store

マネージャManager

マネージャManager

マネージャManager

ワーカWorker

ワーカWorker

ワーカWorker

ワーカWorker

ワーカWorker

ワーカWorker

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

Built-in Orchestration

シンプルでありながら強力設計思想は、難しいことなく、とにかく動く(it just work)

クラスタ管理のために、複雑なセットアップが不要

docker service や docker node コマンドを標準サポート

柔軟性 (Resilient)アプリケーションの実行単位がサービス (service)であり、期待状態を定義

安全 (Secure)PKI 基盤が組み込まれており、クラスタ間通信は常に TLS 認証が有効

オプション機能と後方互換性swarmモードを有効化しても CPU やメモリのリソースを消費しない

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

Swarm マネージャ

Docker 1.12 RC の Docker Engine と Swarm

v1.11まで

swarm manage

Swarm ノード1 Swarm ノード2

swarm join swarm joinDocker Engine(docker daemon)

ディスカバリ・バックエンドConsulEtcdzookeeper

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)

allocateOverlay network

docker swam init(クラスタ初期化)

docker swam service create

内部DNSはサービス名でLoad balancing

サービスの公開ポートはIngress Load Balancingとして公開(どのノードのポートにアクセスしても、対象のサービス用ポートに到達。つまり、

コンテナが起動しなくても、ノード内のどこかの IP アドレスさえ分かればよい)Docker Engine クラスタを“Swarm”(群れ)と呼ぶ

Page 21: Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と 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

Page 22: Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と 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

After 1.12

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

Swarm mode

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

swarmモード

Docker標準搭載のクラスタとサービス管理機構Docker Engine v1.12RC1 から Docker Swarm と機能統合 (SwarmKit) [3]

クラスタを “Swarm” とよび、マネージャがノード上のサービスを簡単に一括管理

管理はサービスとタスクの単位アプリケーションの実行単位がサービス (service)であり、期待状態を定義

複製サービスとグローバル・サービスの2種類

タスクがコンテナのスケジューリング単位

マルチホスト対応のルーティング・メッシュ期待状態を維持するために、タスクの自動増減の対応やヘルスチェック機能

外部サービスはIngressロード・バランシングで負荷分散し、内部も DNS を持つ [4]

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

nginx

サービス

nginx.1

nginx.2

nginx.3

タスク コンテナ

nginx:latest

nginx:latest

nginx:latest

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

スタックstack

.dabDistributed Application Bundle

(JSON) docker deploydocker stack

What’s new in Docker 1.12 より [5]

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

internet

仮想マシン 仮想マシン 仮想マシン

network

Port 80 Port 80 Port 80

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

internet

仮想マシン 仮想マシン 仮想マシン

network

Port 80 Port 80 Port 80ingressOverlay network

・ルーティング・負荷分散

タスク タスク タスク

Swarmモードはクラスタの初期化$ docker swarm init$ docker swarm join <host>:2377

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

internet

仮想マシン 仮想マシン 仮想マシン

ingressVirtual Router

(IPVS)

タスク タスク タスクRouting mesh

network

サービス作成$ docker service create

「--constraint」でノードの指定「--mode=global」で全ノードに展開

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

manager-01 worker-01 worker-02

network

ingressOverlaynetwork

nginx nginx nginx

worker-03

nginxPort 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

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

internet

manager-01 worker-01 worker-02

ingressOverlaynetwork

nginx nginx nginx

worker-03

nginxPort 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

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

Swarm モード を つかう には

Page 34: Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と 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

クラスタ初期化

クラスタ参加

サービス作成

サービス一覧

タスク一覧

サービス更新

ローリング・アップデート

サービス削除

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

① 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 lsID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUSdhrbvl6o9xqvprsq2uzq8o9ev * 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 クラスタ

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

② swarm node join でクラスタに追加

マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2Manager 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 lsID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS6puvbl7tgxislfha5iaha40jm node-03 Accepted Ready Active9zj16or3durdh5i7c6khlench node-02 Accepted Ready Activedhrbvl6o9xqvprsq2uzq8o9ev * node-01 Accepted Ready Active Leader

「MANAGER STATUS」が無ければ、ワーカ・ノードとして動作ただし、この例のマネージャはワーカも兼ねている

TCP Port 2377 は、クラスタ管理の通信用TCP/UDP Port 7946 はノード間通信用TCP/UDP Port 4789 はオーバレイ・ネットワーク用

ワーカはマネージャからタスクを受け取る

マネージャでサービスを定義タスクをワーカに割り振る

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

③ swarm service create でサービス作成

マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2Manager 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 nginxf218o6xshkyt7zzxujhnz1a2h

nginx イメージを使う web という名前のサービスを作成

docker@node-01:~$ docker service lsID NAME REPLICAS IMAGE COMMAND13765buws9fr web 0/1 nginx

サービスはレプリカの期待数を定義「0/1」は期待数は 1 だが現状は 0

レプリカ数:1swarmのポート80をコンテナ内の80に割り当て

マネージャでサービスを定義タスクをワーカに割り振る

ID NAME REPLICAS IMAGE COMMAND13765buws9fr web 1/1 nginx

マネージャはノードにタスクを割り当て(スケジュールし)、タスク(としてのコンテナ)が起動すると「1/1」になる

サービス タスク(コンテナ)

nginxweb

スケジュール

コンテナ起動

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

④ ポートの公開と Ingress オーバレイ・ネットワーク

マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2Manager 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 lsNETWORK ID NAME DRIVER SCOPEbbb5e37b01e8 bridge bridge local6550c72b075f docker_gwbridge bridge local84baeb90cbb2 host host local9i5hmgqr20jh ingress overlay swarm7ab4c321bbe5 none null local

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

⑤ Ingress Load Balancing

マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2Manager 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)

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

ライブ デモ

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

Docker image: zembutsu/docker-sample-nginx

FROM nginx:latestCOPY 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-rc2CentOS 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

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

まとめ

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

Docker 1.12 概要 [2]

Swarm 機能統合:Built-in OrchestrationDocker Engine に Docker Swarm のクラスタ管理機能を統合オプションとしての Swarm Mode なので、必須ではない標準のセキュリティ機能

新しいサービスとイメージ管理分散アプリケーション・バンドル(.dab) は JOSN 形式のフォーマットでサービス定義docker deploy、docker stack コマンド (EXPERIMENTAL)Docker Store 発表 (private bate)

新機能Dockerfileでヘルスチェックの定義docker plugin コマンドのサポートディスク・クォータ

どっかで使おうかな?

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

最新の Docker に対応した日本語ドキュメント

http://docs.docker.jp

私からのお願い

まず読んで頂ければ…

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

なにか きになる ところ ありますか?

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

ありがとうございました

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

参考[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/