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

docker-composeを利用し、「Django」と「PostgreSQL」を連携した環境を作成する手順をまとめました。

今回の構築手順は、事前に「docker」と「docker-compose」をインストールしていることが前提条件となります。
構築環境は以下となります。

  • ConoHaVPS
  • CentOS8:CentOS Linux release 8.1.1911 (Core)
  • django_web:latest(dockerイメージ最新版)
  • python:3(dockerイメージ最新版)
  • postgres:latest(dockerイメージ最新版)
  • psycopg:(dockerイメージ最新版)

CentOS「docker」のインストールは以下のページを参考にしてください。

「docker-compose」Django+PostgreSQLを連携した構築手順

docker-composeを利用した手順は公式のドキュメントを参考に構築します。
今回の最終構成は以下のようになります。

$ pwd
/docker/www/django

構成

.
├── docker-compose.yml
├── composeexample
│   ├── __init__.py
│   └── __pycache__
│   |   ├── __init__.cpython-38.pyc
│   |   ├── settings.cpython-38.pyc
│   |   ├── urls.cpython-38.pyc
│   |   └── wsgi.cpython-38.pyc
|   ├── settings.py
|   ├── urls.py
|   └── wsgi.py
├── manage.py
├── Dockerfile
└── requirements.txt

今回の環境では「/docker/www/django」配下に以下のファイルを作成します。

  • docker-compose.yml
  • Dockerfile
  • requirements.txt

「Dockerfile」作成

Dockerfileを作成します。

vi Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt --proxy=x.x.x.x:3128
COPY . /code/

6行目で、プロキシサーバを参照しているのは、CentOS8の環境下においてDockerコンテナでpipインストールを実施する際は「プロキシサーバ」で解決する必要があります。

プロキシサーバインストールについては以下のページを参考にしてください。

「requirements.txt」作成

この「requirements.txt」ファイルはDockerfile内の「RUN pip install -r requirements.txt」コマンドで使用されます。

$ vi requirements.txt

以下を記載

Django>=2.0,<3.0
psycopg2>=2.7,<3.0

「docker-compose.yml」作成

「docker-compose.yml」ファイルはWebサーバー(Django)とデータベース(PostgreSQL)のサービスを公開するポートを記述します。

vi docker-compose.yml

以下の通り記載します。

version: '3'

services:
  db:
    image: postgres
    ports:
            - "5432:5432"
    environment:
            POSTGRES_PASSWORD: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

6-7行目ではPostgreSQLコンテナへのアクセスするポートフォワードを実施します。
今回の構成では「0.0.0.0:5432->5432/tcp」という設計で構築しないとPostgreSQLへのアクセスができませんでした。

Djangoプロジェクトを作成

Django+PostgreSQLの連携した構成を作成するため、以下手順でDjangoプロジェクトを作成します。

  1. 「/docker/www/django」配下へ移動
  2. 「docker-compose run」コマンドを実行して、Djangoプロジェクトを作成
$ docker-compose run web django-admin startproject composeexample .

---中略

Successfully built 6e887cdae932
Successfully tagged django_web:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.

最後に「Successfully」となれば完了です。

「docker-compose」実施後該当フォルダには以下のようにファイル、フォルダが作成されます。

drwxr-xr-x 3 root root 4096 Apr  6 18:03 composeexample
-rw-r--r-- 1 root root  304 Apr  6 18:52 docker-compose.yml
-rw-r--r-- 1 root root  173 Apr  4 15:28 Dockerfile
-rwxr-xr-x 1 root root  634 Apr  6 18:02 manage.py
-rw-r--r-- 1 root root   36 Apr  4 22:41 requirements.txt

PostgreSQLデータベースに接続

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

vi composeexample/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,
    }
}
  • 2行目:ALLOWED_HOSTS = [“*”]はすべてのアクセス元を許可する設定
  • 17行目:※重要 HOSTはdocker-copseで記載されているサービス名「db」となります

上記、「DATABASES」はdbのIPを名前解決で受け付けます。
Localhost、127.0.0.1の設定ではアクセスできませんでした。

「ALLOWED_HOSTS」、「DATABASES」は上記の通り書き換えてください。

Django+PostgreSQL起動

プロジェクトの最上位ディレクトリからdocker-compose upコマンドを実行します。

$ pwd
/docker/www/django
$

以下コマンドで実行

$ docker-compose up

------中略

web_1  | Starting development server at http://0.0.0.0:8000/
web_1  | Quit the server with CONTROL-C.

上記でDockerが立ち上がっているので、Webブラウザで<ホストIP:8000>へアクセスするとDjangoウェルカムページが表示されます。

また、バックグラウンドでDjangoを起動する場合は以下のコマンドを実行します。

$ docker-compose up -d

起動後は以下のコンテナが立ち上がります。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2629831994d6        django_web          "python manage.py ru…"   54 minutes ago      Up 15 seconds       0.0.0.0:8000->8000/tcp   django_web_1
18b8b254bb8f        postgres            "docker-entrypoint.s…"   57 minutes ago      Up 16 seconds       0.0.0.0:5432->5432/tcp   django_db_1

Docker上でDjango+PostgreSQLを連携した構築手順は以上となります。

※アクセスエラーが発生する場合は以下のページを参考にしてください。

PostgreSQLへのアクセスエラー解決方法です。




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

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

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

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



コメントを残す

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

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

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