Dockerを使ってDjango(python)の環境を構築する方法。ブラウザに指定した内容を表示するまでの手順

docker-prograshi(プロぐらし)-kv Docker
記事内に広告が含まれていることがあります。

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オプションと同じ)

PYTHONUNBUFFERED



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 でページをロード。

無事表示完了。


参考にしたサイト

Docker公式 Django作成
Django公式 初めてのApp作成

タイトルとURLをコピーしました