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」のインストールは以下のページを参考にしてください。

【CentOS7】Dockerインストールと起動(無償版CE)

2020年2月22日

「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インストールを実施する際は「プロキシサーバ」で解決する必要があります。

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

【CentOS8】DockerコンテナでDjango起動確認(ConoHaVPS)エラー対応あり

2020年3月23日


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

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

【docker-compose】CentOS8環境(Django+PostgreSQL)NetworkエラーでDBにアクセス不可解決方法

2020年4月27日

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


関連記事


コメントを残す

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

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

ABOUTこの記事をかいた人

blank

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