既存のDjangoプロジェクトをDockerに移行する

今回初めてWebサービス作成にDockerを使ったので、自分用のメモとして記事に残そうと思います。 また、プロジェクトはフロントエンドとバックエンドが分かれていることを前提とし、この記事ではバックエンド部分をDocker化していきます。

バージョン

  • python: 3.8.0
  • Django: 3.0.2
  • Docker: 19.03.5

プロジェクト構成

以下のようなプロジェクト構成とします。 これにDockerfileとdocker-compose.ymlを加えていきます。

.
├── Pipfile
├── Pipfile.lock
├── backend
│   ├── config
│   │   ├── __init__.py
│   │   ├── asgi.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── db.sqlite3
│   ├── manage.py
│   └── myapp
│       ├── __init__.py
│       ├── admin.py
│       ├── apps.py
│       ├── migrations
│       │   ├── 0001_initial.py
│       │   └── __init__.py
│       ├── models.py
│       ├── serializer.py
│       ├── tests.py
│       ├── urls.py
│       └── views.py
└── frontend
    └── src

frontendやDB部分は別記事にします。

Dockerfile

では始めにDockerfileを作っていきます。

以下のファイルをbackend/Dockerfileに記載していきます。

FROM python:3.8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /server
COPY Pipfile Pipfile.lock /server/
RUN pip install pipenv && pipenv install --system
COPY ./backend/ /server
  • FROM DockerHubなどのリポジトリに存在するイメージを取得
  • ENV PYTHONDONTWRITEBYTECODE 1 .pycファイルの生成を無効する環境変数の設定
  • ENV PYTHONUNBUFFERED 1 stdout/stderrのバッファリングを無効化する環境変数の設定
  • WORKDIR コンテナ内の作業場所を指定
  • COPY ホスト上のソースをコンテナ内にコピー
  • RUN コンテナ内で実行するコマンドを設定

docker-compose

続いてdocker-composeを作成します。

docker-composeはホストOS上で複数のコンテナを同時に管理します。

version: '3.7'

services:
  api:
    build:
        context: ./
        dockerfile: ./backend/Dockerfile
    command: python /server/manage.py runserver 0.0.0.0:8000
    volumes:
    - ./backend:/server
    ports:
    - 8000:8000
  • version docker-composeの使用するバージョンを指定します
  • build ビルドコンテキストへのパスを含む文字列として指定できます。
  • context 上記のbuildではパスのみでしたが、パス以外を指定する場合に今回のようにbuildの下に記載します。contextはパスの指定。
  • dockerfile dockerfileの指定します。。
  • command 実行するコマンドを指定します。
  • volumes ホスト上のリソースをコンテナ内にマウントします。
  • ports ポート番号を指定します。

注意点

DockerfileのCOPYにファイルパスを指定しますが、 backendディレクトリ内には無いためエラーとなってしまいます。

これを防ぐためにdocker-compose.ymlのcontextでbuildパスを指定する必要があります。

起動・停止

起動

docker-compose up -d

-dオプションはコンテナをバックグラウンドで起動します。

停止

docker-compose stop

コンテナを停止します。

コンテナの破棄

docker-compose down

以上で、dockerでの開発環境(とりあえずbackendのみ)が整いました。