Python
Django
nginx
docker

Djangoの環境をDocker化する(Docker + Django + Gunicorn + nginx)その3

前回は、docker-compose.ymlを中心に記載しました。今回は、Djangoアプリケーションの設定を記載します。

下記で公開中です。記事と合わせて参考にして下さい。
Dockerize Django Environment


Djangoプロジェクトの初期化

1.Djangoプロジェクトの作成

  • docker-compose.ymlがあるディレクトリ下で以下のコマンドを実行します。
docker-compose run web django-admin.py startproject 任意のプロジェクト名 .
  • 実行後にホスト側のwebディレクトリ(Django用ディレクトリ)内が以下のようになります。
┣web
┃  ┗任意のプロジェクト名ディレクトリ
┃  ┗Dockerfile
┃  ┗requirements.txt
┃  ┗manage.py

2.PostgreSQLへ接続

  • 接続情報を手順1で作成したプロジェクトディレクトリ下にあるsettings.pyファイルに定義します。
任意のプロジェクト名ディレクトリ/settings.py
# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases

DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.postgresql',
         'NAME': 'postgres',
         'USER': 'postgres',
         'HOST': 'postgres',
         'PORT': 5432,
     }
 }

3.WSGIサーバ(アプリケーションサーバ)の設定

  • 今回、WSGIサーバはGnicornを使用します。
    • WSGIとは、Web Server Gateway Interfaceの略です。名前の通り、webサーバとwebアプリケーションの間の汎用的なインターフェースです。
任意のプロジェクト名/settings.py
WSGI_APPLICATION = '任意のプロジェクト名.wsgi.application'

4.コンテナを立ち上げる

ここまで、設定が出来たらコンテナを立ち上げます。

docker-compose up


アプリケーションを作成する

  1. いよいよアプリケーション開発に着手します。下記のコマンドを実行してアプリケーションを作成します。
docker-compose run web python manage.py startapp 任意のアプリケーション名
  • 実行後にホスト側のwebディレクトリ(Django用ディレクトリ)内が以下のようになります。
┣web
┃  ┗任意のプロジェクト名ディレクトリ/
┃  ┗Dockerfile
┃  ┗requirements.txt
┃  ┗manage.py
┃  ┗任意のアプリケーション名ディレクトリ/
┃  ┃  ┗__init__.py
┃  ┃  ┗admin.py
┃  ┃  ┗apps.py
┃  ┃  ┗migrations/
┃  ┃  ┃  ┗__init__.py
┃  ┃  ┗models.py
┃  ┃  ┗tests.py
┃  ┃  ┗views.py

2.admin(管理画面の有効化)と静的ファイルの読み込み

  • settings.pyINSTALLED_APPSが下記のようになっているか確認します。
任意の任意のプロジェクト名ディレクトリ/settings.py
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
  • データベースにテーブルを作成します。
docker-compose exec web python manage.py migrate
  • 静的ファイルディレクトリを定義します。
任意の任意のプロジェクト名ディレクトリ/settings.py
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  • 静的ファイルを配信するディレクトリに集めます。下記のコマンドを実行します。
docker-compose run web python manage.py collectstatic --noinput
  • 管理者ユーザーを作成します。下記のコマンドを実行し、任意のuser名とパスワードを入力します。
docker-compose exec -it web python manage.py createsuperuser
  • ブラウザを開いて、INDEX管理画面にアクセスして表示されれば成功です。

展望

  • Django REST Frameworkと併用して画面とAPIを分割してマイクロサービスを構築する。

まとめ

dockerで環境構築するのは、各フレームワーク、ミドルウェアの仕様を押さえてない嵌ることを思い知りました。今回で、Docker + Djangoの組合せで環境構築出来るようになったので個人プロジェクトの開発をどんどん進められそうです。展望にも書きましたが、マイクロサービス構成を容易に出来るのもDockerのメリットなので挑戦したいと思います。公開している情報で誤りなどがありましたらご指摘頂ければ調査して修正していきたいと考えていますので、よろしくお願いします。