Dockerの開発環境で構築したアプリケーションをどのようにデプロイするのかについて
色々と調べたことを共有したいと思います。
↓こちらの動画で、コンテナ開発・運用のベストプラクティス(Twelve-Factor App)が紹介されています。
【AWS Black Belt Online Seminar】 CON142 Docker入門
Twelve-Factor App
Twelve-Factor Appとは、Herokuプラットフォーム上で開発・運用・スケールした何百何千ものアプリケーションから得られた知見を
モダンなWebアプリケーションとしてあるべき姿として、12のベストプラクティスにまとめた方法論です。
冒頭の「はじめに」の中で次のような文言が登場します。
- セットアップ自動化のために 宣言的な フォーマットを使い、プロジェクトに新しく加わった開発者が要する時間とコストを最小化する。
- 下層のOSへの 依存関係を明確化 し、実行環境間での 移植性を最大化 する。
- モダンな クラウドプラットフォーム 上への デプロイ に適しており、サーバー管理やシステム管理を不要なものにする。
- 開発環境と本番環境の 差異を最小限 にし、アジリティを最大化する 継続的デプロイ を可能にする。
- ツール、アーキテクチャ、開発プラクティスを大幅に変更することなく スケールアップ できる。
上記の理念について、出来る限りDockerで達成できるように工夫する必要があります。(難易度は高いですが・・・)
その観点でいえば、下記の動画はTwelve-Factorの方法論をロールプレイを通じて、分かりやすく解説しており、とても参考になりました。
そこの Dockerfile 書いてるあなたちょっと待って、そのコンテナって安全ですか?(DEV-01)
これらのプラクティスに準じてデプロイを進める場合は、
EC2でオフィシャルのOSイメージをベースにコンテナを立ち上げる想定になります。
代表的なベースイメージOSとしては下記で紹介されています。
https://youtu.be/5qLUuh9mfC0?si=n5PSjp8IZK0tDaGn&t=1543
私はLaravelで開発したアプリケーションをDockerを使ってAWSにデプロイしたと考えていたのですが、
PHPの場合は、言語ランタイム導入済みのオフィシャルなイメージで良さげなものが見つかりませんでした・・・
なので、Amazon Linux をベースにDockerfileで必要な言語ランタイムを導入するという形になりそうです。
https://aws.amazon.com/jp/linux/amazon-linux-2023/
https://hub.docker.com/_/amazonlinux
https://goat-inc.co.jp/blog/3569/
ただし、EC2にデプロイするというのは、やや上級者向けで難易度が高いので
サーバーレスなコンテナ実行環境であるECS on Fargateを利用するという方法も考えられます。
[AWS Black Belt Online Seminar] CON202 ECS Fargate入門
その他、参考になりそうな文献
▼Overview of best practices for writing Dockerfiles
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
▼アプリケーションコンテナセキュリティガイド
https://www.ipa.go.jp/security/reports/oversea/nist/ug65p90000019cp4-att/000085279.pdf