このページで解説している内容は、以下の 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.10 | Python 3.10の公式Dockerイメージをベースにします。 |
WORKDIR /code | 作業ディレクトリを /code に設定します。 |
ADD requirements.txt /code | ローカルの requirements.txt ファイルをコンテナ内の /code ディレクトリに追加します。 |
RUN pip install -r requirements.txt | requirements.txt ファイルに記載されたPythonパッケージをインストールします。 |
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] | コンテナが起動した際に実行されるデフォルトのコマンドを指定します。 |
この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 | コンテナ化されるサービスを定義するセクション。 |
postgres | PostgreSQLサービスの定義。 |
image | 使用するDockerイメージを指定。 |
container_name | コンテナの名前を指定。 |
environment | 環境変数を設定するセクション。 |
POSTGRES_DB | PostgreSQLに作成されるデータベースの名前を指定。 |
POSTGRES_USER | PostgreSQLに作成されるデータベースユーザーの名前を指定。 |
POSTGRES_PASSWORD | PostgreSQLに作成されるデータベースユーザーのパスワードを指定。 |
volumes | ボリュームの定義。 |
db-data | PostgreSQLコンテナ内のデータを永続化するためのボリュームを指定。 |
項目 | 説明 |
---|---|
django | Djangoサービスの定義。 |
build | ローカルのカレントディレクトリ「./」のDockerfileからイメージをビルドするように指定。 |
container_name | コンテナの名前を指定。 |
depends_on | 依存関係を定義するセクション。 |
postgres | 依存するサービスの名前を指定。 |
ports | ポートのマッピングを指定。 |
volumes | ボリュームの定義。 |
./ | ローカルのカレントディレクトリをDjangoコンテナ内の /code ディレクトリにマウントします。 |
項目 | 説明 |
---|---|
volumes | ボリュームの定義セクション。 |
db-data | PostgreSQLコンテナ内のデータを永続化するためのボリュームを定義。 |
このComposeファイルでは、PostgreSQLとDjangoの2つのサービスが定義されています。PostgreSQLサービスはPostgreSQLデータベースを提供し、DjangoサービスはDjangoアプリケーションを実行します。
PostgreSQLのデータは「db-data」という永続的なボリュームに保存され、Djangoのコードはホストのカレントディレクトリがマウントされた /code
ディレクトリに保存されます。また、Djangoサービスはポート8000で公開されています。
この続きは「Djangoコンテナ(PostgrSQL)②」で、Djangoプロジェクトを作成して、Djangoコンテナを作成していきます。