2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Django開発備忘録:AWS 環境の ECS で実際に使用した本番用 Dockerfile を体系的にまとめてみた

Last updated at Posted at 2025-01-31

はじめに

まず、大前提として、ここから先は現在キャッチアップしているコンテナ関連の学習のために、ECR や ECS を活用しながら、さまざまなコードを書いていきます。

※補足事項
そのため、内容は完全に自分向けとなっています。

また、このブログ投稿サイトは、自分自身の備忘録としても活用する予定です。記録を積み重ねながら、メモを残していきます。

それぞれのソースコードはこちら

ローカル開発用リポジトリ

ローカル開発の備忘録記事

本番 ECS 用リポジトリ

本番 ECS 用の備忘録記事

現在、それぞれのリポジトリには README などの説明は記載していませんが、今後追加していく予定です。

こんなシナリオのアプリ開発を想定

  • AWS ECS Fargate を利用し、サーバーレスで Django アプリを運用
  • Nginx をリバースプロキシ として使用し、外部からのリクエストを適切に振り分け
  • アプリのログを AWS CloudWatch Logs に集約 して監視

こんな感じ👇

Screenshot 2025-02-01 at 5.05.29.png

どのように動作するか?

この ECS タスクは Django + Nginx のコンテナを Fargate で動作させる構成になっています。

リクエストの流れ

クライアント  Nginx  Django  Nginx  クライアント
       ↘ CloudWatch Logs

ポイント

  1. Nginx(nginx コンテナ) がポート 80 でリクエストを受ける。
  2. Nginx がリクエストを Django(django コンテナ) に転送。
  3. Django がリクエストを処理し、レスポンスを Nginx に返す。
  4. Nginx が最終レスポンスをクライアントに送る。

こんな感じ👇

Screenshot 2025-02-01 at 5.06.24.png

ログ管理

  • DjangoNginx のログは共に 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 に設定
  • 以降の COPYRUN コマンド/app ディレクトリ内で実行

3. requirements.txt をコンテナにコピー

COPY requirements.txt /app/
  • ホスト側(ローカル)の requirements.txt をコンテナの /app/ にコピー
  • requirements.txtPython パッケージの依存関係 を記述したファイル
  • これにより、コンテナ内で必要なパッケージを適切にインストールできる

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 内でどのような処理が行われているのか を詳しく振り返ることができました。

もしこの記事の内容が少しでも参考になれば嬉しく思います。

今後も同様の内容を継続して投稿していきますので、温かく見守っていただけると嬉しいです!

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?