Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コンテナ技術とコンテナオーケストレーション 入門_改訂版

657fb6673f7551440601417843ec5152?s=47 tarosaiba
February 28, 2019

コンテナ技術とコンテナオーケストレーション 入門_改訂版

657fb6673f7551440601417843ec5152?s=128

tarosaiba

February 28, 2019
Tweet

Transcript

  1. コンテナ技術と コンテナオーケストレーション 入門 2019/2/28 Shuntaro Saiba これからのアプリケーションデプロイが変わる 1 改 訂

    版 v2
  2. @tarosaiba • Future Architect, Inc • TIG所属 4年目 • Infra

    - MW - CI 周りやってきました • AWS/GCP • Infrastructure as Codeの導入が得意 http://www.atmarkit.co.jp/ait/articles/1806/05/news010_2.html Shuntaro Saiba 2
  3. 3 私のいままで エンプラ小売り & AWS エンプラ金融 & オンプレ エンプラ小売り &

    GCP エンプラ小売り & AWS
  4. 4 私のいままで エンプラ小売り & AWS エンプラ金融 & オンプレ エンプラ小売り &

    GCP エンプラ小売り & AWS 本番環境でコンテナ運 用を経験
  5. 5 私のいままで (余談) エンプラ小売り & AWS エンプラ金融 & オンプレ エンプラ小売り

    & GCP エンプラ小売り & AWS おじさんたちに Ansibleを導入
  6. 6 スクラム崩壊からの復活、神Excel手順書ベースの運用からAnsibleでの 自動化へ――泥臭い現場の取り組みに学ぶ、明日から使える開発ノウハウ https://www.atmarkit.co.jp/ait/articles/1806/05/news010.html

  7. 想定読者 • 最近、「コンテナ」よく聞くけど、何それ? 何が便利なの? • コンテナが便利なのは知ってるけど、どうやって使えばよいの? • 「Kubernetes」「ECS」って何!? • これからのシステム構築、アプリデプロイはどう変わっていくの?

    7
  8. 8 目次

  9. 1. コンテナとは? 2. コンテナオーケストレーションとは? 3. これからのアプリケーション開発 & デプロイ & 運用

    方法 4. コンテナあれこれ NEW! 9 Contents
  10. • ECSでSpringbootアプリをデプロイ • コンテナ構築ベストプラクティス • コンテナでのCI/CD って? • コンテナでバッチ処理 どうする?

    • コンテナの監視 / ログってどうする? • コンテナ使わぬべきところ • コンテナアンチパターンな使い方 10 コンテナあれこれ • Dockerの動作原理 (namespace / cgroup) • コンテナのネットワーク どうなっている? • コンテナの永続ディスクは使える ? • Docker Imageの仕組み 実践編 深い編 別 資 料 別 資 料
  11. 11 この講義の背景

  12. 12 コンテナ   キテマス

  13. 13 Kubernetes is infrastructure for next generation applications, PaaS and

    more. –Brendan Burns, Partner Architect, at Microsoft and co-founder of Kubernetes
  14. 14 Kubernetes is infrastructure for next generation applications, PaaS and

    more. –Brendan Burns, Partner Architect, at Microsoft and co-founder of Kubernetes 私個人 ほんと〜にそう思う!!
  15. 15 なので、今のうちに基本だけ 抑えておきましょう

  16. 1. コンテナとは? 2. コンテナオーケストレーションとは? 3. これからのアプリケーション開発 & デプロイ & 運用

    方法 4. コンテナあれこれ 16 Contents
  17. 17 1. コンテナとは?

  18. Container とは • 最近、「コンテナ」よく聞くけど、何それ? 何が便利なの? 18 https://docs.docker.com/get-started/#docker-concepts

  19. Container とは • 最近、「コンテナ」よく聞くけど、何それ? 何が便利なの? 19 https://docs.docker.com/get-started/#docker-concepts コレです

  20. Container とは • アプリケーション、構成、及び依存関係を パッケージできるもの • 仮想化技術の一つ • 物流業界の”コンテナ” から由来

    20 Configuration Source code Runtime Engine Dependencies
  21. Docker とは • コンテナ型のアプリケーション実行環 境の一つ • オープンソース • コンテナといえば、Docker というほどメジャーな存在

    21
  22. 22 で、なにが便利なの

  23. Docker で Hello word • ただ 「Hello World」と出力す るだけ •

    Docker公式のチュートリアル にあります https://docs.docker.com/get-started/#test-docker-version 23 # docker run > docker run hello-world # docker run > docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly.
  24. Docker で nginx 24 # docker run > docker run

    --name nginx -d -p 8080:80 nginx:latest • nginx を動かしてみよう
  25. Docker で tomcat 25 # docker run > docker run

    --name tomcat -d -p 8080:8080 tomcat:latest • tomcat を動かしてみよう
  26. Docker で Jenkins 26 # docker run > docker run

    --name jenkins -d -p 8080:8080 jenkins:latest • Jenkins を動かしてみよう
  27. (おまけ) Docker で Hello word • ただ 「Hello World」と出力す るだけではなく、

    こんなことも できます • cowsay というツールを使って います 27 # docker run > docker run docker/whalesay cowsay Hello.I am Saiba. ___________________ < Hello.I am Saiba. > ------------------- \ \ \ ## . ## ## ## == ## ## ## ## === /""""""""""""""""___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\______/
  28. 28 なにがおきた?

  29.   Docker Host イメージ図 29  Docker Registry Docker Deamon Containers Images

  30.   Docker Host イメージ図 30  Docker Registry Docker Deamon Containers Images

  31.   Docker Host イメージ図 31  Docker Registry Docker Deamon Containers Images

  32. 登場人物 1. Docker image 32 • コンテナを動かす際に、元になるイメー ジ • イメージは、リポジトリ(Docker Hub等)

    で 公開・共有可能 Docker Image
  33. 【参考】 Docker hub 33 • 様々なソフトウェアが、Docker imageと して公開されている • Docker

    公式のリポジトリ • 個人でimageをアップロードして、公開 することも可能 https://hub.docker.com/
  34. 登場人物 1. Docker Container 34 • イメージを元に作られる実体 • 中でアプリケーションが稼働している • 1ホストに複数稼働可能

    Docker Container
  35. 35 仮想マシン(VM)的な?

  36. 36 少し違うんです。

  37. 37 Infrastructure Host Operating System Hypervisor Guest OS VM Guest

    OS VM 動作イメージ Bins/Libs Bins/Libs App A App B Infrastructure Host Operating System Docker Engine Bins/Libs Bins/Libs App A App B 仮想マシン コンテナ
  38. 38 How to use Container Step 1

  39. 基本の使い方 39 1. docker pull 2. docker run 3. docker

    ps 4. docker stop 5. docker start 6. docker rm
  40. 40 ※ 細かいコマンドの使い方 は説明しません。 イメージだけつければOKです

  41. 1. docker pull 41 • コンテナのイメージをダウンロードします Docker Deamon Containers Images

    Repogitory # docker pull > docker pull centos:latest latest: Pulling from library/centos a02a4930cb5d: Downloading [========> [..] pull
  42. 2. docker run 42 # docker run > docker run

    --name nginx -d -p 8080:80 nginx:latest • イメージからコンテナを作成します Docker Deamon Containers Images Repogitory run
  43. 3. docker ps 43 # docker ps > docker ps

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 94641045a2b7 nginx:latest "nginx -g 'daemon off" 9 seconds ago Up 7 seconds 0.0.0.0:8080->80/tcp nginx • コンテナのステータスを確認します Docker Deamon Containers Images Repogitory ps
  44. 4. docker stop 44 • コンテナを停止します Docker Deamon Containers Images

    Repogitory # docker stop > docker stop nginx stop
  45. 5. docker start 45 • コンテナを起動します Docker Deamon Containers Images

    Repogitory # docker start > docker start nginx start
  46. 6. docker rm 46 • コンテナを削除します Docker Deamon Containers Images

    Repogitory # docker rm > docker rm nginx rm
  47. コンテナのライフサイクル 47 Images Repogitory Containers pull stop start run remove

    Dockerfile push build 後ほど 解説
  48. 48 すごく便利なのはお分かり いだたけましたか?

  49. Why!? Container 49

  50. 50 いろいろありますが、

  51. 51 Immutableなインフラを 提供できるから

  52. 52

  53. Immutableなインフラ これまでのインフラ Immutableな インフラ サーバ 構築 サーバ 構築 サーバ 構築

    サーバ メンテ サーバ メンテ サーバ メンテ 53
  54. 54 ここがすごく大事 なので、イメージを

  55. Immutable なインフラ 55 これまでのインフラ = ペット Immutableなインフラ = 家畜

  56. Immutable なインフラ 56 これまでのインフラ = ペット Immutableなインフラ = 家畜 悪く?言えば、使い捨てです

  57. Immutable は何が嬉しい • サーバ構成変更の履歴管理が不要 • つまり、サーバの設定誰か勝手に変えただろ!! → 犯人探し みたいなことがなくなる •

    本番環境とステージング環境で設定差異があって、障害発生.. みたいなこともなくなる • (※ コンテナでなくて、仮想マシンでも実現は可能 ) 57
  58. 58

  59. 59 と、大事なアプリ

  60. コンテナにアプリを入れる 60 Container Image Bins/Libs App • たとえば、”Javaのアプリケーション” • と、”必要な実行環境”

    をコンテナでパッケージング Build
  61. 61 これで動かせます

  62. 仮想マシンのときは 62 仮想マシン ver EC2 Amazon Linux Tomcat   Application RDS

    MySQL
  63. _ コンテナにすると、こんな感じ 63 コンテナ ver EC2 Amazon Linux Tomcat   Application

    Docker Engine _ RDS MySQL
  64. _ コンテナにすると、こんな感じ 64 コンテナ ver EC2 Amazon Linux Tomcat   Application

    Docker Engine _ RDS MySQL Container Container
  65. くらべてみましょう 65 仮想マシン ver EC2 Amazon Linux Tomcat   Application _

    EC2 Amazon Linux Tomcat   Application Docker _ コンテナ ver
  66. 改めて、なぜContainerなのか • Immutableなインフラとアプリをセットで動かせる • どの環境でも同じように動く (ポータビリティを実現) • (仮想マシンと比較して)、軽量でありアプリデプロイが高速に行える • リソースを効率よく使える

    ( 複数のアプリが相乗り可能) 66
  67. 67

  68. 68 この憎きとはやり取りはさようなら

  69. • 開発用のイメージを配布。開発者はその上でアプリを開発 みんなが同じ環境(インフラ)で開発 69 Images Local Local Development 配布 作成

  70. • 開発用のイメージを配布。開発者はその上でアプリを開発 みんなが同じ環境(インフラ)で開発 70 Images Local Local Development 配布 作成

    SAME IMAGE SAME IMAGE
  71. • 開発環境 → ステージング環境 → 本番環境 すべて同じイメージ 異なる環境への安心デプロイ 71 Images

    Production Staging Local Development
  72. • 開発環境 → ステージング環境 → 本番環境 すべて同じイメージ 異なる環境への安心デプロイ 72 Images

    Production Staging Local SAME IMAGE SAME IMAGE SAME IMAGE Development
  73. クラウド移行も簡単 • オンプレ→クラウド、 クラウド→別クラウド への移行も簡単 ※ Kubernetesを利用すると便利 73 Other Cloud

    Other Cloud Cloud
  74. How to use Container Step 2 74

  75. 75 コンテナについて イメージつけれたと思うので もう1Step進めます

  76. 基本の使い方 Step2 76 1. Docker file 2. docker build 3.

    docker push
  77. 1. Docker file 77 • Docker imageを 作成するための設定ファ イル •

    アプリが依存するミドルウェアやOSのライ ブラリを設定、アプリそのものを配置する • 今までのサーバ構築の手順は、このファイ ルに代わる (pkgインストール、設定ファイ ル編集 等..) # ※あくまでもサンプルです。これでは動きません※ # ベースのイメージを指定 FROM alpine:3.8 # JavaをInstall RUN apk add --update openjdk8 # 環境変数を設定 ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk ENV PATH $PATH:/usr/lib/jvm/java-1.8-openjdk/jre/bin # my-app.jarをコンテナにコピー COPY ./my-app.jar / # コンテナ内でmy-app.jarを実行 CMD [“java”, “-jar”, “./my-app.jar”] EXPOSE 80
  78. 2. docker build 78 • Dockerfile の設定に基づいて、Docker imageを作成(ビルド)する Docker Deamon

    Containers Images Dockerfile # Dockerfile > ls Dockerfile # docker build > docker build ./ -t example:latest build
  79. 3. docker push 79 • Docker imageを、リポジトリにアップして、 共有・公開できるようにする Docker Deamon

    Containers Images # docker push > docker push example:latest push Repogitory
  80. コンテナのライフサイクル (再掲) 80 Images Repogitory Dockerfile Containers push build pull

    stop start run
  81. 1. コンテナとは? 2. コンテナオーケストレーションとは? 3. これからのアプリケーション開発 & デプロイ & 運用

    方法 81 Contents
  82. 82 2. コンテナオーケストレーションとは

  83. What is Container Orchestration 83

  84. 84

  85. 85 コレです

  86. オーケストレーションツールとは • 運用環境でコンテナを管理してくれるツール • 複数のコンテナの監視と制御を行ってくれる 86 Images Repogitory Dockerfile Production

    ココの部分
  87. いろいろなサービス 87

  88. なにをしてくれるのか 88 • コンテナ間&外部とのNW 制御 • デプロイ/ロールバック • 監視 •

    自動復旧 • スケーリング • etc.. Host Servers 通信 通信 監視 スケーリング オーケストレーション ツール
  89. 89 コンテナはすごく便利 だけど、管理するのが大変 だから必要 ペットみたいに あまり言うこと聞いてくれない

  90. 主要なサービス 90 Elastic Container Service Google Kubernetes Engine ※ 旧式アイコンで失礼します

  91. ECS (Elastic Container Service) 91 • AWSのマネージドサービス • AWS独自のコンテナオーケストレーションツール •

    Docker コンテナフォーマットをサポート
  92. ECS の簡単な仕組み 92 ECS Cluster EC2 EC2 Service Task Task

    ・・・ • EC2でクラスタを構成 • Task(=コンテナ)で コンテ ナイメージを指定 • ServiceでTask数を指定
  93. GKE (Google Kubernetes Engine) 93 • GCPのマネージドサービス • (Googleが開発した) Kubernetes

    を マネージドで利用可能 • Docker コンテナフォーマットをサポート
  94. GKE の簡単な仕組み 94 GKE Cluster GCE Host GCE Host Deployment

    Pod Pod ・・・ • GCEでクラスタを構成 • Deploymentで コンテナイメージと稼働数 を設定 • Pod (=コンテナ)
  95. 95 大体どちらも 同じようなことができます

  96. 96 ただ、Kubernetesの方が良いです どっちも使ってみたけど Kubernetesのほうが使いやすい!

  97. AWSでも Kubernetes 97 https://www.slideshare.net/AmazonWebServices/srv318-running-kubernetes-with-amazon-eks

  98. Azureでも Kubernetes 98

  99. ORACLEでも Kubernetes 99

  100. Alibabaでも Kubernetes 100

  101. 101 Kubernetesに関しては 以下の資料を Comming soon

  102. 1. コンテナとは? 2. コンテナオーケストレーションとは? 3. これからのアプリケーション開発 & デプロイ & 運用

    方法 4. コンテナあれこれ 102 Contents
  103. 103 3. これからのアプリケーションデ プロイ方法

  104. 104 従来のやり方から ガラッと変わると思います

  105. いろいろ変わる 105    開発フローが変わる    アプリの作りが変わる    インフラ構成が変わる    役割が変わる

  106. 開発フローが変わる 106 Production Staging Repogitory App Source Dockerfile Image COMMIT

    DEPLOY BUILD / TEST
  107. アプリの作りが変わる 107 • 1つのコンテナには、1つのプロセス(アプリ) だけを動かす • 1つのコンテナイメージで、複数環境にデプロイできるように アプリの設定(DB接続先) は環境変数で渡せるようにする •

    コンテナは、ステートレスにする (ステートを持つ情報はDBなどのサービスで保持)
  108. 【参考】THE TWELVE-FACTOR 108 https://12factor.net/ja/

  109. THE TWELVE-FACTOR APP 109 • I. コードベース ◦ バージョン管理されている 1つのコードベースと複数のデプロイ

    • II. 依存関係 ◦ 依存関係を明示的に宣言し分離 • III. 設定 ◦ 設定を環境変数に格納する • IV. バックエンドサービス ◦ バックエンドサービスをアタッチされた リソースとして扱う • V. ビルド、リリース、実行 ◦ 3つのステージを厳密に分離する • VI. プロセス ◦ アプリケーションを1つもしくは複数の ステートレスなプロセスとして実行する • VII. ポートバインディング ◦ ポートバインディングを通してサービスを公開 • VIII. 並行性 ◦ プロセスモデルによってスケールアウトする • IX. 廃棄容易性 ◦ 高速な起動とグレースフルシャットダウンで堅牢性 を最大化する • X. 開発/本番一致 ◦ 開発、ステージング、本番環境をできるだけ一致さ せた状態を保つ • XI. ログ ◦ ログをイベントストリームとして扱う • XII. 管理プロセス ◦ 管理タスクを1回限りのプロセスとして実行する https://12factor.net/ja/
  110. 1. One codebase, one application (バージョン管理 1つのコードに1つのアプリ) 2. API first

    (APIの設計から) 3. Dependency management (依存関係を明示的に宣言) 4. Design, build, release, and run (設計→ビルド→リリース→実行) 5. Configuration, credentials, and code (設定は環境変数へ) 6. Logs (ログはイベントストリームとして扱う) 7. Disposability (高速な起動&グレースフルシャットダウン) 8. Backing services (バックエンドサービスをアタッチされたリソースとして) 9. Environment parity (すべての環境を一致させる) 10. Administrative processes (管理タスクはアプリから分離) 11. Port binding (ポートバインディングではなく、コンテナ単位でサービス公開) 12. Stateless processes (セッション情報は共有キャッシュで管理) 13. Concurrency (not スケールアップ but スケールアウト) 14. Telemetry (リモート監視) 15. Authentication and authorization (ロースベースの認証と認可) 【参考】Beyond the Twelve-Factor 110
  111. インフラ構成が変わる (ECS ver) 111 RDS ECS tomcat Cluster ECS httpd

    Cluster ALB ALB ※ あくまでも参考で、イメージ程度で Container (Task)
  112. インフラ構成が変わる (GKE ver) 112 Cloud SQL GKE Cluster Cloud Load

    Balancing ※ あくまでも参考で、イメージ程度で Service (Kubernetes) Container (Pod)
  113. 【参考】Kubernetes アイコン 113 https://docs.google.com/presentation/d/15h_MHjR2fzXIiGZniUdHok_FP07u1L8MAX5cN1r0j4U/edit

  114. 役割が変わる 114 いままで Production アプリメンバ インフラメンバ モジュール メンテ

  115. 役割が変わる 115 いままで これから Production アプリメンバ インフラメンバ モジュール メンテ Production

    アプリメンバ インフラメンバ コンテナ イメージ メンテ
  116. 役割が変わる 116 • コンテナを作る • コンテナを動かす アプリケーション作り に集中できる! サービスの安定運用 に集中できる!

  117. 役割が変わる 117 • コンテナを作る • コンテナを動かす アプリケーション作り に集中できる! サービスの安定運用 に集中できる!

    もちろん連携は必須
  118. (アプリの人が主に) 考えること 118 • アプリケーション自体 • コンテナ仕様に則したアプリケーション設計 • etc.

  119. (インフラの人が主に) 考えること 119 • コンテナへのリソースの配分/制限 • スケーリング戦略 (コンテナ/ノード) • コンテナのデプロイフローの確立

    • 監視方法 • etc.
  120. 120 コンテナを使ったこれからの開発 少しはイメージ 湧きましたでしょうか

  121. 121 いったんまとめ

  122. 1. コンテナとは? 2. コンテナオーケストレーションとは? 3. これからのアプリケーション開発 & デプロイ & 運用

    方法 4. コンテナあれこれ 122 Contents
  123. 123    コンテナ導入 はじめは考え方に慣れるのが大変ですが メリットは超絶多いです。 がんばりましょう

  124. 124 4. コンテナあれこれ

  125. • ECSでSpringbootアプリをデプロイ • コンテナ構築ベストプラクティス • コンテナでのCI/CD って? • コンテナでバッチ処理 どうする?

    • コンテナの監視 / ログってどうする? • コンテナ使わぬべきところ • アンチパターンな使い方 125 コンテナあれこれ • Dockerの動作原理 (namespace / cgroup) • コンテナのネットワーク どうなっている? • コンテナの永続ディスクは使える ? • Docker Imageの仕組み 実践編 深い編 別 資 料 別 資 料
  126. ECSでSpringbootアプリをデプロイ 126 実践編 別 資 料 https://speakerdeck.com/tarosaiba/elasticcontainerserviceshanzuon

  127. コンテナ構築ベストプラクティス 127 実践編 別 資 料 https://cloud.google.com/solutions/best-practices-for-building-containers Googleのがわかりやすい! (人任せ)

  128. コンテナでのCI/CD 128 実践編 SCM CI tool Container Repositry Container Orchestration

    Container Deploy tool Commit Pull Push Deploy Build Test
  129. コンテナでのバッチ処理 129 実践編 バッチ処理 Data store or something 消えてなくなる コンテナ起動

    Scheduler / Controller バッチ実行
  130. コンテナの監視 / ログ 130 実践編 Host Container Container APP APP

    APP APP ORCHESTRATION 監視 ログ Log Aggregation ログ転送 Alert Analytics ..
  131. コンテナ使わぬべきところ 131 実践編 さけたい on Docker できれば with マネージド

  132. アンチパターンな使い方 132 実践編 Docker commit Docker commit ssh でサーバ変更 scp

    でファイル転送
  133. Dockerの動作原理 (1/2) 133 裏側編 /sbin/init PID 1 PID名前空間 hoge PID

    2 fuga PID 3 dockerd PID 4 httpd PID 10 start.sh PID 11 httpd PID 1 start.sh PID 1 java PID 2 java PID 12 コンテナ B コンテナ A ファイルシステム / /etc /bin /data /data/A /data/B コンテナ B コンテナ A / / /bin /etc /bin /etc ・・ ・・ ホスト ホスト
  134. 134 Dockerの動作原理 (2/2) Infrastructure Host Operating System Docker Engine Bins/Libs

    Bins/Libs App A App B コンテナ 裏側編 コンテナ B コンテナ A httpd PID 1 bash PID 1 java PID 2 / /bin /etc / /bin /etc namespaceの分離 cgroupでリソース制限
  135. コンテナのネットワーク 135 裏側編 Host bridge host none NAT+docker-proxy ホストと共通 疎通しない

    eth0 veth ethx
  136. コンテナの永続ディスク 136 裏側編 ホスト コンテナ A / /data /var /lib/docker

    コンテナ B コンテナB コンテナA Local Storage area volume volume # docker run with mount # -v [host path]:[container path] > docker run -v /data:/var/lib/db containerA mount
  137. Docker Image の仕組み 137 裏側編 FROM debian : 9 STEP

    1 : install java STEP 2 : set config STEP 3 : deploy jar file A FROM debian : 9 STEP 1 : install java STEP 2 : set config STEP 3 : deploy jar file B FIRST Build SECOND Build
  138. 138 おわり