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


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

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

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

docker-composeでDjangoとPostgreSQLを連携した構築手順(VPS環境)

2020年4月6日

「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を利用した連携の構築は以上となります。


Docker実践ガイド 第2版 impress top gearシリーズ

Docker実践ガイド 第2版 impress top gearシリーズ

古賀 政純
3,762円(10/19 14:23時点)
発売日: 2019/02/18
Amazonの情報を掲載しています

関連記事


コメントを残す

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

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

ABOUTこの記事をかいた人

blank

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