DjangoとDockerを用いた開発環境の構築とCloud Runへのデプロイ
Djangoを使用した開発を始めるにあたり、Dockerで開発環境と本番環境のセットアップを行いました。
以下のGitHubリポジトリでは、Djangoで作成した簡単なCRUDアプリケーションとそのDocker環境を公開しています。データベースとしてPostgreSQLを使用しています。
前提条件
- Dockerがインストールされていること
- Docker Composeがインストールされていること
クローン
- まず、このリポジトリをクローンします:
git clone git@github.com:pop-web/django-docker-test-env.git
- クローンしたディレクトリに移動します:
cd django-docker-test-env
- ルートディレクトリに
.env
ファイルを作成し、以下の環境変数を設定します(必要に応じて値を変更してください):
DB_NAME=postgres
DB_USER=postgres
DB_PASSWORD=password
ALLOWED_HOSTS=localhost,127.0.0.1
設定ファイルの説明
開発環境と本番環境に対応したDockerfile
とdocker-compose.yml
を用意しています。
開発環境用の設定ファイル
Dockerfile.dev
docker-compose.dev.yml
本番環境用の設定ファイル
Dockerfile.prod
docker-compose.prod.yml
アプリケーションの起動方法
アプリケーションの起動方法を説明します。
ビルド
docker-compose -f docker-compose.dev.yml build
プロジェクトの作成
プロジェクトを作成します。
docker-compose -f docker-compose.dev.yml run --rm web sh -c "django-admin startproject myproject ."
アプリの作成
docker-compose -f docker-compose.dev.yml run --rm web sh -c "python manage.py startapp myapp"
settings.pyの編集
プロジェクトディレクトリ(myproject)のsettings.py
を編集していきます。
import周辺を以下のように変更します。
- 変更前
from pathlib import Path
- 変更後
import os
from pathlib import Path
from decouple import Csv, config
DEBUG = config("DEBUG", default=False, cast=bool)
ALLOWED_HOSTSを以下のように変更します。
ALLOWED_HOSTS = config("ALLOWED_HOSTS", cast=Csv())
INSTALLED_APPSにmyapp
を追加します。
INSTALLED_APPS = [
"myapp",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
]
DATABASES
を以下ように変更します。
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": config("DB_NAME"),
"USER": config("DB_USER"),
"PASSWORD": config("DB_PASSWORD"),
"HOST": "db", # Docker Composeで指定したデータベースのサービス名
"PORT": "5432",
}
}
起動
Docker Composeを使用して開発環境のアプリケーションとデータベースを起動します:
docker-compose -f docker-compose.dev.yml up
コマンドを実行した後、ブラウザでhttp://localhost:8000/
にアクセスすると、Djangoアプリケーションが表示されます。
Hello Worldのページ作成
Hello Worldと表示させるページを新規作成します。
プロジェクトディレクトリ(myproject)のurls.py
を変更します。
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("admin/", admin.site.urls),
path("myapp/", include("myapp.urls")),
]
アプリディレクトリ(myapp)のurls.py
へhello/
のパスを追加します。
from django.urls import path
from . import views
urlpatterns = [
path("hello/", views.hello_world, name="hello_world"),
]
アプリディレクトリ(myapp)のviews.py
を新たに作成します。
from django.shortcuts import render
def hello_world(request):
return render(request, "myapp/hello_world.html", {"message": "Hello, World!"})
最後に、myapp
へ以下のテンプレートを追加します
myapp/templates/myapp/hello_world.html
ファイルの内容は以下
<!DOCTYPE html>
<html>
<head>
<title>Hello, World!</title>
</head>
<body>
<h1>{{ message }}</h1>
</body>
</html>
「control + c」で一度止めて、再スタートさせます。
docker-compose -f docker-compose.dev.yml up
以下のパスをブラウザで確認すると「Hello, World!」と表示されます。
http://localhost:8000/myapp/hello/
Cloud Runへデプロイ
- Google Cloud SDKのインストール
Google Cloud SDKをインストールすることで、コマンドラインからGoogle Cloudプロダクトを管理することが可能になります。インストールの手順は公式ドキュメントを参照してください。
- Google Cloud SDKの初期設定
インストール後、gcloud init コマンドを使ってGoogle Cloud SDKを初期化します。このコマンドを実行すると、ログインを求められます。ログインに成功すると、プロジェクトとデフォルトの設定リージョンを選択するように求められます。
gcloud init
- Dockerイメージのビルド
まず、Dockerfileが存在するディレクトリに移動します。次に、以下のコマンドを使ってDockerイメージをビルドします。ここではアプリケーション名として適切な名前を指定します。
docker build --platform linux/amd64 -f Dockerfile.prod -t asia-northeast1-docker.pkg.dev/my-project-id/my-project/my-image:tag .
- Dockerイメージのプッシュ
Google Cloud SDKに含まれるDocker認証ヘルパーを使って、Google Artifact Registryにイメージをプッシュします。
docker push asia-northeast1-docker.pkg.dev/my-project-id/my-project/my-image:tag
- Cloud Runへのデプロイ
以下のコマンドを使って、Cloud Runにアプリケーションをデプロイします。
gcloud run deploy django-project --image asia-northeast1-docker.pkg.dev/my-project-id/my-project/my-image:tag --platform managed --region asia-northeast1
- Cloud Run環境変数設定
デプロイが終わると、ログにService URL:
でURLが表示されます。ブラウザでアクセスしてみましょう。
ALLOWED_HOSTSのエラーが出ると思います。
Cloud Run環境変数設定で、ALLOWED_HOSTSをキーとして、値にCloud RunのURLを設定します。
- GitHub Actionsでデプロイを自動化
さらに、デプロイの自動化する場合は以下を参照して下さい。
注意事項
本番環境への適用には、セキュリティやパフォーマンスに関する追加の対策や調整が必要となります。具体的には以下のようなことを考慮する必要があります:
- DEBUGモードは無効化する(本番環境ではFalseに設定する)
- SECRET_KEYは安全に管理する
- データベースは本番用のものを設定する
- 適切なロギング設定を行う
- 本番環境に適したWebサーバ(Gunicornなど)を使用する
さらに、Cloud Runへのデプロイを行う際はDockerfile.prodとdocker-compose.prod.ymlを使用してビルドとデプロイを行います。Dockerfile.prodではGunicornを使用してアプリケーションを実行します。
また、Djangoの静的ファイルの扱いには注意が必要です。Djangoはデフォルトでは静的ファイルを提供しないため、本番環境では適切な方法で静的ファイルを扱う必要があります。Djangoのcollectstatic
コマンドを使用するか、Cloud Storageなどを使用する方法があります。
以上がDjangoとDockerを使用した開発環境のセットアップ方法になります。より深く理解するためには、公式ドキュメンテーションを読んだり、具体的な問題に直面したときには適切なリソースを探すことを推奨します。
Discussion