だれでもdocker-composeで楽々Django(Python)環境構築(DBなし)

##Docker環境作成用のディレクトリ内構成

```
docker-django -- Dockerfile
              |
              -- requirements.txt
              |
              -- docker-compose.yml
              |
              -- pythonProject(中身空のディレクトリを作成しておく)
```

それでは、requirements.txtを作成します。こちらは、djangoで使用するパッケージを記述していきます。

##requirements.txt

```:requirements.txt
Django==2.2
```

Djangoフレームワーク(バージョン2.1.1)を指定しています。DB関係のパッケージをインストールしたい場合こちらで記述します。

##Dockerfile

```:Dockerfile
FROM python:3.7
ENV PYTHONUNBUFFERED 1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
```

- <b>FROM</b> [ベースイメージの設定(今回はPython)](https://qiita.com/tanan/items/e79a5dc1b54ca830ac21)
- <b>ENV</b> 環境変数の設定[(コンソールのstdout（標準出力）とstderr（標準エラー出力）のバッファーを無効にする設定)](https://hodalog.com/run-django-app-using-docker-compose/)
- <b>WORKDIR</b> [コマンドのcd(移動) + ディレクトリ作成をしてくれる](https://qiita.com/c18t/items/f3a911ef01f124071c95)
- <b>COPY</b> [requirements.txtを/code/にコピー](https://qiita.com/YumaInaura/items/1647e509f83462a37494)
- <b>RUN</b> コマンド実行　pip install -r requirements.txtは<b>rオプション</b>でファイルの中身のパッケージをまとめてインストールしてくれます。[pipはPythonのパッケージ管理ツール](https://www.sejuku.net/blog/50417)

##docker-compose.yml

```:docker-compose.yml
version: "3"

services:
  python37:
    build: .
    volumes:
      - ./pythonProject/:/code
    tty: true
    ports:
      - 8000:8000
```

- <b>volumns</b> ファイル同期(マウント)
- <b>tty</b> [起動したコンテナを起動しっぱなしにできる](https://qiita.com/sekitaka_1214/items/2af73d5dc56c6af8a167)
- <b>ports</b>ホストOSからコンテナへポートフォワード(あらかじめ指定したコンテナのポート番号へホストOSのポート番号に届いたパケットを届ける)

<b>◆注意点◆</b>
PHPの経験がある人は、環境構築の際に/var/wwwの場所にコードを配置したと思いますが、PythonコードをWebサーバーのドキュメントルート下に置いてしまうと、他人がWebを通して、コードを読めるようになってしまうため、安全性に欠けてしまいます。そのため、今回はcode下に置いています。[コードの置き場所参考記事](https://docs.djangoproject.com/ja/2.2/intro/tutorial01/)

##docker compose up -d
[docker-compose.ymlに記述しているすべてのサービスを起動します](https://qiita.com/nikadon/items/995c5705ff1171f7484d)

```:コマンド
docker compose up -d
```

完了したら、コマンド打ってコンテナが作成されているか確認してみましょう。できてたら環境構築終わり

```:コマンド
$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                        NAMES
33378ade007f        dockerdjango_python37   "python3"                15 minutes ago      Up 12 minutes       0.0.0.0:8000->8000/tcp                       dockerdjango_python37_1
```

##Djangoで初期画面を表示する

[Djangoでいうアプリケーションとプロジェクトの違い](http://farewell-work.hatenablog.com/entry/2017/05/07/160359)
- <b>アプリケーション</b> 処理を行う
- <b>プロジェクト</b> 設定記述・アプリケーションを配下にもつ

```コマンド
$ docker-compose exec python37 bash
```

###Djangoプロジェクト作成
コンテナ内に入れましたら、プロジェクトを作成します。

```:コマンド
root@bc8400473a8a:/code# django-admin startproject djangoProject .
```

[最後に.(ドットをつけるのは、階層を深くしたくないからそうしています)(今回プロジェクト名 = djangoProject)](https://qiita.com/homines22/items/2730d26e932554b6fb58#django%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)

###Djangoアプリ作成
プロジェクトと同階層でアプリを作成します。(アプリ名 = sampleApp)

```:コマンド
root@bc8400473a8a:/code# python manage.py startapp sampleApp
```

###Django初期画面表示
Djangoでは、公開するホストを指定する必要があります。djangoProject下にあるsettings.pyを編集します。

```settings.py
ALLOWED_HOSTS = ['192.168.99.100']
```

今回は、Dockerを使用していて、192.168.99.100(デフォルトのものを指定)

それではdjangoの開発用のサーバを起動します。

```コマンド(コンテナ内)
root@bc8400473a8a:/code# python manage.py runserver 0.0.0.0:8000
```

http://192.168.99.100:8000/
にアクセスできて、画面が表示されれば完了です。おめでとうございます！


<img width="958" alt="Screenshot_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325600/828dac6e-2e8b-abc1-2fe8-e0dc27ca2f41.png">