【Docker(Docker-Compose)】Python,Djangoの開発・本番環境構築【Postgres,Gunicorn,Nginx利用】

この記事は、Docker(Docker-Compose)を利用しPython,Django,Postgres,Gunicorn,Nginxの開発・本番環境の構築方法を紹介します。

 

◆動作検証環境

【ローカル環境】
・OS:mac Catalina
・Docker desktop:3.3.3(Engine:20.10.16, Compose:1.29.1)


【リモート環境】
・さくらVPSサーバー:メモリ 512M, ストレージ:SSD 25GB, CPU:1コア
・OS:Ubuntu 20.04
・Docker:20.10.7
・Docker Compose:1.23.2


【共通環境】
・Python:3.8.5
・Django:3.2.4
・Nginx:1.18.0
・Gunicorn:20.1.0
・PostgrSQL:12.4
・psycopg2-binary:2.9.1

 

目次
スポンサードリンク

プロジェクトファイルの設定

 

まずは、ローカル環境でDockerを利用しDjangoを開発する環境を準備します。

Docker-Djangoプロジェクトの作成

プロジェクト全体を管理するディレクトリを作成します。

 

 

作成したDocker-Djangoディレクトリに移動して、Djangoプロジェクト用のディレクトリ、仮想環境とプロジェクトを作成します。

 

仮想環境の作成

virtualenvのインストールに利用するPip3のインストールとアップデートを行います。

 

virtualenvのインストール

 

virtualenvのファイル作成

さきほど作成したprojectディレクトリに移動して、ファイルを作成します。

*今回はファイル名を[ venv ]としています。必要に応じ変更します。

 

仮想環境の有効化

 

仮想環境の有効化されるとユーザー表示の前に(venv) が表示されます。

 

仮想環境を無効化する場合は、下記のコマンドを行います。

 

Djangoプロジェクトの作成

仮想環境を有効化しpipコマンドでDjangoをインストールします

 

Djangoのプロジェクトを作成

. をお忘れなく

 

サーバーを立ち上げ、ロケットの確認を行います。

現在のディレクトリ構造は以下のようになります。

 

 

ブラウザで表示の確認

http://localhost:8000/

スポンサードリンク

ローカル環境DockerとDjangoの設定

 

これまでの作業で、ローカルの環境でDjangoのプロジェクトを内蔵サーバーで立ち上げ、表示の確認を行いました。

この方法は一般的に、ローカル環境で開発を行う方法ですが、これからDockerをローカル環境で利用し開発する設定を行います。

Dockerファイルの作成

ローカル環境へのDockerのインストールがまだの場合は、下記のサイトからインストールします。

Install Docker Desktop on Mac

 

django_projectディレクトリ内に、Dockerファイルを以下のように作成します。

ファイル名はDockerfile とします。

 

requirements.txtファイルの作成

さきほど作成したDockerファイル内でライブラリのインストールで利用するrequirements.txtをdjango_projectディレクトリに作成し、以下のように編集します。

 

ymlファイルの作成

次に、Docker-Djangoディレクトリ内に、ymlファイルを作成します。

ファイル名はdocker-compose.yml  とします。

 

 

環境変数ファイルの作成

ymlファイルで利用する環境変数ファイルをymlファイルと同じディレクトリに作成します。

ファイル名は、.env.devとして以下の内容で編集します。

 

ymlファイルのテスト

ymlファイルを含むディレクトリへ移動し、以下のコマンドを行いymlファイルのテストを行います。

コードの書き方に間違いがある時はエラーを出力し、間違いがない場合は詳細な形でファイル内容が表示されます。

 

settings.pyファイルの作成

作成した環境変数ファイルに対応するように、profect/settings.pyを編集します。

 

ローカル用コンテナのイメージ作成、コンテナ作成、起動

ここまで設定ができたら一度イメージの作成、コンテナの作成、起動を行い、Dockerエンジンを利用した状態でDjangoのウェルカムページの確認を行います。

イメージの作成

ymlファイルを含むディレクトリへ移動し、以下のコマンドを実施します。

サービスを指定してビルドする場合は以下のコマンド(下記の場合はwebを指定)

sudo docker-compose buildは全てのサービスをbuildします

 

作成したイメージの確認

以下のコマンドで作成したイメージを確認する事ができます。

以下のように表示されます。

 

コンテナの作成、起動

この段階でディレクトリ構造は以下のようになります。

 

-dのオプションをつけて、コンテナのの作成後、バックグラウンドで起動

 

作成したコンテナの確認

以下のコマンドで確認する事が可能です。

以下のように表示されます(起動していないときStateの項目はExit)。

 

ブラウザで表示を確認

http://localhost:8000/

 

ロケットが飛んでいればOK

 

以下のコマンドでログを確認します。

 

確認ができたら、コンテナの起動を停止、削除します。

 

コンテナの停止のみ行う場合は以下のコマンドを実行します。

 

Postgresqlの設定

 

Postgresqlの設定を行うために、関係するファイルを編集します。

docker-compose.ymlの編集

docker-compose.yml

 

settings.pyファイルの編集

Postgresqlの利用に合わせ、settings.pyのDATABASEの設定を変更します。

settings.py

 

環境変数ファイルの編集

settings.pyのデータベースの設定を変更し、dbコンテナの変数に対応するために、環境変数のファイルにデータベースの接続に必要な情報を追加します。

※HOSTはdocker-compose.ymlで指定したコンテナ名を設定する。

Dockerfileの編集

psycopg2の使用に合わせ、postgresqlの周辺ライブラリをインストールするよう編集します。

 

requirements.txtファイルの作成

requirements.txtを編集します。
 

Postgresqlの動作確認

関係ファイルの設定が済みましたので、コンテナを起動して動作を確認します。

--build のオプションをつける事で、コンテナ作成前にイメージを再ビルドします。

 

次にデータベースのマイグレーションを行います。

コンテナが起動している状態で以下のコマンドを実行します。

 

または、以下のコマンド行いコンテナ内でLINUX操作する方法も可能です。

上記の方法が利用できない場合は、下記の方法を試します。

参考)データベースのコンテナに入る場合は、webをdbと指定します。

 

dangoのベースディレクトリへ移動して、python manage.py migrate --noinput を実行します。

 

以下のようなエラーが発生した場合、以下のコマンドを実行して、作成済みのコンテナとボリュームを削除しもう一度buildとmigrateを行います。

 

データベースの確認

作成されたデータベースを確認するために、以下のコマンドを実行します。

 

以下のような表示となります。

 

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

指定した名前のデータベースを確認できればOKです

 

コンテナ作成時に作成されたボリュームデータを確認する場合は、以下のコマンドを実行します。

 

以下のように表示されます。

 

シェルファイルの作成

postgresqlの状態が正常である事を確認してから、コンテナを起動するためのコードを記入したシェルファイルを追加し、Dockerfileの内容も編集します。

entrypoint.shをdjango_projectディレクトリへ追加

entrypoint.sh

 

作成後に、entrypoint.shの権限を変更します。

 

次に作成したシェルファイルの実行をDockerfileへ記入します。

 

次にシェルファイルで使用する環境変数を、.env.devに追加します。

 

これ以降はPostgresqlをデータベースとして利用するため、デフォルトで作成されるSQLiteファイルを削除します。

 

postgresqlのコンテナを加えたのでブラウザで表示の確認をします。

この時点でのディレクトリ構造は以下の状態となります。

 

イメージの再ビルド

 

コンテナの作成、起動

 

ブラウザで表示確認

http://localhost:8000/

 

ロケットが飛んでいればOK

 

Gunicornの設定

 

本番環境ではGunicornをアプリケーションサーバーとして利用しますので、そちらの設定を進めます。

requirements.txtの編集

まずは、requirements.txtを編集します。

 

ymlファイルの編集

Djangoのrunserverを使用していた設定からGunicornを利用する設定にするため、ymlファイルを編集します。

 

docker-compose.yml

 

ここまでの設定が完了したら、Gunicornを起動させる設定で動作を確かめます。

 

まずは、現在起動している開発環境用のコンテナを停止、削除します。

-vのオプションをつける事で、作成されているボリュームも削除します。

 

次に、本番環境用のymlファイルを指定してイメージの作成、コンテナの作成、起動を行います。

 

この時点のディレクトリ構造は以下のようになります。

 

 

参考)ymlファイルを指定してイメージの作成、コンテナの作成、起動した際のログを確認する際は、ログ確認コマンド実行時にもymlファイルの指定を行います。

 

ブラウザで表示を確認します。

http://localhost:8000/

 

本番用のymlファイルを利用して起動すると、Djangoのrunserverの機能は使用しないため、Django内のstaticファイルは反映されなくなります。

http://localhost:8000/admin

 

今後の設定で、対応しますのでこのまま以降の設定を進めます。

 

Dockerファイルの編集

Dockerfile

 

本番環境用のymlファイルを利用したイメージ、コンテナの作成、起動

これまでの変更を反映させるために、使用していたコンテナの停止、削除、新コンテナの起動、新たな設定でデータベースのマイグレートを行います。

 

使用していたコンテナの停止、削除

 

新コンテナの起動

 

新たな設定でデータベースのマイグレート

 

ブラウザで表示を確認します。

http://localhost:8000/

 

Nginxの設定

 

次にwebサーバとして利用するNginxの設定を行います。

ymlファイルの編集

Nginx用のコンテナを設定するために、ymlファイルを編集します。

docker-compose.yml

 

Nginx用のフォルダの作成

次にDocker-Djangoディレクトリ内に、Nginx用のフォルダを作成し、その中にNginx用のDockerfile、nginx.confを作成します。

 

Dockerfileの作成

Dockerfile

 

nginx.confの作成

nginx.conf

 

ymlファイルの編集(Nginx仕様)

今後は、Djangoのrunserverコマンドは使用しないので、8000番ポート利用の設定をなくします。

 

表示の確認

この時点のディレクトリ構造は以下のようになっています。

 

使用していたコンテナの停止、削除

 

新コンテナの起動

 

新たな設定でデータベースのマイグレート

 

ブラウザで表示を確認します。

http://localhost:1317/

※ポート番号はdocker-compose.prod.ymlで指定した1317番を利用します。

 

Nginxを利用したStatic,Mediaファイルの表示設定

 

これまでは、Gunicornををwebサーバとして利用していたため、Djangoプロジェクト内のstaticファイルが利用できていませんでした(adminページで表示が崩れる)

Staticファイルの設定

今後はwebサーバにNginxを利用しますので、Staticファイルを扱う設定を加えます。

 

Settings.pyファイルの編集

STATIC_ROOT = os.path.join(BASE_DIR, "static") を追加します。

settings.py

 

ymlファイルの編集

staticファイル用のボリュームを作成し、ディレクトリを指定します。

 

Dockerfileファイルの編集

ymlファイルのボリュームの設定に対応するために、Dockerfile内にディレクトリを作成するコードを追加します。

Dockerfile.prod

 

nginx.confの編集

これまで他のファイルで設定したstaticファイルの表示に対応するために、nginx.confを編集します。

nginx.conf

 

表示の確認

ここまでの設定を確認するために、表示を確認します。

 

使用していたコンテナの停止、削除

 

新コンテナの起動

 

新たな設定でデータベースのマイグレート

 

Djangoプロジェクト内のstatic関係のファイルを、nginxのstaticディレクトリへ移動するために、python manage.py collectstatic を行います。

 

ブラウザで表示を確認します。

http://localhost:1317/

※ポート番号はdocker-compose.prod.ymlで指定した1317番を利用します。

 

アドミンページを表示し、staticファイル(css)が反映されている事を確認します。

http://localhost:1317/admin

 

 

 

確認できたら、以降の作業に備え、作成済みのコンテナの停止削除を行います。

 

Mediaファイルの設定

staticファイルの設定が完了しましたので、次にmediaファイルの表示設定を行います。

 

Djangoでのstaticファイルとmediaファイルの使い分け


・staticファイル:cssファイル、JSファイル、開発者がプロジェクトに追加した画像など

・mediaファイル:webアプリの利用者が、対象のwebアプリ内で画像やファイルをアップロードして、表示する画像など

settings.pyの編集

staticファイル同様にmediaファイル用のurlとrootを指定します。

ymlファイルの編集

docker-compose.yml

 

Dockerファイルの編集

Dockerfile

Nginxのconfigファイルの編集

 

コンテナを起動し表示確認

 

使用していたコンテナの停止、削除

 

新コンテナの起動

 

新たな設定でデータベースのマイグレート

 

Djangoプロジェクト内のstatic関係のファイルを、nginxのstaticディレクトリへ移動。

 

ブラウザで表示を確認します。

http://localhost:1317/

※ポート番号はdocker-compose.prod.ymlで指定した1317番を利用します。

 

本番環境用ファイル設定:独自ドメインの利用とHTTPS化

 

ここまでの作業で、Gunicorn、Nginxを利用してサイトへアクセスする方法の動作の設定ができました。

次に、HTTPS化に対応した独自ドメインでのアクセスに対応させます。

 

今回はLet’s Encryptを利用して対応します。

settings.pyの編集

https化に備えCSRFのセキュリティー強化と、HTTPへリクエストがあった際に、HTTPSへリダイレクトするように以下のコードを追加します。

 

settings.py

 

本番環境用docker-compose.ymlファイルの作成

ローカル環境と本番環境でサイトの表示・動作では、ホストの指定の仕方が大きく変わります。

そのため、本番環境用として新たに必要となるファイルを作成します。

 

 

 

本番環境(リモートサーバー)へのDockerとDockerComposeのインストールと初期設定

 

 

本番環境でのサイト表示、動作確認①

 

 

本番環境でのサイト表示、動作確認②

 

 

開発、本番環境での開発方法

 

 


以上、Docker(Docker-Compose)を利用しPython,Django,Postgres,Gunicorn,Nginxの開発・本番環境の構築方法を紹介しました。