開発日記

Djangoの開発環境をDockerで構成してみる!

こんにちは、MSKです。
出退勤を記録するアプリの続きです。
Dockerを使って開発環境と本番環境を用意しようと思っていますが、Dockerを使ったことがないので勉強しながら作っていきます。

関連する記事は以下になります。
出退勤の時間を記録するWebアプリの作り始め!
出退勤時間を記録するアプリのAPIを作る! 
出退勤時間を記録するアプリのユーザー登録と認証を実装する! 
Djangoの開発環境をDockerで構成してみる!<- この記事はここ!

DjangoのトップページをDocker-Composeで表示する

「django-docker」というディレクトリを作成して、その中に「web」と「app」というディレクトリ、docker-compose.ymlファイルを作成します。

.
├── app
├── docker-compose.yml
└── web

Djangoアプリを作成する

まずDjangoのプロジェクトを準備します。
仮想環境を用意して、Djangoをインストールしてプロジェクトを作成します。
appフォルダに移って次のコマンドを打ちます。

python3 -m venv venv
source venv/bin/activate
pip install Django
django-admin startproject app .

プロジェクトができたので、一度動作を見ておきます。

python manage.py runserver

初期画面が出たらOKです。

pythonコンテナで必要なパッケージをインストールするためにrequirements.txtを作成して次のように記入します。

Django==3.1.4
gunicorn==19.9.0

gunicornはNginxとDjangoの間の通信を高速にやり取りするための「アプリケーションサーバー」です。
本番環境ではrunserverではなく、gunicornなどのアプリケーションサーバーを使うことを推奨されています。

Dockerfileを用意します。
python3.8.3-alpineを使いたかったのですが、うまく行かなかったので今はpython3を使っています。

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
WORKDIR /code/
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app.wsgi:application"]

Nginxのconfファイルを作成する

webサーバーとしてNginxを使います。
Nginxの設定をproject.confファイルとして記述します。

upstream app {
  server app:8000;
}

server {
    listen  80;
    server_name :localhost;

    location / {
        proxy_pass http://app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

docker-compose.ymlを作成する

docker-composeを使うためにdocker-compose.ymlファイルを作成します。

version: "3"
services:
  app:
    build: ./app
    expose:
      - "8000"
    networks:
      - app_network
    volumes:
      - ./app:/code
    hostname: app-server
    restart: always
  web:
    image: nginx
    ports:
      - "80:80"
    networks:
      - app_network
    depends_on:
      - app
    volumes:
      - ./web/project.conf:/etc/nginx/conf.d/default.conf
    restart: always
networks:
  app_network:
    driver: bridge

serviceにフォルダと同じようにappとwebとしています。
appの方がDjangoアプリ、webの方がNginxの構成を記述しています。
appの方では、Dockerfileをbuildしています。
webの方では、nginxのimageを使っています。
また、webではappと連携するためdepends_onにappを指定しています。

ローカルで動作確認

最終的な構成は次のようになりました。

.
├── app
│   ├── Dockerfile
│   ├── app
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── manage.py
│   └── requirements.txt
├── docker-compose.yml
└── web
    └── project.conf

docker-compose.ymlファイルがある場所で次のコマンドを入力します。

docker-compose up -d --build

buildが行われて、すべてのコンテナが立ち上がったら次のコマンドでコンテナの状況を見てみます。

docker-compose ps

コンテナの状態が見れると思いますので、停止していたりしない場合はブラウザでhttp://127.0.0.1にアクセスします。

Djangoのスタートのページが表示されればOKです。

最後に

とりあえず、dockerでDjangoを起動することはできました。

この次は前回までで作ったアプリをdockerで起動したいと思っています。
必要なことはdatabaseを別コンテナで起動して繋ぎ込みをしてあげることだと思っています。

最後までご覧いただき、ありがとうございます。
「Djangoの開発環境をDockerで構成してみる!」でした。

ABOUT ME
MSK
九州在住の組み込み系エンジニアです。 2児の父親でもあります。 数学やプログラミングが趣味です。 最近Webプログラミングと曲面結び目理論にはまっています。