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

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

tarosaiba
February 28, 2019

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

tarosaiba

February 28, 2019
Tweet

More Decks by tarosaiba

Other Decks in Technology

Transcript

  1. @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
  2. 4 私のいままで エンプラ小売り & AWS エンプラ金融 & オンプレ エンプラ小売り &

    GCP エンプラ小売り & AWS 本番環境でコンテナ運 用を経験
  3. • ECSでSpringbootアプリをデプロイ • コンテナ構築ベストプラクティス • コンテナでのCI/CD って? • コンテナでバッチ処理 どうする?

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

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

    more. –Brendan Burns, Partner Architect, at Microsoft and co-founder of Kubernetes 私個人 ほんと〜にそう思う!!
  6. 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.
  7. Docker で nginx 24 # docker run > docker run

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

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

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

    こんなことも できます • cowsay というツールを使って います 27 # docker run > docker run docker/whalesay cowsay Hello.I am Saiba. ___________________ < Hello.I am Saiba. > ------------------- \ \ \ ## . ## ## ## == ## ## ## ## === /""""""""""""""""___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\______/
  11. 【参考】 Docker hub 33 • 様々なソフトウェアが、Docker imageと して公開されている • Docker

    公式のリポジトリ • 個人でimageをアップロードして、公開 することも可能 https://hub.docker.com/
  12. 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 仮想マシン コンテナ
  13. 基本の使い方 39 1. docker pull 2. docker run 3. docker

    ps 4. docker stop 5. docker start 6. docker rm
  14. 1. docker pull 41 • コンテナのイメージをダウンロードします Docker Deamon Containers Images

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

    --name nginx -d -p 8080:80 nginx:latest • イメージからコンテナを作成します Docker Deamon Containers Images Repogitory run
  16. 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
  17. 52

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

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

  20. くらべてみましょう 65 仮想マシン ver EC2 Amazon Linux Tomcat   Application _

    EC2 Amazon Linux Tomcat   Application Docker _ コンテナ ver
  21. 67

  22. 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
  23. 2. docker build 78 • Dockerfile の設定に基づいて、Docker imageを作成(ビルド)する Docker Deamon

    Containers Images Dockerfile # Dockerfile > ls Dockerfile # docker build > docker build ./ -t example:latest build
  24. 84

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

    自動復旧 • スケーリング • etc.. Host Servers 通信 通信 監視 スケーリング オーケストレーション ツール
  26. ECS の簡単な仕組み 92 ECS Cluster EC2 EC2 Service Task Task

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

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

    Pod Pod ・・・ • GCEでクラスタを構成 • Deploymentで コンテナイメージと稼働数 を設定 • Pod (=コンテナ)
  29. 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/
  30. 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
  31. インフラ構成が変わる (ECS ver) 111 RDS ECS tomcat Cluster ECS httpd

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

    Balancing ※ あくまでも参考で、イメージ程度で Service (Kubernetes) Container (Pod)
  33. • ECSでSpringbootアプリをデプロイ • コンテナ構築ベストプラクティス • コンテナでのCI/CD って? • コンテナでバッチ処理 どうする?

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

    APP APP ORCHESTRATION 監視 ログ Log Aggregation ログ転送 Alert Analytics ..
  35. 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 ・・ ・・ ホスト ホスト
  36. 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でリソース制限
  37. コンテナの永続ディスク 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
  38. 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