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

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](https://qiita-image-store.s3.amazonaws.com/0/173064/b77df2e0-2397-3b2b-b808-53a1fd70cd57.png)


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

#参考
- [Quickstart: Compose and Django | Docker Documentation](https://docs.docker.com/compose/django/)