Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)

1.141 Aufrufe

Veröffentlicht am

Japan Container Days 登壇資料(フル版)です。
1日目の [1C5] のセッションで登壇の機会をいただきました。
当日公開時は時間にあわせた短縮版でお送りいたしました。
ご質問等ありましたらお気軽にドウゾ。

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)

  1. 1. Swarm mode Orchestration ~環境の再発明をComposeで脱却! ~ Sakura Internet, Inc. Masahito Zembutsu @zembutsu Japan Container Days Dec 4, 2018 Docker Compose &
  2. 2. 2 @zembutsu 前佛 雅人 zembutsu@zembutsuBlog: https://pocketstudio.net Factorio大好き https://factorio.com/ さくらインターネット株式会社 技術本部ミドルウェアグループ Technology Evangelist / Developer Advocate
  3. 3. 3 http://docs.docker.jp/
  4. 4. Dockerとは? 4 Why Docker? 1 Dockerコンテナは 実行に必要な全て をパッケージして、 簡単に動かせる 2 Dockerイメージは 複数のイメージ・レイ ヤとメタ情報の積み 重なり 3 コンテナのプロセス はデフォルトで isolate(隔離・分離) された状態  イメージ・レイヤ(image layer)は 読み込み専用  親子関係がある  イメージに対する変更はCopy on Write(CoW)処理が走る  コンテナ実行にはイメージが必要 で、Docker Hubから得られる  コンテナ実行時のみ、読み書きが 可能なレイヤを追加  namespace(名前空間)でプロセ ス空間やファイルシステムやネッ トワーク等を分ける技術と、 cgroups(コントロール・グループ) でリソースの利用上限を指定  コンテナはポートをデフォルトで開 かない  ネットワークはブリッジ、ホスト、 noneの3種類  ボリュームはコンテナ間でファイル システムを共有できる。名前付き (named)とホスト・ボリューム アプリケーションを 簡単に開発し、 移動し、実行するためのプログラム とプラットフォームを提供するのが Docker クライアント・サーバ 型 https://docker.com プロセスを簡単にコンテナ化(isolate)し、 簡単かつ素早く開発・移動・実行できるプラットフォームが Docker Containerization 「プロセス・ファイルシステム・ネットワーク・等々」に対して Namespace・Cgroup Build Ship Run
  5. 5. Docker 5 “Docker allows you to package an application with all of its dependencies into a standardized unit for software development.” www.docker.com 全ての依存関係をパッケージ化して、コンテナとして動かす Dockerイメージとして Linuxファイルシステムを
  6. 6. Dockerイメージはイメージ・レイヤの積み重ね 6 利用者からは 1つに見える 親 子 関 係 派生も 共有 利用者からは 1つに見える プログラムやライブラリと メタ情報(実行するプログラムやポートなど) だから高速に移動できる・開発を高速化できる リソースを有効に使える “lightweight” な性質
  7. 7. 7 利用者からは 1つに見える alpine docker image build -t <IMAGE:TAG> . (docker build)
  8. 8. 8 利用者からは 1つに見える hello:v1 FROM alpine ENTRYPOINT ["/bin/echo"] CMD ["こんにちは!こんにちは!"] docker image build -t hello:v1 . (docker build)
  9. 9. 9 hello:v1 FROM alpine ENTRYPOINT ["/bin/echo"] CMD [“おはよう!おはよう!"] docker image build -t hello:v2 . (docker build) hello:v2
  10. 10. Alpine Linux 10 https://www.alpinelinux.org
  11. 11. gliderlabs / docker-alpine 11 イメージ・レイヤ
  12. 12. docker image pull (docker pull) 12 $ docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world d1725b59e92d: Pull complete Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Status: Downloaded newer image for hello-world:latest Docker Hub
  13. 13. Docker 13 “Docker allows you to package an application with all of its dependencies into a standardized unit for software development.” www.docker.com 全ての依存関係をパッケージ化して、コンテナとして動かす Dockerイメージとして Linuxファイルシステムを
  14. 14. 14
  15. 15. DockerコンテナはDockerイメージを実行 15 元のレイヤに対する変更情報を記録 Copy on Write の性質 利用者からは 1つに見える 利用者からは 1つに見える だから高速に移動できる・開発を高速化できる リソースを有効に使える “lightweight” な性質
  16. 16. 16 Docker≠コンテナ コンテナは怖くないよ コンテナは友達さ!!
  17. 17. 17 技術と仕様 Technology Specification コンテナ Docker
  18. 18. 18 OS上のプロセスを isolate(分離)する insulatus→isolated→isolate isle island
  19. 19. 19
  20. 20. 21 プロセス等を名前空間で分離 cgroupでリソースを割り当て namespace isolate control group
  21. 21. PID名前空間 22 httpd PID 1 プロセスhttpd 名前空間 プロセスruby 名前空間 ruby PID 1 chris.rb PID 2 /sbin/init PID 1 containerd PID 5 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 dockerd PID 4 ホスト上には存在
  22. 22. ファイルシステムを分ける (chroot) 23 ubuntuの ファイルシステム … … centosの ファイルシステム /etc /bin /etc /bin / / /data/ubuntu /data/centos / /etc /data/bin ホスト上には存在
  23. 23. コンテナはプロセスの状態 24 コンテナ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 ・プロセス間通信、等 cgroupでリソース制限 ・CPU ・メモリ ・I/O ・ディスク・クォータ、等
  24. 24. 25 プロセス等を名前空間で分離 cgroupでリソースを割り当て namespace isolate control group
  25. 25. 26 コンテナやイメージの操作は コンテナIDやコンテナ・イメージIDを 中心に操作
  26. 26. Docker Engineのアーキテクチャ 27※ Docker Engine v1.11 以降 ユーザ (docker CLI等) Docker Container Engine dockerd containerd (docker-containerd) shim (docker-containerd-shim) shim (docker-containerd-shim) shim (docker-containerd-shim) runC (runtime-runc) コンテナ Docker Image コンテナ Docker Image コンテナ Docker Image JSON/REST API CNCF/OCI業界標準規格に準拠 runC (runtime-runc) runC (runtime-runc) gRPC エンドポイント Docker Engine トップレベルのデーモン (Moby プロジェクトの成果物) Docker イメージに含むファイルを、 パラメータに従い、コンテナとして実行 コンテナを実際に作成・起動する ランタイムのバイナリ・プログラム コンテナやイメージをはじめとし、 ネットワーク、ストレージを管理する 必要最小限のデーモン ランタイムが実行したコンテナを管理
  27. 27. 複数のコンテナを一括管理する Docker Compose Docker Compose 28
  28. 28. Docker Composeとは? 29 Why Docker Compose? 1 Composeは アプリケーションの サービスをファイル で定義する 2 Dockerコマンドと 高い親和性がある ので学習コストが 低い 3 Swarm モードに サービスをデプロイ できるオーケストレー ション機能  docker-compose CLI のコマン 体系は docker に準拠  例:「docker run -d」は 「docker-compose up -d」 Docker swarm モードを使えば、 サービス状態を定義できるので 常に期待状態を維持できる docker stack deploy Ingress ネットワークの活用  Compose ファイル (YAML形式) で Docker コンテナのサービスを 定義できるため、 再利用性が高い  コンテナの状態  イメージ  ネットワーク  ボリューム  メタ情報 https://github.com/docker/compose 複数のコンテナで構成するアプリケーションを 定義と実行するためのツール multi-container applications define and run
  29. 29. 30 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:
  30. 30. 31 Mastodon
  31. 31. 32 redis :alpine postgres :alpine サービス サービス イメージ イメージ nginx :alpine サービス イメージ gargron/mastodon :v1.4.6 サービス イメージ gargron/mastodon :v1.4.6 サービス イメージ gargron/mastodon :v1.4.6 サービス イメージ namshi/smtp :latest サービス イメージ https://github.com/tootsuite/mastodon ネットワーク 192.168.0.0/16 mastdon (external) ホスト側ネットワーク eth0等 mastodon_postgresmastodon_redis certbot (external) assets packs system volumevolume volume volume volume volume 80 443 80 443 services: volumes: networks:
  32. 32. 33 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) none (null) ブリッジ(bridge0 …) veth eth0 ethX
  33. 33. 34 3つの Docker 標準ネットワークモデル bridge (bridge) ブリッジ(bridge0 …) veth eth0 ethX none (null) host (host) 複数のブリッジ(ネットワーク)を定義できる デフォルトのbridge0ブリッジは、旧仕様の ネットワークで、挙動が異なる
  34. 34. 35 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) none (null) ブリッジ(bridge0 …) veth eth0 ethX ホスト側のネットワークに直接接続 ブリッジのオーバーヘッドがない一方で、 セキュリティに対する考慮が必要
  35. 35. 36 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) ブリッジ(bridge0 …) veth eth0 ethX ネットワークを追加しない限り疎通できない none (null)
  36. 36. 37 3つの Docker 標準ネットワークモデル bridge (bridge) host (host) none (null) ブリッジ(bridge0 …) veth eth0 ethX NAT (iptables) + docker-proxy ホストと ネットワーク 共通 疎通しない コンテナはパブリックなIPアドレスを持ない ホスト側のポート番号を重複して、コンテナ のポート利用(マッピング)はできない 動的なネットワークの追加・変更・削除
  37. 37. 38 コンテナは複数のネットワーク(ブリッジ)に接続できる ブリッジ1(bridge) veth eth0 ethX 各ネットワーク内部では、動的なコンテナ名 (サービス)の名前解決機能(サービス・ディス カバリ)を標準提供 eth0 eth1 eth0 ブリッジ2(bridge) veth192.168.0.1 172.18.0.2 172.18.0.3 172.19.0.2 172.19.0.3 172.19.0.1 172.19.0.0/16172.19.0.0/16 サービス・ディスカバリ連携の負荷分散
  38. 38. 39 データの扱い コンテナA専用 ファイル階層 File System … / /bin /etc /var コンテナB専用 ファイル階層 File System … / /bin /etc /var hello.txt × HOST Root File System /var/lib/docker/overlay/ hello.txt ディレクトリはストレージドライバによって異なる A BUFS( Union File System )
  39. 39. 40 コンテナ ファイル階層 File System / UFS ( Union File System)… / /bin /var Docker イメージ Docker Image /var/lib/docker/image/ volume / ボリューム Volume /data コンテナ用 イメージ層 Container’s Image Layer / /var/lib/docker/volumes//var/lib/docker/containers/ ReadOnly
  40. 40. 41 データ・ボリューム コンテナA専用 ファイル階層 File System … / /bin /etc /var コンテナからはUFSを通してデータ領域が見える ストレージ・ドライバのオーバヘッドを受けない 複数のコンテナでボリュームを共有できる volume /data / ボリューム Volume /var/lib/docker/volumes/HOST Root File System
  41. 41. 42 ボリュームは3分類 ホストをマウント 名前付き ホスト上のディレクトリ /docker/data /data 名前無し volume ボリュームの実体は、ホスト上のディレクトリ /var/lib/docker/volumes ボリュームはコンテナ間でデータを共有できる volume /data /data /etc
  42. 42. クラスタ初期化と join 手順 43 manager $ docker swarm init Swarm initialized: current node (hhzcdnj2r43ywjcmjcwbgvwa7) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapub….. <IP_ADDR>:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. worker $ docker swarm join ¥ --token SWMTKN-1-0w2m8k41xh1tbapub….. <IP_ADDR>:2377 managerのIPアドレスとポート This node joined a swarm as a worker.
  43. 43. クラスタ join 時のトークン確認 44 manager $ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapubwl7sd7j7x….. <IP_ADDR>:2377 manager $ docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapubwl7sd0m0….. <IP_ADDR>:2377
  44. 44. クラスタ状態確認 45 manager $ docker node ls $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS hhzcdnj2r43ywjcmjcwbgvwa7 * node-01 Ready Active Leader $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS hhzcdnj2r43ywjcmjcwbgvwa7 * node-01 Ready Active Leader znmguxtqwywhja9chkkaa6a7y node-02 Ready Active 2mgqqmgt0dlv9zc932nz9rkat node-03 Ready Active
  45. 45. Compose file でサービス作成・操作 46 manager $ vi docker-compose.yml 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 stack deploy -c ./docker-compose.yml demo Creating network demo_internal Creating service demo_web $ docker stack ls $ docker stack ps demo $ docker service scale demo_web=5 $ docker service stop demo $ docker stack rm demo
  46. 46. オーケストレーションと Swarm mode Orchestration 47
  47. 47. Cloud Native 参照アーキテクチャ Networking Provisioning Runtime Orchestration & Management Application Definition / Development Compute Storage マイクロサービス・パターン 分散オーケストレーションと管理 コンテナ化 インフラ ※ CNCFプロジェクトが定義する範囲外 【参考】 https://github.com/cncf/presentations/blob/master/2016-software-circus/what-is-cloud-native/what-is-cloud-native.pdf 48
  48. 48. 49 ( ( ) Scheduling Cluster Management Marathon,• chronos Docker swarm• Deis• fleet• • Apache Mesos • DCOS (Mesosphere) Orchestration 複数のホスト・システム上を横 断するアプリケーションをス ケール(拡大・縮小)できる機能 ※コンテナに依存しない Kubernetes• Docker Engine• (swarm mode) + Docker Compose Rancher• Nomad• 設定ファイルをベースに サービスを定義・維持 計算資源の抽象化
  49. 49. 従来のオーケストレーション 50【参考】 https://www.slideshare.net/Docker/container-orchestration-from-theory-to-practice/7 クラスタ 一方通行
  50. 50. 宣言型サービス・モデルのオーケストレーション 51 Declarative service model 【参考】 https://www.slideshare.net/Docker/container-orchestration-from-theory-to-practice/7 OD クラスタ Δ S D = 期待状態 O = オーケストレータ S = 状態 Δ = 状態から期待状態への収束 フィードバック  レプリカ作成  グローバル・サービス 並列 遅延 変更可能
  51. 51. 52 κυβερνήτης a captain, a steersman, a pilot, a navigator https://en.wiktionary.org/wiki/%CE%BA%CF%85%CE%B2%CE%B5%CF%81%CE%BD%CE%AE%CF%84%CE%B7%CF%82 /ky.ber.nɛ̌ː.tɛːs/ → /ky.βerˈni.tis/ → /ci.verˈni.tis/
  52. 52. 53
  53. 53. standalone swarm Docker Swarm vs Docker Swarm mode 54 SwarmKit Docker Engine Docker Engine Swarm マネージャ Swarm エージェント Swarm エージェント KVS リソース・プール 管 理 Docker Host Docker Host Swarm(クラスタ) Docker Engine Docker Engine Docker Engine swarm モード Docker Host Docker Host Docker Host Docker 1.12からクラスタ管理機能を内蔵管理用マネージャ・エージェントや KVS が別途必要
  54. 54. Swarm mode の構成要素 55 manager node worker node worker node swarm モード docker service や docker stack 等 クラスタとサービスの 管理コマンドを受け付け タスク (コンテナ) タスク (コンテナ) サービス docker service や docker stack 系コマンドの実行は、 kubectl と互換性を持つ ※ Docker for Mac で Experimental かつ Kubernetes 有効化の場合 Docker Engine Docker Engine Docker Engine swarm SwarmKit SwarmKit SwarmKit docker CLI - ネットワーク Ingress Network Routing Mesh Docker Compose YAML サービス定義 (option) docker コマンドを使い、 分散環境でも簡単に アプリをスケールできる
  55. 55. サービスとタスクの概念 56 「コンテナ」の起動ではない swarm manager 3 つの nginx レプリカ サービス worker node 【参考】 https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/#services-tasks-and-containers nginx.2 タスク worker node nginx.1 タスク worker node nginx.3 タスク nginx.latest コンテナ nginx.latest コンテナ nginx.latest コンテナ  期待状態に一致するよう タスク数を常に自動調整 docker service create 1.API命令を受け付けサービス・オブジェクト作成 2.サービスに一致するようタスクの調整 3.タスクに IP アドレス割り当て 4.タスクをノードに割り当て 5.タスクの実行を命令
  56. 56. swarm mode のネットワーク機能 57 Multi Host Networking Worker node Worker node Worker node サービス・ディスカバリ (動的な名前解決) overlay network Ingress network コンテナ PublishPort Routing Mesh 80 443 80 443 80 443 負荷分散
  57. 57. クラスタ初期化と サービス実行 58
  58. 58. Dockerのセットアップ 59 $ curl https://get.docker.com | head $ curl -fsSL get.docker.com -o get-docker.sh # sh ./get.docker.com # systemctl enable docker # systemctl start docker ※systemd系の場合 ※リポジトリの自動セットアップ ※コマンドの確認 Linuxで検証用途に手軽な方法
  59. 59. クラスタ初期化と join 手順 60 manager $ docker swarm init Swarm initialized: current node (hhzcdnj2r43ywjcmjcwbgvwa7) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapub….. <IP_ADDR>:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. worker $ docker swarm join ¥ --token SWMTKN-1-0w2m8k41xh1tbapub….. <IP_ADDR>:2377 managerのIPアドレスとポート This node joined a swarm as a worker.
  60. 60. クラスタ join 時のトークン確認 61 manager $ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapubwl7sd7j7x….. <IP_ADDR>:2377 manager $ docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-0w2m8k41xh1tbapubwl7sd0m0….. <IP_ADDR>:2377
  61. 61. クラスタ状態確認 62 manager $ docker node ls $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS hhzcdnj2r43ywjcmjcwbgvwa7 * node-01 Ready Active Leader $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS hhzcdnj2r43ywjcmjcwbgvwa7 * node-01 Ready Active Leader znmguxtqwywhja9chkkaa6a7y node-02 Ready Active 2mgqqmgt0dlv9zc932nz9rkat node-03 Ready Active
  62. 62. まとめと振り返り recap 63
  63. 63. Dockerとは? 64 Why Docker? 1 Dockerコンテナは 実行に必要な全て をパッケージして、 簡単に動かせる 2 Dockerイメージは 複数のイメージ・レイ ヤとメタ情報の積み 重なり 3 コンテナのプロセス はデフォルトで isolate(隔離・分離) された状態 イメージ・レイヤ (image layer)は 読み込み専用 親子関係 がある イメージに 対する変更はCopy on Write(CoW)処理が走る コンテナ 実行にはイメージが必要 で、Docker Hubから得られる コンテナ 実行時のみ、読み書きが 可能なレイヤを追加 namespace (名前空間)でプロセ ス空間やファイルシステムやネッ トワーク等を分ける技術と、 cgroups(コントロール・グループ) でリソースの利用上限を指定 コンテナはポートをデフォルトで 開 かない ネットワークはブリッジ 、ホスト、 noneの3種類 ボリュームはコンテナ 間でファイル システムを共有できる。名前付き (named)とホスト・ボリューム  アプリケーションを簡単に開発し、 移動し、実行するためのプログラム とプラットフォームを提供するのが Docker  クライアント・サーバ型 https://docker.com プロセスを簡単にコンテナ化(isolate)し、 簡単かつ素早く開発・移動・実行できるプラットフォームが Docker Containerization 「プロセス・ファイルシステム・ネットワーク・等々」に対して Namespace・Cgroup Build Ship Run
  64. 64. Docker Composeとは? 65 Why Docker Compose? 1 Composeは アプリケーションの サービスをファイル で定義する 2 Dockerコマンドと 高い親和性がある ので学習コストが 低い 3 Swarm モードに サービスをデプロイ できるオーケストレー ション機能  docker-compose CLI のコマン 体系は docker に準拠  例:「docker run -d」は 「docker-compose up -d」  Docker swarm モードを使えば、 サービス状態を定義できるので 常に期待状態を維持できる  docker stack deploy  Ingress ネットワークの活用 Compose ファイル (YAML形式) で Docker コンテナのサービスを 定義できるため、 再利用性が高い コンテナの 状態 イメージ ネットワーク ボリューム メタ 情報 https://github.com/docker/compose 複数のコンテナで構成するアプリケーションを 定義と実行するためのツール multi-container applications define and run
  65. 65. Q&A • 何か気になるところはありますか? • https://slideshare.net/zembutsu • Dockerドキュメント日本語訳 http://docs.docker.jp • 公式ドキュメント https://docs.docker.com 66

×