Django Sprint #2 新規プロジェクトのスタート (Docker Toolbox向け)

この記事はDocker Toolbox (≒ Windows 10 Home) ユーザー向けです。Docker (Mac OS, Windows 10 Professional / Enterprise) ユーザーの方は[Django Sprint #2 新規プロジェクトのスタート](https://qiita.com/tmgauss/private/96c74381b52da4679d19)へ。

## 目次

1. [プロジェクトの作成](#プロジェクトの作成)
2. [ Gitによるバージョン管理](#gitによるバージョン管理)


## プロジェクトの作成

#### 作業用ディレクトリの作成
まず、作業用ディレクトリ（フォルダ）を作ります。適当な場所に各自作成してください。
本チュートリアルではルートディレクトリの下に「code」という名前のディレクトリを作成したとし、そのパスの表記を簡単にするために

```terminal:~/code/
PS C:XXX/YYY/code>
```
を単に

```terminal:
>
```

と書くことにします。

この時点で、エディタでこのディレクトリを開いておくことをおすすめします。

#### Djangoのインストール
さあいよいよ、Djangoをインストールしましょう！インストールは簡単な2ステップです。

1. ```Dockerfile```, ```docker-compose.yml```, ```requirements.txt``` を作成
2. ```docker-compose run```でプロジェクトを開始

まず、各種ファイルを作成します。もし、CUI上で作成するなら以下のようになりますが、Mac OSでのTerminalと違い、Windowsにはtouchコマンドが存在しないため、冗長になります。めんどくさい人は、codeディレクトリ直下に、```Dockerfile```, ```docker-compose.yml```, ```requirements.txt``` を右クリックなどで作成してください。

```terminal:
> New-Item -type file Dockerfile
> New-Item -type file docker-compose.yml
> New-Item -type file requirements.txt
```

これらをエディタ上で開き、中身を以下のように書き換えます。

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

```y:/docker-compose.yml
version: '3'

services:
  db:
    image: postgres
    environment:
      - POSTGRES_PASSWORD=somepassword
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
```

```txt:/requirements.txt
Django>=2.1,<2.2
psycopg2>=2.7,<3.0
```
次にターミナルに戻って、現在地が```code```であることを確認します。

```terminal
> pwd
Path
----
C:XXX\YYY\code
```
プロジェクトを開始します。

```
> docker-compose run web django-admin startproject config .
Starting code_db_1 ... done
```

これで「config」という名前のプロジェクトを作成しました。（configという名前の由来については追って説明します。他の名前でももちろん構いません。）ディレクトリ構造が以下のようになっているのを確認してください。

```
code
├─ requirements.txt
├─ manage.py
├─ config
│  ├─ __init__.py
│  ├─ settings.py
│  ├─ urls.py
│  └─ wsgi.py
├─ docker-compose.yml
└─ Dockerfile
```

#### データベースの設定
このsettings.pyを開いて、DBに関する記述を探し出してください。

```python:/config/settings.py
...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
...
```
この部分を以下のように書き換えます。

```python:/config/settings.py
...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
        'PASSWORD': 'somepassword',
    }
}
...
```
#### ALLOWED_HOSTSの設定
このsettings.pyを開いて、DBに関する記述を探し出してください。

```python:/config/settings.py
...
ALLOWED_HOSTS = []
...
```
この部分を以下のように書き換えます。

```python:/config/settings.py
...
ALLOWED_HOSTS = [
    "192.168.99.100",
]
...
```
#### サーバーを起動
最後に、コンテナを起動してWebサーバーとDBが繋がっているか確認します。

```terminal
> docker-compose up
```
として、

```
...
web_1  | Starting development server at http://0.0.0.0:8000/
web_1  | Quit the server with CONTROL-C.
```
もしくは、

```
...
web_1  | System check identified no issues (0 silenced).
web_1  |
web_1  | You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
web_1  | Run 'python manage.py migrate' to apply them.
web_1  | May 04, 2020 - 13:56:23
```
のように```exit(1)```しなければOKです！（Railsでいうところの```rails server```みたいのものです。）

**注意** : ```web_1  | Run 'python manage.py migrate' to apply them.```と出てくるかもしれませんが、```python manage.py migrate```は実行しないでください。あとで面倒なことになります。

ブラウザを起動して、http://192.168.99.100:8000 にアクセスして、以下の画面が表示されれば成功です。
**Microsoft Edgeでは表示されないので、必ずGoogle ChromeかFirefoxで確認してください。これ以降もこのプロジェクト内ではMicrosoft Edgeは使用せず、Google ChromeかFirefoxを利用してください。**
![django compose.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628276/e6d8fa91-4f3b-db08-43d0-3b4256e4c213.png)


### コンテナの扱い方
***以下は、今実行するものではありません。一通り読んで、理解してください。***

各種 Django のコマンドはこのように書き換えます。例えば、```django-admin startapp app```なら、

```terminal
> docker-compose run --rm web django-admin startapp app
```
```python3 manage.py migrate```なら、

```terminal
> docker-compose run --rm web python3 manage.py migrate
```
となります。```-rm```オプションをつけないとPCに使用済みコンテナが溢れ、容量を圧迫します。

その他のコマンドなどについては以下の記事を参考にしてください。

- [Django Sprint Appendix Docker周りのコマンドとエラー (Docker Toolbox向け)](https://qiita.com/Chrg/private/aed20b6f8138cd65880b)


## Gitによるバージョン管理
おおまかな手順は以下の通りです。

1. ```git init```でローカルレポジトリを作成
2. ```.gitignore```ファイルを作成
3. ```git add``` & ```git commit```
4. GitHub上にリモートレポジトリを作成
5. 1と2を関連づける
6. 現在の内容を```git push```する


#### ローカルリポジトリの設定
まず、```pwd```で所定の作業ディレクトリにいることを確認し、ローカルレポジトリを作成します。

```terminal
> pwd
----
C:XXX\YYY\code

> git init
Initialized empty Git repository in /code/.git/
```
もし、Gitの使用が初めてである場合は

```terminal
> git config --global user.name "XXXX"
> git config --global user.email xyz@example.com
```
のように、ユーザー名とメールアドレスを登録します。

次に、```.gitignore```を作成します。
```.gitignore```が何かについては、[こちら](https://techacademy.jp/magazine/10179)を参照してください。基本的には、バイナリファイルなどのほかの共同開発者と共有されるべきではないファイルを共有されないようにするためのものです。開発する言語、利用するライブラリ、フレームワークなどによって変わってきますが、このチュートリアル内では(≒Djangoでは)以下の内容を利用します。
**```.gitignore```を作成するタイミングは、リポジトリを作成するタイミングです。**リポジトリ作成時には必ず行ってください。それ以降は必要に応じて追記・削除していくといった運用方法です。

では、/code/直下に.gitignoreというファイルを作成し、以下の内容を書き込んで保存してください。

- [docker-django/blob/master/.gitignore](https://raw.githubusercontent.com/erroneousboat/docker-django/master/.gitignore)

ここまで出来たら、後のローカルでの作業はaddしてcommitするだけです。

```terminal
> git add -A
> git commit -m "Initialize repository"
[master (root-commit) f96ebdd] Initialize repository
 13 files changed, 241 insertions(+)
 create mode 100644 .idea/.gitignore
...
```
このようなGitコマンドについて分からなかった人は今一度[『サル先生のGit入門』](https://backlog.com/ja/git-tutorial/)を参照してください。


#### リモートレポジトリの設定
次に、GitHubのWebページに戻り、メニューバー右上の「+」ボタンをクリックすると「New repository」とあるのでそれをクリックします。すると、次のようなページに遷移します。

<img width="1280" alt="スクリーンショット 2020-04-29 9.13.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489338/376be060-a85f-6543-8a44-2e092fbd6a39.png">

- Repository name: レポジトリの名前です。プロジェクトの名前にしておけば大丈夫です。ここでは「django_sprint」としておきます。
- Description: レポジトリの説明を加えることができます。
- Public / Private: このプロジェクトのレポジトリを公開するか否かを選択できます。（ここは十分にチームで話し合って決めてください。）
- Initialize this repository with a README: チェックを外す
- Add .gitignore: None
- Add a license: None

ここまできたら「Create repository」をクリックしましょう！


#### ローカルとリモートを紐付ける
あとはローカルとリモートを結び付けて、pushするだけです。各自XXXXのところをGitHubのユーザー名に変更してください。

```terminal
> git remote add origin https://github.com/XXXX/django_sprint.git
> git push -u origin master
...
To https://github.com/XXXX/django_sprint.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
```
もう一度GitHubのページに戻り、上手くいったことを確認してください。
<img width="1280" alt="スクリーンショット 2020-04-29 9.27.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489338/281056aa-a907-2ab1-df03-3bb0bac731a1.png">

## 参照
### 次の記事
[Django Sprint #3 ユーザーモデルのカスタマイズ (Docker Toolbox向け)](https://qiita.com/Chrg/private/3dde9ee45623a1664734)

### 前の記事
[Django Sprint #1 環境構築 (Windows向け)](https://qiita.com/Chrg/private/e3a221966c7efa455e68)