Django アプリを Docker 化する方法: 初心者向けのステップバイステップガイド

Webアプリをさまざまな環境で適切に動作させるための最良の方法の1つは、Webアプリをコンテナ化することです。 コンテイン(Containe)RS より制御された方法で作業できるため、開発とデプロイが容易になります。 このガイドでは、 Django Web アプリを Docker でコンテナ化する方法と、それがなぜ良いアイデアなのかを説明します。

Django アプリケーション用の Docker コンテナを作成する手順を説明します。 Docker は標準化された環境を提供するため、立ち上げと実行が容易になり、生産性が向上します。 このチュートリアルは、Docker を初めて使用する人で、すでに Django の経験がある人を対象としています。 さっそく始めましょう!

2400x1260 docker evergreen ロゴ ブログ

なぜDjangoアプリケーションをコンテナ化するのですか?

Django アプリをコンテナに入れると、生産性と一貫性を高めることができます。 DjangoプロジェクトにDockerを使用すべき主な理由は次のとおりです。

  • 安定した環境を作成します。 コンテナは、すべての依存関係がインストールされた状態で安定した環境を提供するため、「私のマシンで動作する」という問題を心配する必要はありません。 これにより、アプリを再現して、任意のシステムやサーバーで使用できます。 Docker を使用すると、開発、テスト、および運用用のローカル環境を簡単にセットアップできます。
  • 再現性と移植性を確保します。 Docker化されたアプリは、すべての環境変数、依存関係、および構成をバンドルしているため、常に同じように実行されます。 これにより、特に環境間でアプリを移動する場合に、デプロイが容易になります。
  • 開発者間のコラボレーションを促進します。 Docker を使用すると、チームは同じ環境で作業できるため、異なるセットアップによる競合の可能性が低くなります。 共有 Docker イメージを使用すると、チームはセットアップ要件を減らして簡単に開始できます。
  • デプロイプロセスをスピードアップします。 Docker を使用すると、開発者は新しいプロジェクトを簡単に開始できます。 開発環境を設定する手間が省け、全員が同じ場所で作業できるようになったため、異なる開発者からの変更を簡単にマージできます。

Django と Docker を使い始める

Docker での Django アプリの設定は簡単です。 基本的な Django プロジェクトファイルを追加する以上のことを行う必要はありません。

必要なツール

このガイドに従うには、まず次のことを確認してください。

  • Docker DesktopDocker Compose をマシンにインストールします。
  • Docker Hub アカウントを使用して、Docker イメージを保存し、アクセスします。
  • Djangoがシステムにインストールされていることを確認してください。

インストールについてサポートが必要な場合は、Docker と Django の Web サイトで詳細な手順を見つけることができます。

DjangoプロジェクトをDocker化する方法

次の 6 つの手順には、プロセスをガイドするコード スニペットが含まれています。

ステップ 1:Djangoプロジェクトを設定する

1。 Django プロジェクトを初期化します。 

Django プロジェクトがまだ設定されていない場合は、次のコマンドで作成できます。

django-admin startproject my_docker_django_app
cd my_docker_django_app

2。 requirements.txtファイルを作成します。 

プロジェクトで、依存関係を格納する requirements.txt ファイルを作成します。

pip freeze > requirements.txt

3。 主要な環境設定を更新します。

コンテナの起動時に環境変数を使用して設定できるようにするには、 settings.py ファイル内の一部のセクションを変更する必要があります。 これにより、作業している環境に応じてこれらの設定を変更することができます。

  # The secret key
  SECRET_KEY = os.environ.get("SECRET_KEY")

  DEBUG = bool(os.environ.get("DEBUG", default=0))

  ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS","127.0.0.1").split(",")

ステップ 2: Dockerfile を作成する

Dockerfile は、Docker イメージのビルド方法を Docker に指示するスクリプトです。 Django プロジェクトのルートディレクトリに置きます。 Django の基本的な Dockerfile セットアップを次に示します。

# Use the official Python runtime image
FROM python:3.13  

# Create the app directory
RUN mkdir /app

# Set the working directory inside the container
WORKDIR /app

# Set environment variables 
# Prevents Python from writing pyc files to disk
ENV PYTHONDONTWRITEBYTECODE=1
#Prevents Python from buffering stdout and stderr
ENV PYTHONUNBUFFERED=1 

# Upgrade pip
RUN pip install --upgrade pip 

# Copy the Django project  and install dependencies
COPY requirements.txt  /app/

# run this command to install all dependencies 
RUN pip install --no-cache-dir -r requirements.txt

# Copy the Django project to the container
COPY . /app/

# Expose the Django port
EXPOSE 8000

# Run Django’s development server
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Dockerfile の各行は、特定の目的を果たします。

  • FROM: 必要な Python バージョンの画像を選択します。
  • WORKDIR: コンテナ内のアプリケーションの作業ディレクトリを設定します。
  • ENV: アプリケーションのビルドに必要な環境変数を設定します
  • 走る COPYコマンド: 依存関係をインストールし、プロジェクト ファイルをコピーします。
  • EXPOSECMD: Django サーバーポートを公開し、スタートアップコマンドを定義します。

次のコマンドで Django Docker コンテナをビルドできます。

docker build -t django-docker .

イメージを表示するには、次のコマンドを実行します。

docker image list

結果は次のようになります。

REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
django-docker   latest    ace73d650ac6   20 seconds ago   1.55GB

これはアプリケーションのコンテナ化の出発点としては最適ですが、本番環境に準備するには、いくつかの改善を行う必要があります。

  • CMD manage.py は開発目的のみを目的としており、WSGI サーバー用に変更する必要があります。
  • 小さい画像を使用して画像のサイズを縮小します。
  • 多段階のビルド プロセスを使用してイメージを最適化します。

これらの改善を始めましょう。

アップデートrequirements.txt

必ずrequirements.txtgunicornを追加してください。次のようになります。

asgiref==3.8.1
Django==5.1.3
sqlparse==0.5.2
gunicorn==23.0.0
psycopg2-binary==2.9.10

Dockerfile の改善

以下の Dockerfile には、リスト上の 3 つの項目を解決する変更が含まれています。 ファイルに対する変更は次のとおりです。

  • FROM python:3.13を更新しました 画像を FROM python:3.13-slimします。 この変更により、アプリケーションの実行に必要なもののみがイメージに含まれるようになったため、イメージのサイズが大幅に縮小されます。
  • Dockerfile にマルチステージ ビルド プロセスを追加しました。 アプリケーションをビルドすると、通常、ビルド時にのみ必要となり、アプリケーションがビルドされて実行されると不要になるファイルがファイルシステム上に多数残ります。 ビルド ステージを追加すると、1 つのイメージを使用してアプリケーションをビルドし、ビルドされたファイルを 2 番目のイメージに移動し、ビルドされたコードのみが残ります。 マルチステージビルドの詳細については、ドキュメントを参照してください。
  • Gunicorn WSGI サーバーをサーバーに追加して、アプリケーションを本番環境でデプロイできるようにします。
# Stage 1: Base build stage
FROM python:3.13-slim AS builder

# Create the app directory
RUN mkdir /app

# Set the working directory
WORKDIR /app 

# Set environment variables to optimize Python
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1 

# Upgrade pip and install dependencies
RUN pip install --upgrade pip 

# Copy the requirements file first (better caching)
COPY requirements.txt /app/

# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Stage 2: Production stage
FROM python:3.13-slim

RUN useradd -m -r appuser && \
   mkdir /app && \
   chown -R appuser /app

# Copy the Python dependencies from the builder stage
COPY --from=builder /usr/local/lib/python3.13/site-packages/ /usr/local/lib/python3.13/site-packages/
COPY --from=builder /usr/local/bin/ /usr/local/bin/

# Set the working directory
WORKDIR /app

# Copy application code
COPY --chown=appuser:appuser . .

# Set environment variables to optimize Python
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1 

# Switch to non-root user
USER appuser

# Expose the application port
EXPOSE 8000 

# Start the application using Gunicorn
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "3", "my_docker_django_app.wsgi:application"]

Docker コンテナイメージを再度ビルドします。

docker build -t django-docker .

これらの変更を行った後、 docker image list を再度実行できます。

REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
django-docker   latest    3c62f2376c2c   6 seconds ago   299MB

コンテナのサイズが大幅に改善されていることがわかります。

サイズは 1から縮小されました。6 GB から 299MB であるため、イメージのダウンロード時のデプロイ プロセスが高速化され、イメージの保存時のストレージ コストが削減されます。

docker init をコマンドとして使用して、アプリケーションの Dockerfile と compose.yml ファイルを生成し、作業を開始できます。

ステップ 3: Docker Compose ファイルを構成する

compose.ymlファイルを使用すると、マルチコンテナアプリケーションを管理できます。ここでは、Django コンテナと PostgreSQL データベースコンテナの両方を定義します。

作成ファイルは .envと呼ばれる環境ファイルを利用しているため、設定をアプリケーションコードから分離することが容易になります。 ここにリストされている環境変数は、ほとんどのアプリケーションで標準です。

services:
 db:
   image: postgres:17
   environment:
     POSTGRES_DB: ${DATABASE_NAME}
     POSTGRES_USER: ${DATABASE_USERNAME}
     POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
   ports:
     - "5432:5432"
   volumes:
     - postgres_data:/var/lib/postgresql/data
   env_file:
     - .env

 django-web:
   build: .
   container_name: django-docker
   ports:
     - "8000:8000"
   depends_on:
     - db
   environment:
     DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY}
     DEBUG: ${DEBUG}
     DJANGO_LOGLEVEL: ${DJANGO_LOGLEVEL}
     DJANGO_ALLOWED_HOSTS: ${DJANGO_ALLOWED_HOSTS}
     DATABASE_ENGINE: ${DATABASE_ENGINE}
     DATABASE_NAME: ${DATABASE_NAME}
     DATABASE_USERNAME: ${DATABASE_USERNAME}

     DATABASE_PASSWORD: ${DATABASE_PASSWORD}
     DATABASE_HOST: ${DATABASE_HOST}
     DATABASE_PORT: ${DATABASE_PORT}
   env_file:
     - .env
volumes:
   postgres_data:

そして、例は .env ファイル:

DJANGO_SECRET_KEY=your_secret_key
DEBUG=True
DJANGO_LOGLEVEL=info
DJANGO_ALLOWED_HOSTS=localhost
DATABASE_ENGINE=postgresql_psycopg2
DATABASE_NAME=dockerdjango
DATABASE_USERNAME=dbuser
DATABASE_PASSWORD=dbpassword
DATABASE_HOST=db
DATABASE_PORT=5432

ステップ 4:Djangoの設定と構成ファイルを更新する

1。 データベース設定を構成します。 

PostgreSQL を使用するように settings.py を更新します。

  DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.{}'.format(
               os.getenv('DATABASE_ENGINE', 'sqlite3')
           ),
           'NAME': os.getenv('DATABASE_NAME', 'polls'),
           'USER': os.getenv('DATABASE_USERNAME', 'myprojectuser'),
           'PASSWORD': os.getenv('DATABASE_PASSWORD', 'password'),
           'HOST': os.getenv('DATABASE_HOST', '127.0.0.1'),
           'PORT': os.getenv('DATABASE_PORT', 5432),
       }
   }

2。 環境ファイルから読み取るように ALLOWED_HOSTS を設定します。 

settings.py年には、ALLOWED_HOSTSを次のように設定します。

   # 'DJANGO_ALLOWED_HOSTS' should be a single string of hosts with a , between each.
   # For example: 'DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1,[::1]'
   ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS","127.0.0.1").split(",")

3。 環境ファイルから読み取るように SECRET_KEY を設定します。

settings.py年には、SECRET_KEYを次のように設定します。

   # SECURITY WARNING: keep the secret key used in production secret!
   SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY")

4。 環境ファイルから読み取るように DEBUG を設定します。

settings.py年には、DEBUGを次のように設定します。

 # SECURITY WARNING: don't run with debug turned on in production!
 DEBUG = bool(os.environ.get("DEBUG", default=0))

ステップ 5: 新しい Django プロジェクトをビルドして実行する

コンテナをビルドして開始するには、次のコマンドを実行します。

docker compose up --build

このコマンドは、必要な Docker イメージをダウンロードし、プロジェクトをビルドし、コンテナを起動します。 完了すると、Django アプリケーションは http://localhost:8000 からアクセスできるようになります。

ステップ 6: アプリケーションのテストとアクセス

アプリが実行されたら、 http://localhost:8000に移動してテストできます。 Django のウェルカム ページが表示され、アプリが稼働していることを示します。 データベース接続を確認するには、移行を実行してみてください。

docker compose run django-web python manage.py migrate

Docker と Django の一般的な問題のトラブルシューティング

ここでは、発生する可能性のある一般的な問題とその解決方法をご紹介します。

  • データベース接続エラー: Django が PostgreSQL に接続できない場合は、データベース サービス名が compose.ymlsettings.py で一致していることを確認します。
  • ファイル同期の問題: compose.ymlvolumes ディレクティブを使用して、ローカル ファイルの変更をコンテナに同期します。
  • コンテナの再起動ループまたはクラッシュ:docker compose logsを使用してコンテナエラーを検査し、クラッシュの原因を特定します。

Django Web アプリケーションの最適化

Django Docker のセットアップを改善するには、次の最適化のヒントを考慮してください。

  • ビルドの自動化と保護: Docker のマルチステージ ビルドを使用して、よりスリムなイメージを作成し、不要なファイルやパッケージを削除して、より安全で効率的なビルドを実現します。
  • データベースアクセスの最適化: データベースのプーリングとキャッシングを構成して、接続時間を短縮し、パフォーマンスを向上させます。
  • 効率的な依存関係管理:requirements.txtに記載されている依存関係を定期的に更新および監査して、効率性とセキュリティを確保します。

Docker と Django で次のステップを踏み出しましょう

Dockerを使用してDjangoアプリケーションをコンテナ化することは、開発を簡素化し、環境間での一貫性を確保し、デプロイを合理化する効果的な方法です。 このガイドで説明する手順に従うことで、Dockerized Django アプリを設定する方法、本番環境用に Dockerfile を最適化する方法、マルチコンテナ設定用に Docker Compose を設定する方法を学習しました。

Dockerは、「自分のマシンで動作する」問題を減らすだけでなく、環境を標準化することで開発チーム内のより良いコラボレーションを促進します。 小規模なプロジェクトをデプロイする場合でも、エンタープライズ用にスケールアップする場合でも、Docker は信頼性の高いビルド、テスト、デプロイのためのツールを提供します。

次のステップに進む準備はできましたか? Docker Hub や Docker Scout などの Docker の強力なツールを探索し て、スケーラブルなストレージ、ガバナンス、継続的なセキュリティ分析情報でコンテナ化されたアプリケーションを強化します。

さらに詳しく