docker-composeでdjango開発用の環境を構築したよ

こんにちは、kisseです。

やはり、開発環境はできるだけ綺麗に作りたいですよね。
Docker初心者はまだ抜け出せてないですが、かなり便利です。
普段使ってる開発には関係ないパッケージとか切り分けときたい時に、Docker便利なんじゃね??って思ってます。
今回はdocker-composeでdjango開発の環境をつくって行きましょう。



なぜdocker-compose?

今回作成する環境は以下を目標にします。

  • プロジェクトごとに必要なpipモジュールをインストールする
  • 起動は楽に
  • 最初は少し手間が発生しても構わない
  • djangoでAPI開発して、別のサービスで利用しやすいファイル構成にしておく
  • WindowsとMacの両方で同じ手順で開発できるようにする

プロジェクトごとに必要なpipモジュールをインストールするのは、まあ普通にやることですね。笑

起動は楽にしたいですね。
この前、Macの方にpyenvを入れたんですが、pyenv activateをしなきゃいけないのがめんどくさくて…。

一方、プロジェクトの開始は普通に手間をかけます。
基本的に1度しかやらないものを楽にしようとするのも無駄感ありますからね。

今回は、スマホのバックエンドや、フロントは別で作るタイプのプロジェクトを想定しています。
なので、フロント側を追加する際の負担がある程度少ないようにしておきます。

WindowsとMacの両方で同じ手順で開発できるようにするのは、大変重要ですね。
僕が所属している研究室のPCはWindowsなので、Macのみでしか動かせないような形式であると、
大学で作業をしようとしたときにMacbookを持っていかないといけなくなります。
ノートパソコンは本来持ち歩く用だとは思いますが、極力持ち運びたくないです。

以上の点は、わりとdocker-composeで解決することができます。

というわけで、docker-composeによる環境構築を進めていきましょう。

ファイル構成

今回のファイル構成は以下のような形式にしましょう。

  • api
    • Dockerfile
    • requirements.txt
  • docker-compose.yml

最小構成はこんな感じで、必要に応じてREADMEとか.gitignoreとかを追加していく感じでいきましょう。

では、最初はDockerfileから書いていきましょう。

 FROM python:3-alpine
 ENV PYTHONUNBUFFERED 1
 RUN mkdir /code
 WORKDIR /code
 ADD requirements.txt /code/
 RUN pip install -r requirements.txt
 ADD . /code/

次に、空のrequirements.txtを作っておきましょう。
これが無いと、pip install -r requirements.txtの時点で怒られて、イメージが作成されないので注意が必要です。

alpineというdocker向けの超軽量OSをイメージに利用します。
最近は、このalpineを使うようにタグで指定できる公式イメージがたくさんあるので、積極的に使って行こうと思います。
色々制約があり大変ですが、今後の流行りがこっちになることを見越して先手を打ってます。(対して先手になってないけど)

次にdocker-compose.ymlを記述します。

version: '3'

services:
  api:
    build: api/
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - ./api:/code
    ports:
      - "8000:8000"

簡単に説明します。
今回立ち上げるサービスはapiのみです。
それは、apiフォルダ以下のDockerfileでビルドして、フォルダ内のファイルをすべてコンテナの/code/以下に配置します。
コンテナとの通信のためのポートは8000を開けておいて、djangoの開発サーバーにコンテナ外から接続できるようにしました。

djangoのプロジェクトを作る

では、djangoのプロジェクトを作って行きます。
docker-compose up -dで起動します。
その後、docker-compose exec api /bin/shでコンテナに入りましょう。
このコマンドでは現在動いているapiサービスに対して/bin/shを実行するというものです。

コンテナに入ったら、pip install djangoでdjangoをインストールし、
pip freeze > requirements.txtでこのコンテナの中にあるpipモジュールのリストをrequirements.txtに書き出します。
このように、新規モジュールをインストールしたらrequirements.txtに書き出す作業をしましょう。
すると、docker-compose upの実行時に同じpipモジュールがインストールされている状態が作れます。

djangoをインストールしたら、次にdjangoプロジェクトを作成しましょう。
django-admin startproject [project name] [directory]でプロジェクトを作成できます。
今回はカレントディレクトリでsomeprojectというプロジェクトを作成します。
django-admin startproject someproject .を実行しましょう。

ここまでの手順で、一度コンテナに入ってしまえば普通の開発と同じようにプロジェクト構成の変更ができるようになりました。
この記事では、ここまでにします。

あとは、開発サーバーを動かしたければdocker-compose upで動くようになります。
止めるときは、ctrl + cか-dオプションをつけてバックグラウンドで実行した場合にはdocker-compose stopで止めることができます。



おわり

今回はdocker-composeで作るdjango開発環境を紹介しました。

API開発のためのサービスしか作ってないので、今後nginxのサービスとか、フロントエンドのサービスとか作っていこうと思います。
最後まで読んでいただきありがとうございます!

あわせて読みたい