Docker 上で Django アプリを動かす

記事
IT・テクノロジー

Docker 上で Django アプリを動かす

Docker 上で Django のアプリを動かす一番シンプルな方法を紹介します。一応、データベースは、標準設定の SQLite ではなく、PostgreSQL を利用するようにしています。

今回紹介する内容

今回は簡単にするために以下の条件で Docker 上に実装します。

* 開発用のサーバーを利用
* データベースに「PostgreSQL」を利用
* Django アプリはデモ用(テンプレート)
Web サーバーとデータベースの2つのイメージを利用して Django のアプリを動かします。設定には、「django-compose」を利用します。

Docker Compose の準備

Docker はインストールされているという前提で、ここでは、「docker-compose」をインストールする方法を紹介します。 インテルベースのシステムの場合、特に問題はないのですが、今回、M1 Mac 上で動作している仮想マシーンの Linux(Ubuntu ARM64 版)でインストールをしようとしたところ、うまく行きませんでした。

最終的にインストールする方法として、「pip3」を使うとうまく行くことがわかりました。 (*)インテルベースの場合は、インターネットに資料がたくさんあるのでここでは ARM64 ベースの場合を紹介しています。

user@ubuntu:~/Documents/blog/docker-django-sample$ sudo pip3 install docker-compose
インストールは以上で完了です。 インストールが正常に行われたかを確認するため、以下のコマンドを実行して確認してください。

user@ubuntu:~/Documents/blog/docker-django-sample$ sudo docker-compose --version
docker-compose version 1.29.2, build unknown

Docker を使うためのファイルの設定

Docker と docker-compose の設定はそれぞれ、「Dokcerfile」と「docker-compose.yml」で行います。 Dockerfile は、Docker の設定のためのファイルで、必要なファイルを準備したり、フォルダの指定を行います。

Dockerfile
# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
docker-compose.yml
今回はシンプルな構成で Django アプリを動かしているので、設定は Web サーバーとデータベースの設定のみです。 データベースには「PostgreSQL」のイメージを利用しています。データベースのパスや、データベースのユーザー、データベース名、データベースのユーザーのパスワードなどを設定します。 Web サーバーは今回は、開発ようのサーバーを利用しています。基本的にコードの場所を指定して、開発用のサーバーを起動しています。

version: "3.9"

services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=db_postgres
      - POSTGRES_USER=user_postgres
      - POSTGRES_PASSWORD=password_postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
requirements.txt
Docker に Django のアプリで利用するパッケージの情報を記述したファイルです。 このファイルの情報を元に必要な Python パッケージをインストールしています。

Django==3.2.2
psycopg2-binary>=2.8

Django プロジェクトの作成

Django のプロジェクトを作成します。

user@ubuntu:~/Documents/blog/docker-django-sample$ sudo docker-compose run web django-admin startproject docker_django_sample .
管理者の権限で実行しているので、ファイルの所有者の変更をしておきます。

user@ubuntu:~/Documents/blog/docker-django-sample$ sudo chown -R $USER:$USER .
settings.py の変更
アクセスを許可するサーバーの IP アドレスと、docker-compose.yml で設定したデータベース情報にデフォルト設定を置き換えます。

ALLOWED_HOSTS = ['0.0.0.0']
....
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'db_postgres',
        'USER': 'user_postgres',
        'PASSWORD': 'password_postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
あとは、イメージを起動すれば Django のデモ用のアプリが Docker のイメージで可動します。

user@ubuntu:~/Documents/blog/docker-django-sample$ sudo docker-compose up -d
Creating network "docker-django-sample_default" with the default driver
Creating docker-django-sample_db_1 ... done
Creating docker-django-sample_web_1 ... done

ブラウザで、「0.0.0.0:8000」にアクセスするとデモの画面が表示されます。

user@ubuntu:~/Documents/blog/docker-django-sample$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-django-sample_web latest 413a147229da 10 minutes ago 982MB
postgres latest 9b18ef67a7a8 20 hours ago 300MB

Docker の2つのイメージが作成されていることが確認できます。

まとめ

Django のアプリを2つの Docker イメージを利用して動かしています。

Django のアプリのイメージ
PostgreSQL のイメージ
Dockerfile は、Docker に設定するファイルやフォルダの設定を記述してイメージを準備します。docker-compose.yml は、複数の Docker のイメージの設定を記述します。

Django の操作は、Docker のイメージ上の操作になるので、docker-compose を通して行います。

通所の、Django の操作に比べるとひと手間多い感じですが、慣れてしまえばほぼ同じ容量で開発できます。むしろ、別に、サーバーを準備しないで住む分開発や機能検証が簡単になります。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す