スポンサーリンク

Docker×docker-composeでDjango×PostgreSQL×Nginx環境を構築する手順

Docker
スポンサーリンク

本記事の対象の方

  • docker-composeでDjango環境を構築をしたい方

以前当ブログでMySQLでDjango環境構築の紹介をしましたが、今回はPostgreSQLを使用します。MySQLでの構築は下記を参照ください。ただ今回の記事より下記の記事は各サービスのバージョンが古かったりするのでお好みで変更いただけますと幸いです。時間ができたら下記記事もアップデートしようと思っています、、、

Dockerとdocker-composeでDjango×MySQL×Nginx環境を構築する方法
Docker初心者でもわかるように解説しています。Django初学者向けの開発環境構築手順を記述しています。Dockerとdocker-composeでPython/Django×Nginx×MySQLの環境が簡単に作成できます。

ローカルの環境

  • Docker 20.10
  • docker-compose 1.27.4
  • git 2.25

Dockerとdocker-composeをインストールされていない方

Macの方

まずは下記公式サイトからDocker Desktopをインストールしてください

ターミナルを起動後、下記コマンドでDockerとdocker-composeのバージョンを確認してみましょう。確認できたらOKです。バージョンは一緒じゃなくても大丈夫です。

$ docker --version
Docker version 20.10.1, build 831ebea
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

※gitについてはMacは最初から入っていると思いますが最新版にしたい場合は各自でお願いいたします。

Windowsの方

MacよりDocker環境の構築がややこしいので記事にまとめております。
下記を御覧ください。

 

docker-composeで構築する環境

  • Django 3.2 (Python 3.9.6)
  • PostgreSQL 13.4
  • Nginx 1.20.1

Dockerfileリポジトリをクローン

Django環境を構築用のDockerfileなどをgithubにあげていますのでそれをまずはCloneします。
下記がgithubのリポジトリです。

GitHub - E-handson/docker-django-postgre
Contribute to E-handson/docker-django-postgre development by creating an account on GitHub.

まずはターミナルを起動してください。
下記コマンドを実行します。

$ git clone https://github.com/E-handson/docker-django-postgre

cloneに成功したら「docker-django-postgre」ディレクトリが作成されます。
作成されたディレクトリに移動しましょう。下記コマンドを実行します。

$ cd docker-django-postgre

docker-django-postgre配下にはdocker-compose.ymlがあると思います。
docker-composeコマンドはdocker-compose.ymlがあるディレクトリ直下で実行できます。

Dockerサービスの立ち上げ

まずはDockerサービスを構築するために下記コマンドを実行します。

$ docker-compose build

次にDockerサービスを起動するために下記コマンドを実行します。

$ docker-compose up

サービスが立ち上がったかを確認するコマンドがありますので実行してみましょう。

$ docker-compose ps
       Name                   Command                         State      Ports
---------------------------------------------------------------------------------------------
docker-django-postgre_app_1  uwsgi --socket :8001 --mod ...    Up         8001/tcp
docker-django-postgre_db_1   docker-entrypoint.sh postgres     Up         0.0.0.0:5433->5432/tcp
docker-django-postgre_web_1  /docker-entrypoint.sh ngin ...    Up         80/tcp, 0.0.0.0:8000->8000/tcp

Nameがコンテナ名になります。
docker-django-postgre_app_1 → Pythonが入っているコンテナ
docker-django-postgre_db_1 → PostgreSQLが入っているコンテナ
docker-django-postgre_web_1 → Nginxが入っているコンテナ
Stateという列がUpになっていたらそのコンテナが起動しているということになります。

これでDockerの立ち上げは完了です。

Djangoのインストール

appコンテナにDjangoアプリを作成

下記コマンドを実行します。

$ docker-compose exec app django-admin.py startproject app .

成功するとsrcディレクトリが作成されています。llコマンドで確認してみましょう。

$ ll
drwxrwxr-x 8 user user 4096 Dec 24 01:43 .git/
-rw-rw-r-- 1 user user 486 Dec 24 01:43 README.md
drwxrwxr-x 5 user user 4096 Dec 24 01:43 docker/
-rw-rw-r-- 1 user user 719 Dec 24 01:43 docker-compose.yml
drwxr-xr-x 3 root root 4096 Dec 24 01:46 src/

一番下のsrc配下にDjangoのソースファイルが作成されています。
では実際にブラウザで確認してみましょう。一度Docker環境をリスタートさせます。

$ docker-compose restart

その後、下記URLにアクセスしてみてください。
Djangoのウェルカムページが表示されれば正常にインストールが完了しています!
http://localhost:8000/

PostgreSQLの設定

src/app/配下にあるsettings.pyを編集していきます。
76行目あたりに下記の編集前の記述があるかと思います。そこを編集後のように修正してください。

ちなみにPostgreSQLをDjangoで使用する場合はpsycopg2-binaryというライブラリをインストールする必要があります。今回はコンテナを起動する際にあらかじめインストールしておいているので特に作業は必要ありませんが覚えておくと良いかもしれません。

編集前

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}




編集後

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'django_local',
        'USER': 'django_user',
        'PASSWORD': 'secret',
        'HOST': 'db',
        'POST': '5432'
    }
}
実際に接続がうまくいっているかはマイグレーション実行で確認できます。
下記コマンドを実行します。
$ docker-compose exec app ./manage.py migrate
Operations to perform:
 Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
 Applying contenttypes.0001_initial... OK
 Applying auth.0001_initial... OK
 Applying admin.0001_initial... OK
     :
     :

接続に成功しているとmigrateが実行されてPostgreSQLに認証系などのテーブルが作成されます。
これで開発環境構築は完了です!

docker-composeの構成についてはMySQL版の記事とほぼ同じです。dbコンテナがMySQLではなくPostgreSQLに代わっただけですね。

静的ファイルの設置

Djangoはデフォルトで http://localhost:8000/admin のURLにアクセスすると管理画面にアクセスできます。その際現状だとCSSが効いていない画面が表示されます。

これはなぜかというとNginxがDjango側が用意しているCSSファイルを参照できていないからです。Djangoのビルドインサーバーをコマンドで実行して開発をする場合は(python manage.py runserver)特に意識しなくてもCSSを参照しにいってくれてたんですが、今回はNginxを使用しているので自分で設定する必要があります。

settings.pyの修正

「import os」を追加して元々記述してあった「BASE_DIR」をコメントアウトして下記のように修正してください。

import os

# Build paths inside the project like this: BASE_DIR / 'subdir'.
# BASE_DIR = Path(__file__).resolve().parent.parent
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

修正し終えたら下記コマンドを実行します。

$ docker-compose exec app ./manage.py collectstatic

./src直下にstaticディレクトリが作成されていると思います。もう一度 http://localhost:8000/admin にアクセスするとCSSが反映されたログイン画面が表示されるようになります。

せっかくなのでログインまでやってみます。下記コマンドでユーザーを作成します。ユーザー名とかパスワードを聞かれるので入力して下さい。

$ docker-compose exec app ./manage.py createsuperuser
Username (leave blank to use 'root'): root
Email address: admin@gmail.com
Password:(任意のパスワード)
Password (again):(任意のパスワード)
Superuser created successfully.

上記で作成したユーザーとパスワードでもう一度 http://localhost:8000/admin にアクセスしてログインしてみましょう。

 

無事管理画面にログインできました!

 

コメント