Dockerで始めるDjango生活(1日目)

### 初めに
DjangoとはPythonベースのフレームワークです。
今回はdockerを用いていきたいと思います。
OSはWindows 10を想定しています。
dockerが使えればOSは特に関係無いかと思います。
### 目次
1. 環境を整える
  1. dockerのイメージをプルしてくる
  2. プルしてきたイメージを元にコンテナを作成する
  3. コンテナに入りpythonやdjangoをインストールする
2. プロジェクトを作成してみる
  1. プロジェクトを作成する
  2. プロジェクトの中身を見る
  3. プロジェクトを動かしてみる
  4. サーバーを起動してみる
3. 最後に

## 1. 環境を整える
まずは、入門するために開発環境を整えていこうと思います。

### 1. dockerのイメージをプルしてくる
まずはcmdを開きます。
今回開発したいフォルダを作成します。今回はCドライブ配下のデスクトップ上のdjangoフォルダで開発を行いたいと思います。

```
> cd C:\Users\USER-NAME\Desktop
> mkdir django
> cd django
```
今回の開発ではubuntuの最新版を用いようと思います。

```
> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

> docker pull ubuntu:latest

> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              f643c72bc252        16 hours ago        72.9MB
```

### 2. プルしてきたイメージを元にコンテナを作成する
1で作成したイメージを元にコンテナを作成します。

```
> docker run --name django-ubuntu -p 127.0.0.1:8000:8000 -v %cd%:/root -u 0 -itd f643c72bc252 /bin/sh
```

オプションの説明をします。

```
--name <NAME> ・・・ コンテナの名前をNAMEに設定する。
-p <ポート>:<コンテナのポート> ・・・ コンテナのポートをポートに割り当てる。
-v <フォルダ>:<コンテナのフォルダ> ・・・ フォルダにコンテナのフォルダをマウントする。(%cd%はcmdで現在のディレクトリを指す)
-u 0 ・・・ コンテナにrootユーザーとしてログインする。
-itd ・・・ /bin/shを疑似端末に割り当ててバックグラウンドで実行状態にする。
f643c72bc252 ・・・ イメージのID(docker imagesで表示されたIMAGE IDの値)
```
作成されたコンテナを確認します。

```
> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
c9b27b34be02        f643c72bc252        "/bin/sh"           51 seconds ago      Up 48 seconds       0.0.0.0:8000->8000/tcp   django-ubuntu
```

### 3. コンテナに入りpythonやdjangoをインストールする
まずはコンテナに入ってみます。

```
docker exec -it c9b27b34be02 /bin/sh
```
ここでc9b27b34be02はdockerpsで表示されたCONTAINER IDの値です。
それではpythonがコンテナ内に存在しているかを確認しようと思います。

```
# python3 -V
/bin/sh: 2: python3: not found
#
```
ここでなぜ「python」ではなくて「python3」かと言うとubuntuの設定で元から入っているpythonと競合を起こして最悪の場合ubuntu自体を壊してしまうかもしれないからです。(今回のイメージの様に入っていない場合もあります。)
それではインストールしていこうと思います。

```
# apt-get update // apt-getの最新化
・・・
# apt-get install -y python3 // python3のインストール -yで聞かれる選択肢を全てyesで返してくれます
・・・
# python3 -V
Python 3.8.5
#
```
これでpythonがインストールされました。
試しに計算してみようと思います。

```
# python3
Python 3.8.5 (default, Jul 28 2020, 12:59:40)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+1
2
>>> 2*2
4
>>> 4-2
2
>>> 2/2
1.0
>>>
#
```
次にpythonのパッケージを管理するpipをインストールする。

```
# apt-get install -y python3-pip
・・・
# pip3 -V
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
#
```
djangoをインストールする

```
# pip3 install django
```
以上でインストールができました。

## 2. プロジェクトを作成してみる
### 1. プロジェクトを作成する
開発したいディレクトリに遷移します。
今回だとdjangoフォルダとマウントした/root配下に作成する。

```
# cd root
# mkdir projects
# cd projects
# mkdir myproject
# cd myproject
# pwd
/root/projects/myproject
# django-admin.py startproject myproject
# ls
myproject
```
それでは作成されたmyprojectの中身を見てみます。

### 2. プロジェクトの中身を見る

```
# tree myproject
myproject
|-- manage.py
`-- myproject
    |-- __init__.py
    |-- asgi.py
    |-- settings.py
    |-- urls.py
    `-- wsgi.py

1 directory, 6 files
#
```
#### manage.py
プロジェクトを操作するためのファイルです。
特に触る必要はありません。
#### myproject
これはプロジェクトのディレクトリです。
#### __init__.py
myprojectディレクトリをPythonモジュールとして扱うようにpythonに指示する空ファイルです。
#### asgi.py
非同期Webサーバーおよびアプリケーションの新しいPython標準であるASGIとしてプロジェクトを実行するためのファイルです。
#### settings.py
プロジェクトの設定と構成を示し、初期のデフォルト設定が含まれています。
#### urls.py
ルーティングを行うファイルです。
#### wsgi.py
プロジェクトをWSGIとして実行するためのファイルです。
### 3. プロジェクトを動かしてみる
まずはマイグレーションを行います。

```
# cd myproject
# ls
manage.py  myproject
# python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
#
```
マイグレーションを行うと下記の様にいくつかフォルダが作成されます。(__pycache__はキャッシュ)

```
# tree myproject
myproject
|-- db.sqlite3
|-- manage.py
`-- myproject
    |-- __init__.py
    |-- __pycache__
    |   |-- __init__.cpython-38.pyc
    |   |-- settings.cpython-38.pyc
    |   `-- urls.cpython-38.pyc
    |-- asgi.py
    |-- settings.py
    |-- urls.py
    `-- wsgi.py

2 directories, 10 files
#
```
#### db.sqlite3
djangoではデフォルトでDBがsqliteに設定されています。
マイグレーションを行う事でsqliteの設定が行われます。
### 4.サーバーを起動してみる
いよいよサーバーが起動できるようになったので起動してみます。

```
# pwd
/root/projects/myproject/myproject
# ls
db.sqlite3  manage.py  myproject
# python3 manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
November 26, 2020 - 16:25:28
Django version 3.1.3, using settings 'myproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```
## 3.最後に
http://127.0.0.1:8000/
に遷移してみて以下の画像の様にdjangoのwelcome画面が表示されれば正しくdjangoを設定することができています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895676/f6f62421-c26a-0d23-61c8-d5b938851388.png)
お疲れ様でした！
今後も連載していこうと思います。