【docker-compose】Django+PostgreSQL+Nginxを連携した構築手順(CentOS8+VPS環境)

VPS+CentOS8環境下で、docker-composeを利用し、Djangoの環境構築をしましたのでまとめます。

今回の構築では「docker-compose」でDjango+PostgreSQL+Nginxを連携した設計となっています。
構築に時間がかからず簡単にできるので参考にしてください。

前回、docker-composeの記事はこちらを参照

今回の環境はConoHaVPSを使用しています。

「docker-compose」Django+PostgreSQL+Nginxを連携(CentOS8)

CentOS8環境下で「dockcer-compose」を作成する前に事前に「firewalld」で「IPマスカレード(NAPT)」の許可が必要となります。
この設定をしていないと、「dockcer-compose」実行時に、ビルド中にyum、dnf、pipインストールの名前解決ができずエラーになったり、データベースへの内部アクセスができなくなります。

Docker環境では、NAPTを利用した通信が必要となるため、ここは許可設定をしておくことが重要となります。

※もう一つの解決方法として、「–network host」オプションを指定することで解消します。
こちらで実施したことはないのでメモ程度で。

「Firewalld」CentIPマスカレード(NAPT)の許可設定

Docker構築前にまずはfirewalldの設定を実施します。

Dockerが起動している場合は事前に停止します。
Dockkerが起動している状態で、firewalldの変更をするとDockerが正常に動かない不具合あがあります。

Docker停止

systemctl stop docker

IPマスカレード(NAPT)をfirewalldで許可

$ firewall-cmd --add-masquerade --permanent
success
$ firewall-cmd --reload
success

Docker起動

systemctl start docker

「docker-compose」構築

今回作成した「docker-compose」ですが「django」フォルダ配下で以下の構成とし、Nginxを連携するので「Nginx」フォルダを追加しています。

また、PostgreSQLのデータベースは同フォルダ内に「db-data」フォルダを作成し、ボリュームを共有します

$ tree
.
|-- Dockerfile
|-- db-data
|-- docker-compose.yml
|-- manage.py
|-- mysite
|   |-- __init__.py
|   |-- __pycache__
|   |   |-- __init__.cpython-38.pyc
|   |   |-- settings.cpython-38.pyc
|   |   |-- urls.cpython-38.pyc
|   |   `-- wsgi.cpython-38.pyc
|   |-- asgi.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
|-- nginx
|   |-- Dockerfile
|   |-- nginx.conf
`-- requirements.txt

作成する必要なファイルは以下となります。

  • Dockerfile
  • docker-compose.yml
  • requirements.txt
  • Nginxフォルダ配下(Dockerfile、nginx.conf)

それぞれのファイルの設定は以下の通りとなります。

Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir ./code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

docker-compose

$ cat docker-compose.yml
version: '3'
 
services:
  db:
    image: postgres
    ports:
            - 5432:5432
    environment:
            - POSTGRES_PASSWORD=postgres
    volumes:
            - ./db-data:/var/lib/postgresql/data
    container_name: postgres

  web:
    restart: always
    build: .
    command: bash -c "python manage.py runserver 0.0.0.0:8000 && python manage.py migrate"
    volumes:
            - .:/code
    ports:
            - 8000:8000
    depends_on:
            - db
    container_name: django

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

volumes:
    db-data:

$ 

requirements.txt

Django
psycopg2
gunicorn

Nginx(Dockerfile、nginx.conf)

Nginxを連携する場合は別途、「nginx」フォルダを作成し、配下で「Dockerfile」と「nginx.conf」を作成します。

$ cd nginx/
$ touch Dockerfile
$ touch nginx.conf

作成した、各ファイルの内容は以下となります。

Dockerfile

FROM nginx:latest

# デフォルトのconfを消して、別の設定を追加
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d

nginx.conf

upstream django {
    # コンテナのサービス名を指定し、名前解決
    server web:8000;
}

server {
    # 80ポートで待ち受け
    listen 80;

    location / {
        proxy_pass http://django;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
	# gzip圧縮
        gzip on;
        gzip_min_length 1k;
        gzip_types text/css text/javascript application/x-javascript application/javascript application/json image/svg+xml;
        gzip_disable "msie6";
    }

}
$

「docker-compose」でDjangoプロジェクト作成

上記ファイルの作成が完了したら、次に対象のフォルダ直下で以下コマンドでDjangoプロジェクトを作成します。

$ docker-compose run web django-admin startproject mysite .

プロジェクト実行後、以下のようにプロジェクトのファイル・フォルダが作成されたことを確認できます。

$ ll
total 40
-rw-r--r--  1 root             root  147 Apr 28 16:17 Dockerfile
drwx------ 19 systemd-coredump root 4096 May  2 15:12 db-data
-rw-r--r--  1 root             root  641 Apr 28 15:05 docker-compose.yml
-rwxr-xr-x  1 root             root  626 Apr 28 16:22 manage.py
drwxr-xr-x  3 root             root 4096 Apr 28 16:25 mysite
drwxr-xr-x  2 root             root 4096 Apr 30 10:55 nginx
-rw-r--r--  1 root             root   25 Apr 12 16:59 requirements.txt

DjangoをPostgreSQLデータベースに接続

Djangoのデータベース接続をPostgreSQLに設定します。
プロジェクトディレクトリで、「mysite/settings.py」ファイルを編集します。

vi mysite/settings.py
#ALLOWED_HOSTS = []
ALLOWED_HOSTS = ["*"]
 
#DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
#}
 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD' : 'postgres',
        'HOST' : 'db',
        'PORT' : 5432,
    }
}

データベースの「HOST」には、「docker-compose」のサービスであるdbを指定することで、コンテナ上で名前解決しアクセスします。

「docker-compose」でDjango+PostgreSQL+Nginx起動

Djangoプロジェクトが正常に作成された後、「docker-compose」で起動します。

$ docker-compose up

ブラウザを起動し、Nginxで設定したポート番号(80)へアクセスするとDjangoのポート(8000)へ転送され、以下のページが表示されると成功となります。

docker-composeを利用した連携の構築は以上となります。




エンジニアのオンライン学習

ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。

おすすめオンライン教材
自宅で学習ができるオンラインスクール

ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUT US
げんき☆ひろき
インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!