はじめに
まず、大前提として、ここから先は現在キャッチアップしているコンテナ関連の学習のために、ECR や ECS を活用しながら、さまざまなコードを書いていきます。
※補足事項
そのため、内容は完全に自分向けとなっています。
また、このブログ投稿サイトは、自分自身の備忘録としても活用する予定です。記録を積み重ねながら、メモを残していきます。
それぞれのソースコードはこちら
ローカル開発用リポジトリ
ローカル開発の備忘録記事
本番 ECS 用リポジトリ
本番 ECS 用の備忘録記事
現在、それぞれのリポジトリには README などの説明は記載していませんが、今後追加していく予定です。
こんなシナリオのアプリ開発を想定
- AWS ECS Fargate を利用し、サーバーレスで Django アプリを運用
- Nginx をリバースプロキシ として使用し、外部からのリクエストを適切に振り分け
- アプリのログを AWS CloudWatch Logs に集約 して監視
こんな感じ👇
どのように動作するか?
この ECS タスクは Django + Nginx のコンテナを Fargate で動作させる構成になっています。
リクエストの流れ
クライアント → Nginx → Django → Nginx → クライアント
↘ CloudWatch Logs
ポイント
-
Nginx(
nginx
コンテナ) がポート80
でリクエストを受ける。 - Nginx がリクエストを Django(
django
コンテナ) に転送。 - Django がリクエストを処理し、レスポンスを Nginx に返す。
- Nginx が最終レスポンスをクライアントに送る。
こんな感じ👇
ログ管理
-
Django と Nginx のログは共に CloudWatch Logs に送信。
- ロググループ:
/aws/ecs/reverse-proxy-cluster
- ロググループ:
この Dockerfile でできること
- Python 3.10 の環境を準備
- Django アプリの依存パッケージをインストール
- データベースのマイグレーションを適用
- 静的ファイルを収集して適切な場所に配置
- Gunicorn を使って Django アプリを 8000 番ポートで起動
この Dockerfile
を使えば、Django アプリを Docker コンテナ内で簡単にデプロイ できる構成になっています!
実際に使った Dockerfile(Django本番用)
この Dockerfile は、Django アプリケーションを Docker コンテナ内で動作させるためのものです。
FROM python:3.10
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --upgrade pip && pip install -r requirements.txt
COPY . /app/
CMD ["sh", "-c", "python manage.py migrate && python manage.py collectstatic --noinput && gunicorn --bind 0.0.0.0:8000 mysite.wsgi:application"]
各ステップの処理を説明します。
1. Python の公式イメージを使用
FROM python:3.10
- Python 3.10 の公式 Docker イメージ を基にコンテナを構築
- 必要な Python 環境 を整備し、アプリケーションの動作をサポート
- 依存関係の管理 も含め、環境を安定させる
公式 Docker イメージ
2. 作業ディレクトリの設定
WORKDIR /app
- コンテナ内の作業ディレクトリを
/app
に設定 - 以降の
COPY
やRUN
コマンド は/app
ディレクトリ内で実行
3. requirements.txt
をコンテナにコピー
COPY requirements.txt /app/
- ホスト側(ローカル)の
requirements.txt
をコンテナの/app/
にコピー -
requirements.txt
は Python パッケージの依存関係 を記述したファイル - これにより、コンテナ内で必要なパッケージを適切にインストールできる
4. 必要な Python パッケージをインストール
RUN pip install --upgrade pip && pip install -r requirements.txt
-
pip
を 最新バージョン にアップグレード -
requirements.txt
に記載されたパッケージをpip install
でインストール
5. アプリケーションのコードをコンテナにコピー
COPY . /app/
- ホスト側(ローカル)の アプリケーションコード をコンテナの
/app/
にコピー -
Django プロジェクトのすべてのファイル が
/app/
内に配置される
6. コンテナ起動時に実行するコマンド
CMD ["sh", "-c", "python manage.py migrate && python manage.py collectstatic --noinput && gunicorn --bind 0.0.0.0:8000 mysite.wsgi:application"]
-
コンテナが起動したときに実行する処理 を
CMD
で定義 -
"sh", "-c", "..."
を使うことで 複数のコマンドを順番に実行 可能
実行されるコマンド
データベースのマイグレーションを適用
python manage.py migrate
- データベースのスキーマを最新の状態 に更新
-
manage.py migrate
を実行し、適用されていないマイグレーションを適用
静的ファイルの収集(STATIC_ROOT
)
python manage.py collectstatic --noinput
- Django の静的ファイルを
STATIC_ROOT
に収集 -
collectstatic
コマンドを実行し、アプリの静的ファイルを指定ディレクトリに集約 -
--noinput
オプションを指定することで、確認プロンプトをスキップし、自動で処理を進める
Gunicorn で Django アプリを起動
gunicorn --bind 0.0.0.0:8000 mysite.wsgi:application
- Gunicorn(WSGI サーバー)を起動し、Django アプリを提供
-
--bind 0.0.0.0:8000
を指定し、コンテナの 8000 番ポートで待機
まとめ
基礎的な部分ではありますが、Dockerfile 内でどのような処理が行われているのか を詳しく振り返ることができました。
もしこの記事の内容が少しでも参考になれば嬉しく思います。
今後も同様の内容を継続して投稿していきますので、温かく見守っていただけると嬉しいです!