Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

5,748 views

Published on

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

平成28年6月29日(水)
Dockercon 2016報告会 #tistudy201606 発表資料
http://thinkit.connpass.com/event/28529/

■捕捉
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/

Swarm モード概要 — Docker-docs-ja 1.12.RC ドキュメント
http://docs.docker.jp/engine/swarm/index.html

Published in: Software

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

  1. 1. D o c k e r の 新 し い 技 術 と s w a r m m o d e の 紹 介 @zembutsu Docker 1.12 & Swarm Mode Introduction
  2. 2. Docker のおさらい Docker 1.12 の技術概要 新しいswarmモードの紹介と基本コマンド(デモ)
  3. 3. Docker?
  4. 4. 開発環境で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
  5. 5. Dockerイメージ コンテナ実行時に必要なファイルシステム tar アーカイブの中に Linux 用のファイル群が存在 イメージ・レイヤ(層)は読み込み専用 イメージはレイヤを共有 レイヤは親子関係を持つ ディスク容量消費を回避し、移動しやすく コンテナ起動時にイメージを使用 読み書き可能なレイヤを追加する イメージ内のファイルを(isolate状態で)実行する
  6. 6. $ 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/
  7. 7. 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
  8. 8. コンテナのプロセス 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
  9. 9. コンテナのファイルシステム コンテナ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
  10. 10. コンテナの実行 コンテナ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 ・ディスク・クォータ
  11. 11. Docker Engine Linux Kernel ・namespaces ・cgroups ・capabilities … etc LXC libcontaine r runC containerdv0.9~ v1.11~ Version 7 Unix chroot jail dockerd v1.12~ デーモン ライブラリ ランタイム
  12. 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
  13. 13. Docker 1.12
  14. 14. 現時点はリリース候補(RC)版 開発バージョンのバイナリ入手 https://github.com/docker/docker/releases # curl -fsSL https://test.docker.com/ | sh 注意点 仕様変更 バグ
  15. 15. 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 コマンドのサポート ディスク・クォータ
  16. 16. $ docker run … $ docker run … $ docker run … • 増減する環境 • 日々の運用 • 障害対応
  17. 17. 内部分散ステート・ストア Internal Distrubuted State Store マネージャ Manager マネージャ Manager マネージャ Manager ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker
  18. 18. Built-in Orchestration シンプルでありながら強力 設計思想は、難しいことなく、とにかく動く(it just work) クラスタ管理のために、複雑なセットアップが不要 docker service や docker node コマンドを標準サポート 柔軟性 (Resilient) アプリケーションの実行単位がサービス (service)であり、期待状態を定義 安全 (Secure) PKI 基盤が組み込まれており、クラスタ間通信は常に TLS 認証が有効 オプション機能と後方互換性 swarmモードを有効化しても CPU やメモリのリソースを消費しない
  19. 19. 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”(群れ)と呼ぶ
  20. 20. 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
  21. 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 After 1.12
  22. 22. Swarm mode
  23. 23. swarmモード Docker標準搭載のクラスタとサービス管理機構 Docker Engine v1.12RC1 から Docker Swarm と機能統合 (SwarmKit) [3] クラスタを “Swarm” とよび、マネージャがノード上のサービスを簡単に一括管理 管理はサービスとタスクの単位 アプリケーションの実行単位がサービス (service)であり、期待状態を定義 複製サービスとグローバル・サービスの2種類 タスクがコンテナのスケジューリング単位 マルチホスト対応のルーティング・メッシュ 期待状態を維持するために、タスクの自動増減の対応やヘルスチェック機能 外部サービスはIngressロード・バランシングで負荷分散し、内部も DNS を持つ [4]
  24. 24. nginx サービス nginx.1 nginx.2 nginx.3 タスク コンテナ nginx:latest nginx:latest nginx:latest
  25. 25. スタック stack .dab Distributed Application Bundle (JSON) docker deploy docker stack What’s new in Docker 1.12 より [5]
  26. 26. internet 仮想マシン 仮想マシン 仮想マシン network Port 80 Port 80 Port 80
  27. 27. internet 仮想マシン 仮想マシン 仮想マシン network Port 80 Port 80 Port 80ingress Overlay network ・ルーティング ・負荷分散 タスク タスク タスク Swarmモードはクラスタの初期化 $ docker swarm init $ docker swarm join <host>:2377
  28. 28. internet 仮想マシン 仮想マシン 仮想マシン ingress Virtual Router (IPVS) タスク タスク タスク Routing mesh network サービス作成 $ docker service create 「--constraint」でノードの指定 「--mode=global」で全ノードに展開
  29. 29. 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
  30. 30. 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
  31. 31. Swarm モード を つかう には
  32. 32. 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 クラスタ初期化 クラスタ参加 サービス作成 サービス一覧 タスク一覧 サービス更新 ローリング・アップデート サービス削除
  33. 33. ① 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 クラスタ
  34. 34. ② 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 はオーバレイ・ネットワーク用 ワーカはマネージャから タスクを受け取る マネージャでサービスを定義 タスクをワーカに割り振る
  35. 35. ③ 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 スケジュール コンテナ起動
  36. 36. ④ ポートの公開と 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
  37. 37. ⑤ 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)
  38. 38. ライブ デモ
  39. 39. 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
  40. 40. まとめ
  41. 41. 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 コマンドのサポート ディスク・クォータ どっかで 使おうかな?
  42. 42. 最新の Docker に対応した日本語ドキュメント http://docs.docker.jp 私からのお願い まず読んで頂ければ…
  43. 43. なにか きになる ところ ありますか?
  44. 44. ありがとうございました
  45. 45. 参考 [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/

×