自分だけのクイズ作成 - Quipha公開中

【Django】DockerコンテナにPostgreSQL/pgAdminを追加

Django
スポンサーリンク

はじめに

前回、Django環境をDockerを使用し構築しました。

上記の記事で解説した環境に、PostgreSQLを追加する手順を解説します。
また、PostgreSQLを管理するためのツールである、pgAdminもインストールします。

本記事ではDjangoの開発環境をDockerで構築し、VS Codeからリモートで開発を行います。

今回使用する環境とバージョン

今回試した環境
  • Windows 11 / 10
  • macOS Monterey (M1)
  • PostgreSQL 14.2
  • pgAdmin 6.5

2022/04/20 WindowsとMacを使い、最新バージョンで確認しました。

他にも私のブログで、Djangoについて解説している記事がありますのでご覧ください。

ちなみにMySQL/phpMyAdminを追加する方法は、以下の記事をご覧ください。

VS Codeインストール

VS Codeのインストール方法は、以下の記事にまとめましたのでご覧ください。

VS Codeのオススメ設定や拡張機能などは、以下の記事にまとめました。

以降の解説キャプチャはWindowsをベースにしていますが、Macでの操作も同様です。

Dockerコンテナの設定

Dockerfile

前回の続きになりますので、構築が済んでいる状態で解説します。

まずは、Dockerfileの定義を修正します。
PythonからPostgreSQLを操作するために、「psycopg2」というライブラリをインストールします。

FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN pip install django
RUN pip install psycopg2

docker-compose.yml

「.devcontainer」フォルダの中に、docker-compose.ymlファイルを作成します。
PostgreSQLなどが稼働するコンテナを複数追加しますので、Docker Composeを利用します。

まずは、それぞれのコンテナごとに解説しています。
最後には全容を載せています。

Pythonコンテナ

「web」というサービス名で、Pythonコンテナを作成します。
Dockerfileをベースにビルドを行います。

  web:
    build: .
    tty: true
    volumes:
      - ../:/workspace
    depends_on:
      - db

ttyを指定することにより、コンテナが終了しないようにしています。
また、コンテナ内の「/workspace」ディレクトリに、ホスト側のDjangoプロジェクトを配置しました。

PostgreSQLコンテナ

postgresイメージを使用しました。
バージョンの指定はしませんが、最新のPostgreSQL 14系がインストールされます。

DB名と、ユーザ名、パスワードを任意で指定します。

  db:
    image: postgres
    volumes:
        - postgres_data:/var/lib/postgresql/data
    environment:
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: password
        POSTGRES_DB: django_sample
...
volumes:
    postgres_data:

データは永続化しています。

pgAdminコンテナ

pgAdminのイメージを指定しました。
バージョンは指定していませんが、pgAdmin 6.5がインストールされます。

pgAdminにログインするためのメールアドレスとパスワード、ホスト側のポート番号を任意で指定します。

  pgadmin4:
    image: dpage/pgadmin4
    ports:
        - 8888:80
    volumes:
        - pgadmin4_data:/var/lib/pgadmin
    environment:
        PGADMIN_DEFAULT_EMAIL: xxxxxxxxxx@gmail.com
        PGADMIN_DEFAULT_PASSWORD: password
    depends_on:
      - db
...
volumes:
...
    pgadmin4_data:

後述していますが、PGADMIN_DEFAULT_EMAILにはメールアドレス形式の値を指定しないとエラーになり起動できません。

データは永続化しています。

全容

改めて、docker-compose.ymlの中身は以下のようになります。

version: '3'

services:
  web:
    build: .
    tty: true
    volumes:
      - ../:/workspace
    depends_on:
      - db

  db:
    image: postgres
    volumes:
        - postgres_data:/var/lib/postgresql/data
    environment:
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: password
        POSTGRES_DB: django_sample

  pgadmin4:
    image: dpage/pgadmin4
    ports:
        - 8888:80
    volumes:
        - pgadmin4_data:/var/lib/pgadmin
    environment:
        PGADMIN_DEFAULT_EMAIL: xxxxxxxxxx@gmail.com
        PGADMIN_DEFAULT_PASSWORD: password
    depends_on:
      - db

volumes:
    postgres_data:
    pgadmin4_data:

devcontainer.json

devcontainer.jsonファイルを以下のように修正します。

  • dockerComposeFileにdocker-compose.ymlを指定します。
  • workspaceFolderは、コンテナ側のディレクトリを指定します。(プロジェクトディレクトリ)
  • serviceは、使用するコンテナを指定します。(Pythonコンテナ)
{
	"name": "Django Sample",
	// Dockerfileでイメージ・コンテナを作成
	"dockerComposeFile": "docker-compose.yml",
	// VS Codeのワークスペースフォルダ
	"workspaceFolder": "/workspace",
	// 使用するサービス
	"service": "web",
	// リモート先のVS Codeにインストールする拡張機能
	"extensions": [
		"ms-python.python"
	],
	"shutdownAction": "stopCompose"
}
スポンサーリンク

コンテナのビルド

VS Codeを起動し、左下の緑のアイコンをクリックします。

「Open Folder in Container…」を選択します。

今回作成したプロジェクトフォルダを開きます。
私の場合は以下です。

Windows例:
D:\django-sample-app\
Mac例:
/users/xxx/Documents/django-sample-app

開く際にコンテナがビルドされます。
もし既に開いている状態であれば、「Remote-Containers: Rebuild Container」を選択し、ビルドし直すこともできます。

Docker上から、三つのコンテナが稼働しているのが確認できます。

Djangoのテーブル作成

Djangoのデータベースの設定を変更します。
デフォルトでsqlite3が指定されていますが、PostgreSQLに変更します。

djangoSampleApp/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'django_sample',
        'USER': 'postgres',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': 5432,
    }
}

DB名やユーザ、パスワードなどは、docker-compose.ymlの「db」に記載の通りです。

VS Codeのターミナルを開きます。

以下のコマンドでDjangoのテーブルを作成しましょう。

$ python manage.py migrate

以下のような出力になればOKです。

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

pgAdminから確認

pgAdminコンテナも作成しましたので、ブラウザから以下のURLにアクセスします。

http://localhost:8888/

pgAdminの画面が表示されました。
メールアドレス、パスワードは、docker-compose.ymlの「pgadmin4」に記載の通りです。

PostgreSQLのデータベースへのログイン情報ではありませんので注意してください。
本記事のdocker-compose.ymlであれば、「xxxxxxxxxx@gmail.com/password」になります。

管理画面が表示されました。

作成したPostgreSQLのデータベースを操作できるようにしましょう。
「Add New Server」をクリックします。

Nameは任意で指定します。

接続情報を入力します。
ホスト名はコンテナを指定しますので、「db」を指定します。

DB名やユーザ、パスワードなどは、docker-compose.ymlの「db」に記載の通りです。

データベースのダッシュボードが表示されました。

「Properties」を確認するとPostgreSQL 14.2が稼働しているのが確認できます。

Djangoで作成したテーブルを確認します。
データが正しく挿入されています。

pgAdminの使い方については、ここでは掘り下げませんが、テーブルに対する操作ができます。

トラブルシューティング

pgadmin4コンテナが起動しない

docker-compose.ymlで、PGADMIN_DEFAULT_EMAILにメールアドレス形式ではない文字を指定するとコンテナ起動時にエラーになります。

    environment:
        PGADMIN_DEFAULT_EMAIL: root
        PGADMIN_DEFAULT_PASSWORD: password

これは古いバージョンのpgAdminでは問題ありませんが、最新のバージョンではエラーになります。

コンテナ起動時のエラーログは以下のようになります。
この場合、コンテナは起動していませんので、URLにアクセスしてもpgAdminの画面が表示されません

‘root’ does not appear to be a valid email address. Please reset the PGADMIN_DEFAULT_EMAIL environment variable and try again.

この状態で一度コンテナ・ボリュームを作成してしまった場合は、それらを削除して作り直す必要があります。

pgAdmin操作時にエラーが発生する

pgAdminがサポートしていないバージョンのPostgreSQLを操作しようとするとエラーが発生します。
例えば、pgAdminが古く、PostgreSQLが新しい場合です。

Error retrieving the information – INTERNAL SERVER ERROR

ERROR: column rel.relhasoids does not exist
LINE 8: pg_get_userbyid(rel.relowner) AS relowner, rel.relhasoids,…

pgAdminのドキュメントを確認します。

Container Deployment — pgAdmin 4 6.5 documentation
pgAdmin - PostgreSQL Tools for Windows, Mac, Linux and the Web

例えばpgAdmin 5.7の場合は、PostgreSQL 14をサポートしていません。
この組み合わせの場合は、エラーが発生します。

どちらも最新のバージョンを使用すると問題ないと思います。

その他

外部サーバーへ公開

作成したアプリは公開して使ってもらいましょう!
Djangoアプリケーションを外部公開する方法をまとめました。

脆弱性対策

脆弱性を抱えたアプリケーションの場合、攻撃を受ける可能性があり大変危険です。
作成したアプリケーションは、脆弱性対策も意識しましょう。

GitHubと連携

GitHubと連携する方法を解説しました。
プロジェクトの管理はGitHubを活用しましょう。

さいごに

今回はDjango環境をDockerを使用し、さらにPostgreSQLを追加する手順を解説しました。
Dockerを使い、コンテナを追加するだけで簡単に拡張できました。

コンテナを作り直すことも容易ですので、開発に便利です。

他にも、Django REST Frameworkを導入すると、APIが簡単に実装できます。

是非活用しましょう。

他にも私のブログで、Djangoについて解説している記事がありますのでご覧ください。

\オススメ/

コメント

タイトルとURLをコピーしました