このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Docker入門】Djangoコンテナ(PostgrSQL)①

 Docker Composeコマンドを使ったDjangoコンテナの構築例を紹介します。データベースにはPostgrSQLを使用します。

「Djangoコンテナ(PostgrSQL)」は次の2部に分けて解説していきます。

 ここでは、主にコンテナの作成に必要な「Dockerfile」と「compose.yaml」などのファイルを作成していきます。

Djangoとは

まず、はじめにDjangoについて解説します。

 Djangoとは、プログラミング言語の一種であるPythonを使って記述されたWebアプリケーションフレームワークです。 フルスタックのため品質の高いWebアプリケーションを簡単に、かつシンプルなコードで作れることで、Pythonフレームワークの中でも最も人気があります。

 DjangoはMTV(Model-Template-View)アーキテクチャを採用しており、データベースのモデル(Model)、ユーザーインターフェースのテンプレート(Template)、ビジネスロジックのビュー(View)を分離しています。これにより、アプリケーションの各部分を独立して開発し、保守することができます。

URL:https://www.djangoproject.com/

PostgreSQLとは

 PostgreSQL(ポストグレスキューエル)は、オープンソースのリレーショナルデータベース管理システム(RDBMS)であり、世界中の多くの組織やコミュニティによって広く利用されています。その名前は「Postgres」(Post Ingresの略)に由来し、カリフォルニア大学バークレー校の研究プロジェクトから派生しています。

URL:https://www.postgresql.org/

Django コンテナの作成

「compose.yaml」を作成して、DjangoとPostgreSQLコンテナを作成します。

 Djangoイメージを利用したいところですが、適当なイメージがDocker Hub上にありません。厳密にいえばあるのですが、結構古いDjangoイメージです。

 そこで、オリジナルイメージを作成することにします。Djangoは、PythonでWebアプリケーションを作るためのフレームワークであるため、Pythonイメージをベースイメージを使うことにします。

 Pythonイメージだけでは、Djangoは実行できません。Pythonイメージに以下をインストールしてDjangoイメージを作成します。

①Djangoのインストール
 「pip install Django」コマンド
②PostgrSQLに接続するためのライブラリのインストール
 「pip install psycopg-2-binary」コマンド

オリジナルイメージを使用するにはDockerfileを定義する必要があります。

Dockerfileとcompose.yamlファイルを作成して、Djangoイメージを作成していきます。

不要なDockerオブジェクトの削除

まず、不要なDockerオブジェクトをすべて削除しておきます。

以下のコマンドを実行します。

「docker system prune -a」コマンドを実行します。

Are you sure you want to continue? [y/N] の質問には「y」と入力します。

PS C:\Users\joeac> docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
(略)

・「docker system prune -a」コマンドで削除されなかったDockerオブジェクトは、個別に削除しておきます。

環境によって削除されずに残っているDockerオブジェクトは異なります。

ディレクトリの作成と移動

Docker Composeでコンテナを作成するには、「compose.yaml」ファイルが必要になります。

 デフォルトでは、カレントディレクトリにある「compose.yaml」ファイルが読み込まれるため、作業ディレクトリに移動しておきます。

「cd desktop/docker」コマンドを実行します。

PS C:\Users\joeac> cd desktop/docker
PS C:\Users\joeac\Desktop\docker>

 「compose.yaml」ファイルを保存する「django1」ディレクトリを作成して、作成したディレクトリに移動します。

次のコマンドを実行します。

  • 「mkdir django1」コマンド
  • 「cd django1」コマンド
PS C:\Users\joeac\Desktop\docker> mkdir django1

    Directory: C:\Users\joeac\Desktop\docker

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/04/19     1:22                django1

PS C:\Users\joeac\Desktop\docker> cd django1
PS C:\Users\joeac\Desktop\docker\django1>

「Dockerfile」の作成

VSCodeで「Dockerfile」ファイルを作成します。

「code Dockerfile」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\django1> code Dockerfile

VSCodeが起動します。

「Dockerfile」ファイルを以下のように編集して保存します。

FROM python:3.10
WORKDIR /code
ADD requirements.txt /code
RUN pip install -r requirements.txt
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

定義内容の解説

「Dockerfile」ファイルの定義を解説します。

項目説明
FROM python:3.10Python 3.10の公式Dockerイメージをベースにします。
WORKDIR /code作業ディレクトリを /code に設定します。
ADD requirements.txt /codeローカルの requirements.txt ファイルをコンテナ内の /code ディレクトリに追加します。
RUN pip install -r requirements.txtrequirements.txt ファイルに記載されたPythonパッケージをインストールします。
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]コンテナが起動した際に実行されるデフォルトのコマンドを指定します。
「Dockerfile」ファイルの定義

 このDockerfileは、Python 3.10のイメージをベースにして、Djangoアプリケーションを実行するための設定を行っています。まず、作業ディレクトリを 「/code」 に設定し、ローカルの「 requirements.txt」 ファイルをコンテナ内に追加します。次に、「requirements.txt」 ファイルに記載されたPythonパッケージをインストールします。最後に、コンテナが起動した際にDjangoアプリケーションを起動するためのデフォルトのコマンドを指定しています。

 インストールしたいパッケージやライブラリが複数ある場合には、「requirements.txt」にまとめておくと便利です。複数のパッケージやライブラリを一括してインストールできます。

ただし、コンテナ内に追加しておく必要があります。

この機能は、Dockerの機能ではなくPythonの機能です。

「requirements.txt」ファイルの作成

VSCodeで「requirements.txt」ファイルを作成します。

「code requirements.txt」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\django1> code requirements.txt

VSCodeが起動します。

・「requirements.txt」ファイルを以下のように編集して保存します。

Django==4.0.2
psycopg2-binary

「compose.yaml」ファイルの作成

VSCodeで「compose.yaml」ファイルを作成します。

「code compose.yaml」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\django1> code compose.yaml

VSCodeが起動します。

「compose.yaml」ファイルを以下のように編集して保存します。

services:
  postgres:
    image: postgres:14.2
    container_name: postgres_container
    environment:
      POSTGRES_DB: test-db
      POSTGRES_USER: test-user
      POSTGRES_PASSWORD: test-pass
    volumes:
      - db-data:/var/lib/postgresql/data

  django:
    build: .
    container_name: django_container
    depends_on:
      - postgres
    ports:
      - "8000:8000"
    volumes:
      - .:/code

volumes:
  db-data:

定義内容の解説

「compose.yaml」ファイルの定義を解説します。

項目説明
servicesコンテナ化されるサービスを定義するセクション。
postgresPostgreSQLサービスの定義。
image使用するDockerイメージを指定。
container_nameコンテナの名前を指定。
environment環境変数を設定するセクション。
POSTGRES_DBPostgreSQLに作成されるデータベースの名前を指定。
POSTGRES_USERPostgreSQLに作成されるデータベースユーザーの名前を指定。
POSTGRES_PASSWORDPostgreSQLに作成されるデータベースユーザーのパスワードを指定。
volumesボリュームの定義。
db-dataPostgreSQLコンテナ内のデータを永続化するためのボリュームを指定。
PostgreSQLサービス
項目説明
djangoDjangoサービスの定義。
buildローカルのカレントディレクトリ「./」のDockerfileからイメージをビルドするように指定。
container_nameコンテナの名前を指定。
depends_on依存関係を定義するセクション。
postgres依存するサービスの名前を指定。
portsポートのマッピングを指定。
volumesボリュームの定義。
./ローカルのカレントディレクトリをDjangoコンテナ内の /code ディレクトリにマウントします。
Djangoサービス
項目説明
volumesボリュームの定義セクション。
db-dataPostgreSQLコンテナ内のデータを永続化するためのボリュームを定義。
ボリュームの定義

 このComposeファイルでは、PostgreSQLとDjangoの2つのサービスが定義されています。PostgreSQLサービスはPostgreSQLデータベースを提供し、DjangoサービスはDjangoアプリケーションを実行します。

 PostgreSQLのデータは「db-data」という永続的なボリュームに保存され、Djangoのコードはホストのカレントディレクトリがマウントされた /code ディレクトリに保存されます。また、Djangoサービスはポート8000で公開されています。

 この続きは「Djangoコンテナ(PostgrSQL)②」で、Djangoプロジェクトを作成して、Djangoコンテナを作成していきます。

関連コンテンツ