勉強がてら、Django を Docker イメージに入れてみます。
Django は最低限の部分のみで、ロケットの画面が表示できれば OK とします。
- Python 仮想環境に Django をインストール
- Django プロジェクトを作る
- requirements.txt を作る
- Dockerfile を作る
- .dockerignore を作る
- docker build でイメージ作成
- 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 はきちんと除外されています。