Visual Studio CodeとDockerを用いてDjangoの開発環境をサクっと構築する。

本記事を真似して環境構築を行うと5分あればDjangoの開発環境を構築できる。
Djangoが使用されているWEBサイトには以下のものがあります。

* Pinterest
* ワシントンポスト
* NASA
* [udemy] (https://www.udemy.com/ja/)

## 対象者
* 簡単にプログラミングを始めたい方
* PythonでWEBアプリを作りたい方
* Dockerでの開発環境を構築に興味がある方

## 開発環境
* macbook 12inch 
* macOS Mojave バージョン10.14.4
* VisualStudio Code（以下、VSCodeで略す） バージョン1.34.0
* Docker Desktop for Mac

![スクリーンショット 2019-05-23 3.09.26](https://tech.yellowrange.net/wp-content/uploads/2019/07/573f5343b6fce86d9faaac428a8a3f0f.png)￼

![スクリーンショット 2019-07-29 15.04.10](https://tech.yellowrange.net/wp-content/uploads/2019/07/e6ea6ecb58a3830d6b56aab45e8dfd1d.png)￼

## 前提条件
* VSCode バージョン1.34.0をインストールしておく
    * 拡張機能「Docker」をインストールしておく
* Docker Desktop for Macをインストールしておく

## 任意のフォルダに3ファイルを用意する
ここではDockerフォルダを用意してその中に以下の3ファイルを作成する。
1. requirements.txt
2. Dockerfile
3. docker-compose.yml

![スクリーンショット 2019-07-29 15.32.57](https://tech.yellowrange.net/wp-content/uploads/2019/07/8396c3ae6b16fcb2c88e9953b46596fe.png)￼

### requirements.txtを編集する
```
Django==2.2.3
psycopg2
psycopg2-binary
```
 
### Dockerfileを編集する
```
FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
```

### docker-compose.ymlを編集する
```
version: "3"

services:
  db:
    container_name: postgres-django
    image: postgres:11
    volumes:
      - ./data/postgres:/var/lib/postgresql
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DATABASE=django
      - POSTGRES_USER=django
      - POSTGRES_PASSWORD=django
  web:
    container_name: django
    build: .
    volumes:
      - ./data/django:/code
    tty: true
    ports:
      - 8000:8000
    depends_on:
      - db
```

## Dockerフォルダ上で右クリックして「ターミナル」をクリックする
![スクリーンショット 2019-07-29 15.35.19](https://tech.yellowrange.net/wp-content/uploads/2019/07/cc569926ab3d8ffb143be9e08db966df.png)￼

VSCodeの右下あたりにターミナルが起動する。
![スクリーンショット 2019-07-29 16.17.11](https://tech.yellowrange.net/wp-content/uploads/2019/07/ae8bbb466c484758c0a62720cc4ee3f1.png)￼

### docker-composeからDocker Containerを作成する。
ターミナル上で下記のコマンドを実行する。

```
// -dオプションを付加するとデーモン（サービス）として起動できる
docker-compose up -d
```

以下のようなコマンドがダダダダと流れる。
![スクリーンショット 2019-07-29 15.47.06](https://tech.yellowrange.net/wp-content/uploads/2019/07/880f76278094668817caa983c9b03ae9.png)￼

VSCodeのDocker拡張機能をみるとContainerが2つできていることが確認できる。
1. docker_web
2. postgres:11

![スクリーンショット 2019-07-29 15.51.17](https://tech.yellowrange.net/wp-content/uploads/2019/07/f3f0087e74d97276f54d57a39d12dfcc.png)￼

### Djangoのプロジェクトとしてhogeプロジェクトを作成する
なにはともあれプロジェクトを作成しないと始まらないのでhogeプロジェクトを作成する。

Containers欄からWeb(Django)を選択して右クリック「Attach Shell」をクリックする。
新たなターミナルが表示される。
![スクリーンショット 2019-07-29 18.34.42](https://tech.yellowrange.net/wp-content/uploads/2019/07/9b1432f773408aa72dfec9baa9e1231b.png)￼

そのターミナルにて下記のコマンドを実行する。

```
// django-admin startproject プロジェクト名　でプロジェクトを作成する
django-admin startproject hoge
```

hogeプロジェクトが作成され以下のような構造となる。
![スクリーンショット 2019-07-29 18.53.58](https://tech.yellowrange.net/wp-content/uploads/2019/07/ce7f6dd56258db2af512d2c1e7f62190.png)￼


### settings.pyの設定
* DATABASE設定をpostgresqlに切り替える。

```
// 変更前
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

// 変更後
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': 'db',
    }
}
```

* ALLOWED_HOSTSを設定する。

```
// 変更前
ALLOWED_HOSTS = []

// 変更後
ALLOWED_HOSTS = ['*']
```

## Djangoプロジェクトの起動
ターミナルにて以下のコマンドを実行してブラウザでlocalhost:8000でアクセスする。

```
python hoge/manage.py runserver 0.0.0.0:8000
```

ロケット画面が表示されればOK

### あとがき
* DjangoのDATABASE設定を手動で切り替えているのでちょっと微妙
    * 切り替え後のdocker imageを作成した上で構築する
    * DATABASE設定をdocker側にもっていく（いけるのかわからないw）
* docker execを使用する記事をよく見かけるがわかりづらいので（私だけでしょうか・・・）Django側にて操作することにしています。