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

改めて整理するWebアプリのビルド・デプロイの基本【コンテナ編】

os1ma
March 23, 2023

 改めて整理するWebアプリのビルド・デプロイの基本【コンテナ編】

●発表の中で紹介しているUdemy講座:https://www.nextskill.co.jp/courses

===

Webアプリケーションのビルド・デプロイについて学んだりすると、「コンテナの場合はどうするの?」といった疑問を持つ方は少なくありません。

近年はアプリケーションの実行環境としてDockerなどのコンテナ技術を使うことが多く、開発環境などでふれたことがある方はとても多いです。

しかし、Dockerなどで開発環境を構築することができても、コンテナで本番などの環境を作るにはどうすればいいのか分からない、ということは少なくありません。

そこでこの勉強会では、Dockerなどのコンテナ技術を使ったビルド・デプロイの基本を改めて整理します。

3/9の勉強会「改めて整理するWebアプリのビルド・デプロイの基本」に引き続き、ビルド・デプロイについての疑問を解消していきます。

イベントページ
https://studyco.connpass.com/event/277659/

os1ma

March 23, 2023
Tweet

More Decks by os1ma

Other Decks in Programming

Transcript

  1. 自己紹介 • 名前:大嶋勇樹(Twitter:@oshima_123) ◦ 最近はよく「しま」と呼ばれています • キャリア ◦ 都内の某 IT

    企業 -> フリーランスエンジニア -> 会社設立 ◦ “ ” 現在は 実務につき始めたエンジニアのスキルアップをサポート ◦ 研修・勉強会の開催・Udemy 講座の作成など • よく関わる技術分野 ◦ クラウド・コンテナ関連 (AWS、GCP、Docker、Kubernetes など) ◦ Web アプリのビルド・デプロイまわりの整備はよく担当
  2. Web アプリケーションの構成の基本 • Web アプリケーションの実装で作成するファイルとしては、主に 「静的コンテンツ」と「サーバサイドのプログラム」の 2 種類があります HTML Web

    サーバ ブラウザ アプリケーション データベース CSS Java・Ruby 等 JS 静的コンテンツ 固定の HTML や CSS、 ブラウザ用の JavaScript など サーバサイドのプログラム HTML や JSON を生成して返す (様々な言語で実装される) Web アプリケーションでは、静的コンテンツを Web サーバで配信・ サーバサイドのプログラムをサーバで実行します
  3. ビルド • プログラムは、実装した形式でそのまま実行するとは限りません • 例えば Java のプログラムを動かす場合、以下のような変換をしたりします main.java main.javac コンパイル

    / トランスパイル 別の言語に変換 hoge.java hoge.javac app.jar パッケージング / バンドル / リンク 1 ファイルにまとめる 成果物(Artifact) java コマンドで 実行する対象 ソースコードをもとに、最終的に本番などのサーバで動かす形式に 変換することを「ビルド」と言います ※ プログラミング言語(実行環境)次第で、ビルドは不要な場合もあります
  4. フロントエンドのビルド • 近年の Web フロントエンド開発では React や Vue.js などを使って、 「.jsx」や「.vue」といったファイルを実装することが多いです

    • これらのファイルは、JavaScript に変換してから Web サーバで配信します ソースコードを JavaScript に変換したり、JavaScript の複数の ファイルを 1 つにまとめたりするのが、フロントエンドのビルドです HTML Web サーバ ブラウザ CSS JS .vue .jsx 変換
  5. Web アプリケーションのビルド・デプロイのまとめ • ここまでの内容を図にすると以下のようになります 本番などの環境 デプロイ ビルド Web サーバ を動かすサーバ

    (コンピュータ) ※ Web サーバとアプリケーションは   同じサーバ(コンピュータ)で動かすこともあります フロントエンドの ソースコード 成果物 ブラウザ データベース デプロイ ビルド アプリケーション を動かすサーバ (コンピュータ) サーバサイドの ソースコード 成果物
  6. コンテナとは • Docker などの「コンテナ」は、仮想化技術の一種です • コンテナにはゲスト OS がないため、VM よりとても軽量です VM

    (仮想マシン) コンテナ アプリケーション ミドルウェア・ ライブラリ ゲスト OS ホスト OS VM 型仮想化用ソフトウェア アプリケーション ミドルウェア・ ライブラリ ゲスト OS アプリケーション ミドルウェア・ ライブラリ ホスト OS コンテナ型仮想化用ソフトウェア アプリケーション ミドルウェア・ ライブラリ
  7. イメージの自作と実行 • 自分たちが開発したアプリケーションをコンテナ化して実行するときは、 以下のような流れになります サーバ コンテナレジストリ コンテナ イメージ myapp:v1 イメージ

    myapp:v1 PC 等 イメージ myapp:v1 src Dockerfile イメージの 作成 (build) イメージのアッ プロード (push) コンテナの 実行 (run) イメージの ダウンロード (pull)
  8. 例)AWS の場合 • AWS には ECR というコンテナレジストリのサービスがあります • 例えば AWS

    の EC2(サーバ)でコンテナを実行するときは、以下のような 流れになります コンテナ イメージ myapp:v1 イメージ myapp:v1 PC 等 イメージ myapp:v1 src Dockerfile EC2 ECR build push pull run
  9. • 複数台のサーバでたくさんのコンテナを使う方針であれば、コンテナの数が 増えても、その分サーバを増やすことで対応可能です • また、サーバ間でコンテナを冗長化させておけば、サーバが 1 台停止しても Web アプリケーションは全体としては停止しません 複数台のサーバでたくさんのコンテナを使う

    コンテナA CPU 0.5 メモリ 1GiB コンテナB CPU 1 メモリ 2GiB コンテナA CPU 0.5 メモリ 1GiB コンテナB CPU 1 メモリ 2GiB コンテナ A コンテナ B コンテナ A コンテナ B サーバ CPU 2 コア メモリ 4 GiB サーバ CPU 2 コア メモリ 4 GiB サーバ CPU 2 コア メモリ 4 GiB
  10. 問題点 • 複数台のサーバでたくさんのコンテナを使うためには、どのサーバにどの コンテナを配置するのが適切か考えるのが大変です • 特にコンテナをオートスケールしたりさせることを考えると、手作業で サーバとコンテナを対応づけるようなことは現実的ではありません コンテナA CPU 0.5

    メモリ 1GiB コンテナB CPU 1 メモリ 2GiB コンテナA CPU 0.5 メモリ 1GiB コンテナB CPU 1 メモリ 2GiB コンテナ A コンテナ B コンテナ A コンテナ B サーバ CPU 2 コア メモリ 4 GiB サーバ CPU 2 コア メモリ 4 GiB サーバ CPU 2 コア メモリ 4 GiB
  11. • 「コンテナオーケストレーション」のツールを使えば、クラスタ(サーバの まとまり)に対して、コンテナを適当に配備(デプロイ)してくれます クラスタ サーバ CPU 2 コア メモリ 4

    GiB サーバ CPU 2 コア メモリ 4 GiB サーバ CPU 2 コア メモリ 4 GiB コンテナオーケストレーション Amazon ECS エンジニア 指示 配備 コンテナA CPU 0.5 メモリ 1GiB コンテナB CPU 1 メモリ 2GiB コンテナA CPU 0.5 メモリ 1GiB コンテナB CPU 1 メモリ 2GiB コンテナ A コンテナ B コンテナ A コンテナ B
  12. Kubernetes と Amazon ECS • コンテナオーケストレーションツールとしては、OSS の Kubernetes と Amazon

    ECS が定番の選択肢です • Kuberentes はエコシステムやカスタマイズ性が強力な一方で、 Amazon ECS のほうがバージョンアップなどの運用コストは低いです
  13. • 複数のサーバでコンテナを動かす場合、コンテナとサーバの両方の考慮が 必要になります クラスタ サーバ サーバ サーバ サーバ管理の手間 Amazon ECS

    配備 CPU などの負荷に応じて コンテナをオートスケール コンテナが増えるのに応じて サーバをオートスケール コンテナ A コンテナ B コンテナ A コンテナ B
  14. サーバレスなコンテナ実行環境 • ECS on Fargate や Google Cloud Run などサーバレスなコンテナ実行環境を

    使うと、サーバ管理なしでコンテナを実行できます クラスタ Amazon ECS on Fargate 配備 サーバを自前で管理するのに比べて制約が増える一方で、 サーバのスケーリングなどを自前で管理する必要がなくなります コンテナ A コンテナ B コンテナ A コンテナ B
  15. コンテナのデプロイの流れ • コンテナのデプロイの流れの基本を再度確認すると、以下のようになります git push trigger build CI 環境 GitHub

    コンテナ レジストリ コンテナを動かす プラットフォーム コンテナ push 実行 ・単なるサーバ ・Amazon ECS ・Kubernetes などなど イメージ イメージ
  16. PaaS • Heroku などの PaaS や AWS App Runner、Google Cloud

    Run のオプション などを使うと、イメージのビルドからデプロイまでを自動化できます 自力で Dockerfile を書く理由が特にない場合は、 このような PaaS などを使う選択肢もあります git push trigger build CI 環境 GitHub コンテナ レジストリ コンテナを動かす プラットフォーム コンテナ push 実行 ・単なるサーバ ・Amazon ECS ・Kubernetes などなど イメージ イメージ 自動で実行
  17. コンテナの実行環境の整理 サーバありの コンテナ環境 アプリケーション フレームワーク ミドルウェア コンテナ サーバ サーバレスな コンテナ環境

    アプリケーション フレームワーク ミドルウェア コンテナ サーバ PaaS など (Dockerfile 不要) アプリケーション フレームワーク ミドルウェア (コンテナ) サーバ ECS on EC2 GKE ECS on Fargate Google Cloud Run App Runner Heroku 例) 制約少ない 構築・運用コスト高 制約多い 構築・運用コスト低
  18. ローカル開発環境でのコンテナの利用について(2/2) • Ruby・PHP などは、OS にパッケージをインストールする必要があることが 多いため、ローカル開発環境がコンテナ化されていると便利です ※ OS のパッケージというのは、例えば apt

    install や brew install などでインストールするものを指します • Java・Go・Node.js などは OS のパッケージのインストールは不要なことが 多く、ローカル開発環境をコンテナ化するメリットがないことも多いです OS のパッケージのインストールが不要な場合は、 言語(ランタイム)のバージョンに注意すれば十分なことも多いです ※ もしコンテナ化する場合でも、OS のパッケージのインストールが不要なら、Dockerfile は不要なことも多いです
  19. 開発環境と本番環境でのコンテナの利用(2/2) • 開発環境と本番環境ではイメージ(Dockerfile)に求められる特性も違います 個人的な意見としては、入門としては、 開発環境と本番環境では Dockerfile は別々に書くのが良いと思います ※ さらに、Heroku などを使う場合、特に理由がなければ

    Dockerfile は開発環境の分だけで良いと思います 開発環境 本番環境 • 開発する時の利便性が重要なので 開発に使うツールなどが入ってい ても良い • 自動テストを実行するときに使う ライブラリもインストールする • デプロイの高速化やセキュリティ の観点から、イメージのサイズを 小さくするのが望ましい • 自動テストに使うライブラリなど はインストールしない
  20. 宣伝 • Udemy で「AWSコンテナサービス入門」という講座を出しています AWSコンテナサービス入門 AWS 自体の基本・コンテナサービスの基礎に始まり、 AWS Copilot CLI

    を使用した実践レベルの環境構築、 注目の新しいコンテナサービス App Runner まで、 手を動かして学ぶ講座です! エラーの解決や疑問点なども、できるだけサポートします クーポン付き URL を共有させていただくので、 ハンズオンもしてみたい方は是非手に取ってみてください