見出し画像

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

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

以下のような開発フローに対応する方法となります。

①:ローカル環境のDocker内で開発

②:プロジェクトを本番環境へデプロイ

③:本番環境のDockerでシステム運用

④:①に戻り機能追加などの開発

本番環境リリース時の独自ドメインのHTTPS化は、無料で利用できるLet's Encryptを利用して対応します。

最終的には、ローカル環境での開発用の設定ファイル(ymlファイル)と、本番環境でのリリース用の2つの設定ファイルを作成し、各環境で使い分ける方法となります。

おおまかな開発環境構築のながれは以下のとおりです。

1:プロジェクトファイルの設定
2:ローカル環境DockerとDjangoの設定
3:Postgresqlの設定
4:Gunicornの設定
5:Nginxの設定
6:Nginxを利用したStatic,Mediaファイルの表示設定
7:本番環境用ファイル設定:独自ドメインの利用とHTTPS化
8:本番環境(リモートサーバー)へのDockerとDockerComposeのインス9:トールと初期設定
10:本番環境でのサイト表示、動作確認①
11:本番環境でのサイト表示、動作確認②
12:開発、本番環境での開発方法(ymlファイルの使い分け方法)


◆動作検証環境

【ローカル環境】
・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
・Django:3.2
・Nginx:1.18.0
・Gunicorn:20.1.0
・PostgrSQL:12.0
・psycopg2-binary:2.9.1

画像1

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

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

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

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

$ cd path/to/directry_for_your_project
$ mkdir Docker-Django


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

$ mkdir django_project
$ cd django_project


■ 仮想環境の作成

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

$ sudo -H pip3 install --upgrade pip

virtualenvのインストール

$ sudo -H pip3 install virtualenv


virtualenvのファイル作成

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

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

$ virtualenv venv


仮想環境の有効化

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


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

(venv)$ deactivate


Djangoプロジェクトの作成

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

(venv)$ pip3 install django==3.2


Djangoのプロジェクトを作成
※. をお忘れなく

(venv)$ django-admin startproject project .


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


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

Docker-Django
└── django_project
   ├── manage.py
   ├── project
   │   ├── __init__.py
   │   ├── asgi.py
   │   ├── settings.py
   │   ├── urls.py
   │   └── wsgi.py
   └── venv


(venv)$ python manage.py runserver


ブラウザで表示の確認

http://localhost:8000/

画像3


画像2

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


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

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


Dockerファイルの作成


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

Install Docker Desktop on Mac


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

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

FROM python:3.8.3-alpine
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt
COPY . .


requirements.txtファイルの作成


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

Django==3.2

*Djangoのバージョンは3.2を利用します。


ymlファイルの作成


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

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

version: '3.7'

services:
 web:
   build: ./django_project
   command: python manage.py runserver 0.0.0.0:8000
   volumes:
     - ./django_project/:/usr/src/app/
   ports:
     - 8000:8000
   env_file:
     - ./.env.dev


環境変数ファイルの作成


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

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

*SECRET_KEYはsettings.py内に記述されているものを使用します。

DEBUG=True
SECRET_KEY=◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯
ALLOWED_HOSTS=localhost 127.0.0.1 [::1]


ymlファイルのテスト


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

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

docker-compose config


settings.pyファイルの作成


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

import os

...
SECRET_KEY = os.environ.get("SECRET_KEY")
DEBUG = os.environ.get("DEBUG")
ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS").split(" ")


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


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


イメージの作成


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

$ docker-compose build


---------- メモ ----------

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

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

---------- メモ終わり----------


作成したイメージの確認


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

$ docker-compose images


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

    Container           Repository        Tag       Image Id       Size  
--------------------------------------------------------------------------
docker-django_web_1   docker-django_web   latest   946faa23f6f0   161.3 MB


コンテナの作成、起動


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

Docker-Djnago
├── .env.dev
├── django_project
│   ├── Dockerfile
│   ├── db.sqlite3
│   ├── manage.py
│   ├── project
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   ├── asgi.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── requirements.txt
│   └── venv
└── docker-compose.yml


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

$ docker-compose up -d


作成したコンテナの確認
以下のコマンドで確認する事が可能です。

$ docker-compose ps


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

      Name                   Command            State            Ports         
--------------------------------------------------------------------------------
docker-django_web_1   python manage.py           Up      0.0.0.0:8000->8000/tcp,
                     runserver ...                      :::8000->8000/tcp


ブラウザで表示を確認

http://localhost:8000/

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

画像4


---------- うまく表示されない場合 ----------

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

$ docker-compose logs -f

---------- うまく表示されない場合終わり ----------


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

$ docker-compose down


---------- メモ ----------

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

$ docker-compose stop

---------- メモ終わり ----------


画像5

Postgresqlの設定


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


■ docker-compose.ymlの編集


docker-compose.yml

version: "3.7"

services:
 web:
   build: ./django_project
   command: python manage.py runserver 0.0.0.0:8000
   volumes:
     - ./django_project/:/usr/src/app/
   ports:
     - 8000:8000
   env_file:
     - ./.env.dev
   depends_on:
     - db

 db:
   image: postgres:12.0-alpine
   volumes:
     - postgres_data:/var/lib/postgresql/data/
   env_file:
     - ./.env.dev

volumes:
 postgres_data:


■ settings.pyファイルの編集


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

settings.py

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': os.environ.get("SQL_DATABASE"),
       'USER': os.environ.get("SQL_USER"),
       'PASSWORD': os.environ.get("SQL_PASSWORD"),
       'HOST': os.environ.get("SQL_HOST"),
       'PORT': os.environ.get("SQL_PORT"),
   }
}


■ 環境変数ファイルの編集


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

DEBUG=True
SECRET_KEY=◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯
ALLOWED_HOSTS=localhost 127.0.0.1 [::1]

SQL_DATABASE=db_name
SQL_USER=user_name
SQL_PASSWORD=password
SQL_HOST=db
SQL_PORT=5432

POSTGRES_USER=user_name
POSTGRES_PASSWORD=password
POSTGRES_DB=db_name

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


■ Dockerfileの編集


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

FROM python:3.8.3-alpine

WORKDIR /usr/src/app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# install psycopg2 dependencies
RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev
   
RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY . .


■ requirements.txtファイルの作成

`requirements.txt`を編集します。

Django==3
psycopg2-binary==2.9.1


■ Postgresqlの動作確認


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

docker-compose up -d --build

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

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

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

$ docker-compose exec web python manage.py migrate --noinput


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

$ docker-compose exec web bash

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

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


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


---------- エラーが発生した場合 ----------

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

django.db.utils.OperationalError: FATAL: database "db_name" does not exist
docker-compose down -v

---------- エラーが発生した場合 終わり----------


データベースの確認


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

$ docker-compose exec db psql --username=user_name --dbname=db_name


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

psql (12.0)
Type "help" for help.

db_name=#


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

# \l


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

                                 List of databases
  Name    |   Owner   | Encoding |  Collate   |   Ctype    |    Access privileges    
-----------+-----------+----------+------------+------------+-------------------------
db_name   | user_name | UTF8     | en_US.utf8 | en_US.utf8 | 
postgres  | user_name | UTF8     | en_US.utf8 | en_US.utf8 | 
template0 | user_name | UTF8     | en_US.utf8 | en_US.utf8 | =c/user_name           +
          |           |          |            |            | user_name=CTc/user_name
template1 | user_name | UTF8     | en_US.utf8 | en_US.utf8 | =c/user_name           +
          |           |          |            |            | user_name=CTc/user_name
(4 rows)


以下のコマンドでDBを抜けます

# \q


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

$ docker volume inspect docker-django_postgres_data


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

[
   {
       "CreatedAt": "2021-06-14T09:52:34Z",
       "Driver": "local",
       "Labels": {
           "com.docker.compose.project": "docker-django",
           "com.docker.compose.version": "1.29.1",
           "com.docker.compose.volume": "postgres_data"
       },
       "Mountpoint": "/var/lib/docker/volumes/docker-django_postgres_data/_data",
       "Name": "docker-django_postgres_data",
       "Options": null,
       "Scope": "local"
   }
]


■ シェルファイルの作成


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

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

entrypoint.sh

#!/bin/sh
if [ "$DATABASE" = "postgres" ]
then
   echo "Waiting for postgres..."
   while ! nc -z $SQL_HOST $SQL_PORT; do
     sleep 0.1
   done
   echo "PostgreSQL started"
fi
exec "$@"


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

$ chmod +x django_project/entrypoint.sh


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

FROM python:3.8.3-alpine

WORKDIR /usr/src/app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev
RUN pip install --upgrade pip

COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY ./entrypoint.sh .

COPY . .

ENTRYPOINT ["/usr/src/app/entrypoint.sh"]


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

DEBUG=True
SECRET_KEY=◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯
ALLOWED_HOSTS=localhost 127.0.0.1 [::1]

SQL_DATABASE=db_name
SQL_USER=user_name
SQL_PASSWORD=password
SQL_HOST=db
SQL_PORT=5432

POSTGRES_USER=user_name
POSTGRES_PASSWORD=password
POSTGRES_DB=db_name

DATABASE=postgres


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

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

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

Docker-Django
├── .env.dev
├── django_project
│   ├── Dockerfile
│   ├── entrypoint.sh
│   ├── manage.py
│   ├── project
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   ├── asgi.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── requirements.txt
│   └── venv
└── docker-compose.yml


イメージの再ビルド

$ docker-compose build


コンテナの作成、起動

$ docker-compose up -d


ブラウザで表示確認

http://localhost:8000/

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

画像6


画像7

Gunicornの設定


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

■ requirements.txtの編集


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

Django==3.2
psycopg2-binary==2.9.1
gunicorn==20.1.0


■ ymlファイルの編集


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


docker-compose.yml

version: "3.7"

services:
 web:
   build: ./django_project
   command: gunicorn project.wsgi:application --bind 0.0.0.0:8000
   ports:
     - 8000:8000
   env_file:
     - ./.env.dev
   depends_on:
     - db
 db:
   image: postgres:12.0-alpine
   volumes:
     - postgres_data:/var/lib/postgresql/data/
   env_file:
     - ./.env.dev

volumes:
 postgres_data:

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

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

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


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


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

Docker-Django
├── .env.dev
├── django_project
│   ├── Dockerfile
│   ├── entrypoint.sh
│   ├── manage.py
│   ├── project
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   ├── asgi.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── requirements.txt
│   └── venv
└── docker-compose.yml


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


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

http://localhost:8000/

画像8


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

http://localhost:8000/admin

画像9


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


■ Dockerファイルの編集
Dockerfile

# BUILDER #

FROM python:3.8.3-alpine as builder

WORKDIR /usr/src/app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev
RUN pip install --upgrade pip
RUN pip install flake8
COPY . .

COPY ./requirements.txt .
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt

# FINAL #

FROM python:3.8.3-alpine

RUN mkdir -p /home/app

RUN addgroup -S app && adduser -S app -G app

ENV HOME=/home/app
ENV APP_HOME=/home/app/web
RUN mkdir $APP_HOME
WORKDIR $APP_HOME

RUN apk update && apk add libpq
COPY --from=builder /usr/src/app/wheels /wheels
COPY --from=builder /usr/src/app/requirements.txt .
RUN pip install --no-cache /wheels/*

COPY ./entrypoint.sh $APP_HOME

COPY . $APP_HOME

RUN chown -R app:app $APP_HOME

USER app

ENTRYPOINT ["/home/app/web/entrypoint.sh"]


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


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


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

$ docker-compose down -v


新コンテナの起動

$ docker-compose up -d --build


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

$ docker-compose exec web python manage.py migrate --noinpu


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

http://localhost:8000/

画像10


画像11

Nginxの設定


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


■ ymlファイルの編集

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

docker-compose.yml

version: "3.7"

services:
 web:
   build: ./django_project
   command: gunicorn project.wsgi:application --bind 0.0.0.0:8000
   ports:
     - 8000:8000
   env_file:
     - ./.env.dev
   depends_on:
     - db
 db:
   image: postgres:12.0-alpine
   volumes:
     - postgres_data:/var/lib/postgresql/data/
   env_file:
     - ./.env.dev

 nginx:
   build: ./nginx
   ports:
       - 1317:80
   depends_on:
       - web    

volumes:
 postgres_data:


■ Nginx用のフォルダの作成


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

$ mkdir nginx


Dockerfileの作成
Dockerfile

FROM nginx:1.18.0-alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d


nginx.confの作成
nginx.conf

upstream project {
   server web:8000;
}

server {

   listen 80;
   
   location / {
       proxy_pass http://project;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $host;
       proxy_redirect off;
   }
}


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


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

web:
 build:
   context: ./django_project
   dockerfile: Dockerfile.prod
 command: gunicorn project.wsgi:application --bind 0.0.0.0:8000
 expose:
   - 8000
 env_file:
   - ./.env.dev
 depends_on:
   - db


 ■ 表示の確認


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

.Docker-Django
├── .env.dev
├── django_project
│   ├── Dockerfile
│   ├── entrypoint.sh
│   ├── manage.py
│   ├── project
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   ├── asgi.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── requirements.txt
│   └── venv
├── docker-compose.yml
└── nginx
   ├── Dockerfile
   └── nginx.conf


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

$ docker-compose down -v


新コンテナの起動

$ docker-compose up -d --build


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

$ docker-compose exec web python manage.py migrate --noinpu


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

http://localhost:1317/

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

画像12


画像13

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


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

■ Staticファイルの設定

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

■ settings.pyファイルの編集

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


settings.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")


■ ymlファイルの編集

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

version: "3.7"

services:
 web:
   build: ./django_project
   command: gunicorn project.wsgi:application --bind 0.0.0.0:8000
   volumes:
       - static_volume:/home/app/web/static
   expose:
     - 8000
   env_file:
     - ./.env.dev
   depends_on:
     - db

 db:
   image: postgres:12.0-alpine
   volumes:
     - postgres_data:/var/lib/postgresql/data/
   env_file:
     - ./.env.dev

 nginx:
   build: ./nginx
   volumes:
     - static_volume:/home/app/web/static
   ports:
     - 1317:80
   depends_on:
     - web

volumes:
 postgres_data:
 static_volume:


■ Dockerfileファイルの編集


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

Dockerfile

ENV HOME=/home/app
ENV APP_HOME=/home/app/web
RUN mkdir $APP_HOME
RUN mkdir $APP_HOME/static #追加
WORKDIR $APP_HOME


■ nginx.confの編集

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

nginx.conf

upstream project {
   server web:8000;
}

server {

   listen 80;
   
   location / {
       proxy_pass http://project;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $host;
       proxy_redirect off;
   }
   
   location /static/ {
       alias /home/app/web/static/;
   }
   
}


■ 表示の確認

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

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

$ docker-compose down -v


新コンテナの起動

$ docker-compose up -d --build


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

$ docker-compose exec web python manage.py migrate --noinpu


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

$ docker-compose exec web python manage.py collectstatic --no-input --clear


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

http://localhost:1317/

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

画像14


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

http://localhost:1317/admin

画像15


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

$ docker-compose down -v


■ Mediaファイルの設定

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

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

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

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


■ settings.pyの編集

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

...

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")

MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")


■ ymlファイルの編集

docker-compose.yml

version: "3.7"

services:
 web:
   build: ./django_project
   command: gunicorn project.wsgi:application --bind 0.0.0.0:8000
   volumes:
     - static_volume:/home/app/web/static
     - media_volume:/home/app/web/media
   expose:
     - 8000
   env_file:
     - ./.env.dev
   depends_on:
     - db

 db:
   image: postgres:12.0-alpine
   volumes:
     - postgres_data:/var/lib/postgresql/data/
   env_file:
     - ./.env.dev

 nginx:
   build: ./nginx
   volumes:
     - static_volume:/home/app/web/static
     - media_volume:/home/app/web/media
   ports:
     - 1317:80
   depends_on:
     - web

volumes:
 postgres_data:
 static_volume:
 media_volume:


■ Dockerファイルの編集

Dockerfile

ENV HOME=/home/app
ENV APP_HOME=/home/app/web
RUN mkdir $APP_HOME
RUN mkdir $APP_HOME/static
RUN mkdir $APP_HOME/media #追加
WORKDIR $APP_HOME


■ Nginxのconfigファイルの編集

upstream project {
   server web:8000;
}
server {
   listen 80;
   location / {
       proxy_pass http://project;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $host;
       proxy_redirect off;
   }
   location /static/ {
       alias /home/app/web/static/;
   }
   location /media/ {
       alias /home/app/web/media/;
   }
}


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


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

$ docker-compose down -v


新コンテナの起動

$ docker-compose up -d --build


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

$ docker-compose exec web python manage.py migrate --noinpu


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

$ docker-compose exec web python manage.py collectstatic --no-input --clear


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

http://localhost:1317/

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

画像16


画像17

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


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

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

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


■ settings.pyの編集

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

settings.py

SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")


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


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

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

*以降は有料記事として公開しています。
Dockerをインストールする本番環境のサーバーは既にUbuntu 20.04のOSがインストールされた状態で解説していますのでご注意ください。
(外部記事リンクにて、VPSサーバーの初期セットアップとOSインストール方法を紹介しています。)

ここから先は

10,206字 / 7画像

¥ 1,200

この記事が気に入ったらサポートをしてみませんか?