Djangoを使ったWebアプリの作り方 ③Docker編
②CRUD処理編では、アプリの基本動作であるCRUD処理ができるアプリを作成しました。
本編では、今後サーバー環境でも適用できるようにDocker対応を進めていきます。アプリをDockerで動かせるようになると、環境(Windows, Mac, Linux)が変わっても問題なくアプリを起動させることができ便利です。
Djangoを用いたアプリ開発をDockerを使って行う手順は、以下のように進めることができます。これにより、開発環境の一貫性を保ち、依存関係の管理を容易にします。
手順概要
開発環境の準備
Djangoプロジェクトの作成
Dockerfileの作成
Dentrypoint.shの作成
docker-compose.ymlの作成
コンテナのビルドと起動
アプリケーションの実行
詳細手順
1. 開発環境の準備
Dockerのインストール: Dockerを公式サイトからインストールします。Docker Desktopを使用することで、WindowsやMacでも簡単にDockerを利用できます。
2. Djangoプロジェクトの作成
今回使用するDjangoプロジェクトは、以前作成した物(以下)を使用します。
Docker Desktopを起動し、以下カレントディレクトリに移動します。
cd Django_Project
'''
# ディレクトリ構成
├── Django_Project # << カレントディレクトリ
├── manage.py
├── db.sqlite3
├── Pipfile
├── Pipfile.lock
│
├── mysite/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
│ └── asgi.py
│
└── myapp/
├── migrations/
├── templates/
| ├── __init__.py
| ├── admin.py
├── __init__.py
├── admin.py
├── apps.py
├── forms.py
├── models.py
├── tests.py
├── urls.py
└── views.py
'''
3. Dockerfileの作成
Dockerfileは、コンテナの設計図になります。コンテナ内で実行されるコマンドや設定を一行ずつ記述します。
今回Dockerfileを作成するディレクトリは"./containsers/django/Dockerfile"としました(今後、複数のDockerfileを作成してくため)。
Dockerfileに以下の内容を記述します。
FROM python:3
ENV PYTHONUNBUFFERD=1
ENV PYTHONDONTWRITEBYTECODE=1
WORKDIR /code
RUN pip install --upgrade pip \
&& pip install pipenv
COPY ./Pipfile /code/Pipfile
COPY ./Pipfile.lock /code/Pipfile.lock
RUN pipenv install --system --deploy --ignore-pipfile
COPY ./containers/django/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
'''
# ディレクトリ
├── ./
├── manage.py
├── db.sqlite3
├── Pipfile
├── Pipfile.lock
│
├── containers/
| ├── django # <<追加
| ├── Dcokerfile # <<追加
├── mysite/
└── myapp/
# コードの説明
FROM python:3
>>Dockerイメージのベースとして、Pythonの公式イメージ(Python 3)を使用します
ENV PYTHONUNBUFFERD=1
>>Pythonの出力をバッファリングせず、すぐに表示するように設定します。
ログがリアルタイムで見やすくなります。
ENV PYTHONDONTWRITEBYTECODE=1
>>.pycファイル(Pythonのバイトコード)を作成しないようにします。
不要なファイルを生成しないことで、コンテナのサイズを小さく保ちます。
WORKDIR /code
>>コンテナ内での作業ディレクトリを/codeに設定します。
以降のコマンドはこのディレクトリ内で実行されます。
RUN pip install --upgrade pip \
&& pip install pipenv
>>pip(Pythonのパッケージ管理ツール)を最新バージョンにアップグレードします。
pipenvをインストールします。pipenvは、Pythonの依存関係を管理するツールです。
COPY ./Pipfile /code/Pipfile
COPY ./Pipfile.lock /code/Pipfile.lock
>>**COPY**コマンドで、ホストマシン上のPipfileとPipfile.lockをコンテナ内の/codeディレクトリにコピーします。
RUN pipenv install --system --deploy --ignore-pipfile
>>**pipenv install**コマンドで、依存関係をインストールします。
--system:グローバルなPython環境にパッケージをインストールします。
--deploy:Pipfile.lockに記載されたパッケージと完全に一致する場合のみインストールします。不一致があるとエラーになります。
--ignore-pipfile:Pipfileを無視し、Pipfile.lockのみを使用します。
COPY ./containers/django/entrypoint.sh /usr/local/bin/entrypoint.sh
>>ホストマシン上のentrypoint.shスクリプトを、コンテナ内の/usr/local/bin/entrypoint.shにコピーします。
RUN chmod +x /usr/local/bin/entrypoint.sh
>>**chmod +x**コマンドで、entrypoint.shに実行権限を付与します。
これにより、このスクリプトを実行できるようになります。
'''
4. entorypoint.shの作成
entrypoint.shを作成します。entrypoint.shは、Dockerコンテナが起動するときに最初に実行されるスクリプトです。コンテナ内で必要な初期設定やコマンドを自動的に実行するために使います。
python manage.py makemigrations myapp --no-input
python manage.py migrate --no-input
python manage.py runserver 0.0.0.0:8000
'''
# ディレクトリ
├── ./
├── manage.py
├── db.sqlite3
├── Pipfile
├── Pipfile.lock
│
├── containers/
| ├── django
| ├── Dcokerfile
| ├── entorypoint.sh # <<追加
├── mysite/
└── myapp/
# コードの説明
python manage.py makemigrations myapp --no-input
>> モデルの変更を検知して、マイグレーションファイルを作成します。
python manage.py migrate --no-input
>> 作成されたマイグレーションファイルを元に、データベースを更新します。
python manage.py runserver 0.0.0.0:8000
>> 開発用のウェブサーバーを起動し、アプリケーションをアクセス可能にします。
'''
5. docker-compose.ymlの作成
次に、docker-compose.ymlファイルを作成します。
docker-compose.ymlとは、複数のDockerコンテナを一括で定義・管理・起動するための「設計図」のようなものです。今回複数のコンテナは使用しませんが、今後を見越して使用します。
docker-compose.ymlに以下の内容を記述します。
services:
app:
container_name: app
build:
context: .
dockerfile: ./containers/django/Dockerfile
volumes:
- .:/code
ports:
- 8000:8000
command: sh -c "/usr/local/bin/entrypoint.sh"
'''
# ディレクトリ
├── ./
├── manage.py
├── db.sqlite3
├── Pipfile
├── Pipfile.lock
├── docker-compose.yml # <<追加
│
├── containers/
| ├── django
| ├── Dcokerfile
| ├── entorypoint.sh
├── mysite/
└── myapp/
# コードの説明
services:
>>管理するサービス(コンテナ)の一覧を定義します。
app:
>>appという名前のサービスを定義しています。
container_name: app
>>コンテナの名前をappに設定します。
build:
>>コンテナのイメージをどのようにビルドするかを指定します。
context: .
>>ビルドのコンテキストを現在のディレクトリ(.)に設定します。
Dockerがイメージをビルドするときに必要なファイルを探す場所です。
dockerfile: ./containers/django/Dockerfile
>>ビルドに使用するDockerfileの場所を指定します。
volumes:
>>ホスト(あなたのPC)のディレクトリとコンテナ内のディレクトリを共有します。
- .:/code
>>ホストの現在のディレクトリ(.)をコンテナ内の/codeディレクトリにマウントします。
ports:
>>ホストとコンテナ間でポートをマッピングします。
- 8000:8000
>>ホストのポート8000をコンテナのポート8000に対応させます。
command: sh -c "/usr/local/bin/entrypoint.sh" 。
>>コンテナが起動する際に実行するコマンドを指定します。
シェルスクリプトentrypoint.shを実行します。
'''
この設定により、Djangoアプリケーションがポート8000で公開され、コードの変更が即座に反映されるようになります。
6. コンテナのビルドと起動
以下のコマンドを実行して、Dockerイメージをビルドし、コンテナを起動します。
docker-compose up -d --build
'''
# コードの説明
docker-compose up:
>>Docker Composeで定義されたサービス(コンテナ)を起動します。
-d(デタッチドモード):
>>コンテナをバックグラウンドで実行します。
つまり、ターミナルを占有せずに他の作業ができます。
--build:
>>各サービスのDockerイメージをビルドしてから起動します。
Dockerfileやコードに変更があった場合、新しいイメージを作成します。
'''
このコマンドは、Dockerfileを基にイメージをビルドし、サービスを起動します。
7. アプリケーションの実行
ブラウザを開き、http://localhost:8000にアクセスすると、下記アプリ画面が表示されるはずです。
まとめ
これらの手順を踏むことで、Dockerを使用したDjangoアプリケーションの開発環境を構築することができます。Dockerを利用することで、環境の一貫性が保たれ、開発やデプロイがスムーズに行えるようになります。