Docker上にDjangoを使ったプロジェクトとアプリを作成して、開発サーバーを使ってブラウザに表示する手順のまとめです。
プロジェクトのディレクトリの作成
ここでは例としてdjangoというディレクトリを作成。
mkdir django
cd django
requirements.txtファイルの作成
インストールするパッケージを指定したファイルを作成する。
touch requirements.txt
Django>=3.0,<4.0
psycopg2-binary>=2.8
DjangoとPsycopgをインストールする。
Psycopgは、PostgreSQLを効率的に使うためのツール。
-binaryはOS専用言語版のためコンパイル不要。
dockerfileの作成
python3のイメージを作成するためのdockerfileを作成する。
touch dockerfile
FROM python:3
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
・From イメージ名
指定したイメージをdockerhubからpullする。(dockerhubにない場合はローカルを探す)
・ENV 変数名
環境変数の設定。PYTHONUNBUFFEREDという変数に1をいれる。
コンソールの標準出力(stdout)と標準エラー出力(stderr)がエラー発生時にすぐに出力されるようにする(バッファを無効にする。pythonの-uオプションと同じ)
・RUN コマンド
コンテナ内に /code というディレクトリを作成する
・WORKDIR ディレクトリ
指定したディレクトリ(/code)をルートディレクトリにする
・COPY ホスト コンテナ
ホストのrequirements.txtを、コンテナの/code/配下にコピーする
・pip install -r ファイルパス
指定ファイルに書かれたパッケージをインストールする。
ファイルはrequirements.txtを使用することが一般的。
「-r」 = 「–requirement」
docker-compose.ymlの作成
イメージを作成するためのdocker-composeファイルを作成する。複数のコンテナを含んだイメージを作成するためのファイル。(dockerfileは1つのコンテナのみ)
touch docker-compose.yml
version: "3.8"
services:
db:
image: postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8100:8000"
depends_on:
- db
イメージの中に2つのコンテナを用意する。
・version: "3.8"
docker-compose.ymlの記述方法のバージョンを指定。
バージョンにより書き方が異なるため指定が必要。
・services
作成するコンテナ。dbとwebの2つを作成する。
・images
使用するイメージを指定。docker hubからpostgresをpullしてコンテナを作成する。
・environment
環境変数を設定。DBをpostgresに設定。user名とPWは任意で。
・build ディレクトリパス
指定したディレクトリ内のdockerfileからコンテナを作成する。
ファイル名の指定がない場合はdockerfileを選択。異なる名前をつけている場合はファイル名も指定する。
・commnad
コンテナ内で実行するコマンド。localhost:8000のサーバーを起動。
manage.pyのrunserverを実行。
manage.pyはコマンドラインユーティリティ。便利なコマンドをインポートしてくる。
・volumes: -ホスト:コンテナ
ホストのディレクトリをコンテナ内の指定したディレクトリと連動させる(マウントする)。
ホストのプロジェクトフォルダとコンテナ内の/codeを同期している。
同期したくないファイルは.dockerignoreを作成しファイル/フォルダ名を記述する。
・ports: -"ホスト:コンテナ"
ホスト側のポートを、コンテナ側の指定したポートに繋ぐ。
localhost:8100にアクセスすると、コンテナ内の8000ポートに繋がる。
・depends_on
webコンテナをdbコンテナと接続する。以前はlinkが使われていたが、v2.0以上は特に記述しなくとも、docker-compose.yml内のコンテナがネットワークで繋がる。(depends_onも不要?)
設定ファイルからコンテナを作成する
docker-compose run web django-admin startproject mysite
・docker-compose run [サービス名] [コマンド]
指定したサービス名のコンテナを作成し、コマンドを実行する。
実行したフォルダ内にあるdocker-comopse.ymlファイルを元にイメージ作成、コンテナ作成・起動までを一気に行う。
ここではwebサービスを起動。
・django-admin startporject PJ名
PJを作成する。
指定したPJ名(mysite)でディレクトリが作成される。
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
settigs.pyの編集
mysite/settings.pyにDBの設定を書き込む。
初期設定はsqlite3が指定されているので上書きする。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
コンテナの起動
docker-compose up
省略
web_1 | Django version 3.1.2, using settings 'mysite.settings'
web_1 | Starting development server at http://0.0.0.0:8100/
web_1 | Quit the server with CONTROL-C.
作成したコンテナを起動する。
指定したサーバーが立ち上がる。状態を見るには別のbash windowを開いてdocker ps
を実行する。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9615ecd4098f django_web "python manage.py ru…" 16 minutes ago Up About a minute 0.0.0.0:8100->8000/tcp django_web_1
バックグラウンドで起動させたい場合は、up -d
にする。
localhost:8100にアクセスするとページが開ける(コンテナ内のloaclhost:8000にアクセスできる)
appの作成
コンテナの中に入ってアプリを作成する。
##起動中のコンテナでbashを立ち上げる
$ docker exec -it django_web_1 bash
root@faef5f41e1c7
##django appの作成
root@faef5f41e1c7:/code# python manage.py startapp polls
##フォルダの確認
root@faef5f41e1c7:/code# ls
Dockerfile docker-compose.yml manage.py mysite polls requirements.txt
コンテナ内でpollsの作成に成功。
ホスト側にもディレクトリが作成作成される。(volumeを指定して、同期しているため)
プロジェクトとappの違い
djangoのコマンドで、startprojectとstartappという似たコマンドを実行している。
django-admin startproject mysite
python manage.py startapp polls
projectは1つだけ存在するもので、appは複数存在することができる。
mysiteというプロジェクトの中にpollsというappを一つだけ作成した状態。
views.pyの編集
画面の表示を操作するため、先ほど作成したpollsフォルダ内のviews.pyを編集する。
コンテナ内にエディタはインストールしてないので、一旦コンテナから抜ける。
root@faef5f41e1c7:/code# exit
▼画面上に「Hello, This is Django Polls」と表示されるプログラムを記述。
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, This is Django Polls")
urls.pyの作成と編集
polls内のURLの設定と、プロジェクトとしてのurlの設定をする必要がある。
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
pollsのurls.pyをpathとして認識させ、polls/でアクセスできるようにする。
記述したら、localhost:8100/polls
でページをロード。
無事表示完了。