🐕

Djangoプロジェクトで設定しておくべきこと (2) docker

2021/09/30に公開

この記事は以下の記事の続きです。

https://zenn.dev/masa0317/articles/f669633636997c

今回はDockerを使ってDjangoプロジェクトの設定をします。

1. dockerを使う理由

Djangoを使ったWEBアプリケーションの開発環境は

dockerコンテナ

で作成します。

本番環境でコンテナを利用しない場合でも、開発環境はコンテナを使った方が良いです。

理由は

  • チーム全員の開発環境が同じになる
  • プロジェクトjoin時や、パソコン変更時の環境構築コストが減る

からです。

うちはK8SやECSを導入するつもりはないからdockerは必要ない。

のではなく、

  • 問題が起きても、チーム全員の環境が同じなので原因の特定がしやすい
  • 情報の共有ができる

等、効率的な情報共有のために環境を揃えるべきです。

特に今後は、オンラインでの作業がメインになっていくはずです。

情報を共有しやすい環境を整えるということは大切なスキルになってくると思います。

1-1. docker

では、Djangoの開発環境をdockerで作成していきます。

プロジェクトrootにdockerフォルダを配置して、子階層にdevelopmentフォルダとDockerfileを作成します。

|--docker
|  |--development
|  |  |--Dockerfile

Dockerfileにコードを書きます。

FROM python:3.9.1-buster as builder

# Default to UTF-8 file.encoding
ENV LANG C.UTF-8

# app directory
RUN mkdir -p /usr/src/app

COPY ./requirements/development.txt /usr/src/app
WORKDIR /usr/src/app/
RUN pip install -r development.txt

COPY . /usr/src/app

EXPOSE 5000

pythonのバージョンは3.9系を利用していますが、これはこの記事を記載している時点で3.10の正式リリースがまだだからです。

そのうち変更します。

requirementsフォルダは設定ファイルを格納するフォルダです。
このフォルダの中に

  • development.txt
  • production.txt

のように環境に応じた設定ファイルを配置します。

portは5000を指定します。

1-2. docker-compose

Djangoの開発環境に

  • データベースサーバー
  • メールサーバー

を追加します。

データベースとメールサーバーは、どんなシステムでもほぼ100%必要になる環境なので

docker-compose

を使って環境を構築します。

プロジェクトrootフォルダ配下にdocker-compose.ymlを作成します。

|--docker-compose.yml

docker-compose.ymlにコードを書きます。

version: '3.6'
services:
  django_template:
    build:
      context: .
      dockerfile: ./docker/development/Dockerfile
    image: django_template
    container_name: django_template
    tty: true
    volumes:
      - .:/usr/src/app/
    ports:
      - "9026:5000"
    depends_on:
      - django_template-db
    env_file:
      - .env

  django_template-db:
    build:
      context: .
      dockerfile: ./docker/mysql/Dockerfile
    image: django_template-db
    container_name: django_template-db
    tty: true
    environment:
      MYSQL_USER: masa
      MYSQL_PASSWORD: masa
      MYSQL_DATABASE: masa_production
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ".docker/mysql:/home"
    ports:
      - 3317:3306

  django_template-mailserver:
    image: mailhog/mailhog:latest
    container_name: django_template-mailserver
    ports:
      - 8025:8025

django_template-dbがmysqlサーバーでdjango_template-mailserverがメールサーバーです。

mysqlとメールサーバーもホストから確認できるようしているのは、

  • ブラウザからテストメールを確認する
  • ローカルのツールでmysqlに接続する

ためです。

こうすることで、開発効率が高くなると思います。

また、この記事ではmysqlサーバーもデフォルト設定でなく、別にdockerファイルを用意してcnfファイルを用意しています。

開発環境でDBの細かい設定まで必要としない場合は、

image: mysql:5.7

としてしまっても良いと思います。

mysqlのversionを8以上にすると、少し設定を変更する必要がありますが、こちらはDjangoの設定とはまた別の範囲になるのでここでは説明を省きます。

ここまで記載したら後はコマンドを実行します。

docker-compose up

全てのコンテナが立ち上がれば成功です。

1-3. ドキュメント

docker-composeの立ち上げに成功したらドキュメントを作成します。

これは初回の記事で説明したように

ドキュメントを見て5分で開発環境が構築できる

対応になります。

せっかく環境を構築したのにドキュメントがないと、生産性と再現性に問題が生じてしまいます。

README.mdに

  • ビルド方法
  • 開発環境コンテナに入る方法

を記載しましょう。

ドキュメントは最低限の情報だけ簡潔に記載します。
ダラダラと長文で記載すると誰も読まなくなります。

ドキュメントの記載が終われば

  • 誰でもドキュメントを見て5分で開発環境が作成できる

のタスクが完了です。

次の記事ではvscodeを連携させて、さらに便利なDjango環境構築を作る方法を説明します。

Discussion