Help us understand the problem. What is going on with this article?

Djangoの開発環境をDockerで作ってみた

More than 1 year has passed since last update.

pythonを使用した開発環境はpipenvやvenvなどを使用すれば簡単に構築できますが、
今回はDockerを使って、Ubuntu上にdjangoの開発環境を作ってみようと思います。

前提

Dockerはインストール済み、Dockerのコマンドは使用経験があると想定して、それらの説明は省きます。

環境

  • Ubuntu 18.04
  • python 3.6.5
  • django 2.0.7

構築

ディレクトリ構成

構築前のディレクトリ構成は以下のようにします。

.
├── Dockerfile
├── requirements.txt
└── src    # ソース用のディレクトリ

srcディレクトリはコンテナにマウントさせてホストと共有します。

Dockerfileの作成

pythonはDocker Hubにオフィシャルのものがありますが、今回はあえてUbuntu上に作成するためpipのインストールなどが必要になります。
以下のDockerfileの例では基本的なことしか行っていませんので、必要があれば足してください。

example
FROM ubuntu:18.04
RUN apt-get -y update \
    && apt-get -y upgrade \
    && apt-get install -y locales curl python3-distutils \
    && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
    && python3 get-pip.py \
    && pip install -U pip \
    && mkdir /code \
    && rm -rf /var/lib/apt/lists/* \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG en_US.utf8
WORKDIR /code
ADD requirements.txt /code
RUN pip install -r requirements.txt    # requirements.txtからパッケージのインストール

requirements.txtの作成

djangoの開発に必要なパッケージをrequirements.txtに書きます。
また、requirements.txtはDockerfileと同じディレクトリに配置してください。

requirements.txt
django

イメージの作成

では、作成したDockerfileとrequirements.txtを基にイメージをビルドしていきしょう。
イメージ名はdjangoとします。

$ docker build -t django .

イメージの作成が終わったら、ちゃんとイメージができたか確認します。

$ docker images

REPOSITORY    TAG         IMAGE ID     CREATED       SIZE
django        latest      xxxxxxxxx    xxxxxxx       xxxx

REPOSITORYの項目にdjangoという表示があれば成功です。
もしnoneだったり、ビルドの段階でエラーが起こったらDockerfileを見直して修正してください。

コンテナの起動

作成したdjangoイメージをもとにコンテナを作成して起動させてみましょう。
djangoの開発用のサーバを動かすのを想定して、オプション-pを使用してホストの8000番からコンテナの8000番へポートフォワーディングするようにします。
そしてホストとコンテナでsrcディレクトリを共有させたいので、オプション-vを使用してマウントさせます。
作成するコンテナの名前はtestとします。

$ docker run -itd -p 127.0.0.1:8000:8000 -v /path/to/src:/code --name test django

では、コンテナがちゃんと作成されて起動しているか確認します。

$ docker ps

CONTAINER ID        IMAGE       COMMAND       CREATED       STATUS           ls   PORTS                     NAMES
xxxxxxxxxxxx        django     "/bin/bash"    xxxxxxxxx     Up xxxxxx       127.0.0.1:8000->8000/tcp        test

djangoプロジェクトの作成

普通にプロジェクトを作成すると以下のような構成になってしますので、プロジェクトをsrcディレクトリに展開されるようにします。

src
└── project
    ├── manage.py
    └── project
        ├── __init__.py

プロジェクト名はdjango-testとでもしましょう。

$ cd src
$ docker exec test django-admin startproject django-test .

末尾のドットは忘れないようにしましょう。
ドットをつけることで上記のような入れ子構造になるのを防ぎます。

プロジェクトが作成できたら以下のような構成になります。

src
├── manage.py
└── django-test
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   └── settings.cpython-36.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

djangoアプリの作成

todoというアプリを作成します。

$ pwd
/path/to/src

$ docker exec test python3 manage.py startapp todo

これで一通り開発環境が出来上がりました。
最終的なディレクトリ構成は以下のようになります。

.
├── Dockerfile
├── requirements.txt
└── src
    ├── manage.py
    ├── todo
    │   ├── admin.py
    │   ├── apps.py
    │   ├── __init__.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    └── django-test
        ├── __init__.py
        ├── __pycache__
        │   ├── __init__.cpython-36.pyc
        │   └── settings.cpython-36.pyc
        ├── settings.py
        ├── urls.py
        └── wsgi.py

開発用サーバを起動

最後にdjangoの開発用のサーバを起動させてみましょう。

$ docker exec test python3 manage.py runserver 0.0.0.0:8000

ブラウザでlocalhost:8000にアクセスしてみてください。
以下のような表示が出てくると思います。
Screenshot from 2018-07-16 21-58-27.png

これで、djangoの開発環境は整いました。
お疲れ様でしたw

参考

homines22
Network programmingやインフラ(サーバー・ネットワーク)などに興味があります。 最近はAWSを使ってサービス開発しています。 よく使う言語はC / Python / TypeScriptです。
hands-lab
ハンズラボは小売業特化型ITソリューション企業です。数十万に及ぶ膨大な商品マスタを扱ってきた豊富なノウハウで、お客様の現場に最適なシステムを提案・開発します。 エンジニア募集中
https://www.hands-lab.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした