Django アプリを Docker イメージに入れる

勉強がてら、Django を Docker イメージに入れてみます。

Django は最低限の部分のみで、ロケットの画面が表示できれば OK とします。

  1. Python 仮想環境に Django をインストール
  2. Django プロジェクトを作る
  3. requirements.txt を作る
  4. Dockerfile を作る
  5. .dockerignore を作る
  6. docker build でイメージ作成
  7. docker run でイメージ実行

Python 仮想環境に Django をインストール

% python3 -m venv venv
% source venv/bin/activate
(venv) % pip install django

Django プロジェクトを作る

とりあえず最低限、あのロケットの画面の表示だけする様にします。

(venv) % django-admin startproject core
(venv) % python core/manage.py runserver
(venv) % ls                                                          
core                    venv

一旦 Django はここまで。

requirements.txt を作る

(venv) % pip freeze > requirements.txt
(venv) % ls                                                          
core                    requirements.txt        venv
# requirements.txt
asgiref==3.6.0
backports.zoneinfo==0.2.1
Django==4.2.1
sqlparse==0.4.4

Django と requirements.txt を作ったところで Docker の作業へ移っていきます。

Dockerfile を作る

今回は「python:3.8.3-slim-buster」のイメージをベースにして Dockerfile を作成します。

FROM python:3.8.3-slim-buster

WORKDIR /app

COPY requirements.txt .
RUN pip3 install -r requirements.txt

COPY . .

# コンテナ外からのアクセスを可能にするため 0.0.0.0 番で runserver を実行
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]

「COPY . .」の部分で、ローカルの作業フォルダ配下を全てコンテナの作業フォルダ(/app)にコピーします。この部分で Django の関連ファイルも全てコピーされます。

(venv) % ls                                                          
Dockerfile              core                    requirements.txt        venv

/venv 配下のみ、次の .dockerignore で除外設定をします。

.dockerignore を作る

「venv」配下をイメージに含めない様「.dockerignore」に追加します。

# .dockerignore
venv

docker build でイメージ作成

(venv) % docker build -t dockerdjango:1.0 .
(venv) % docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
dockerdjango   1.0       9c4fe787bc1d   45 seconds ago   205MB

docker run でイメージ実行

「docker run」を実行します。

(venv) % docker run --name dj_dk -p 8000:8000 dockerdjango:1.0

個人的なメモ

  • 「-p 8000:8000」と明示的にポートフォワーディングを設定しないとコンテナが孤立する。
  • たとえホスト側とコンテナ側で使うポート番号が一致していても、明示的に設定しないとホスト 8000 番へのアクセスがコンテナ 8000 番へ転送されない。

下記を実行してブラウザで「127.0.0.1:8000」へアクセスします。

とりあえずロケットの画面は表示されました。

「docker exec」でコンテナの中身を確認します。

(venv) % docker exec -it dj_dk bash
root@40ac730cceba:/app# ls
Dockerfile  core  requirements.txt

「.dockerignore」で指定した venv はきちんと除外されています。

コメントを残す

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