Django + Dockerの構築から開発まで〜Docker構築編〜

#はじめに
自分の備忘録として、同じようなところで詰まっている人向けとして書こうと思いました。
開発はまだどんなアプリを作るかは漠然としかないのでこれからやっていきながらゆる〜く書いていきます。

#環境
・OS: Mac
・Docker Desktop
　　Docker version 20.10.7
　　docker-compose version 1.29.2
エディタはVScodeを使っています。

#環境構築
Dockerの構築こちらの記事を参考に作りました。
https://qiita.com/bakupen/items/f23ce3d2325b4491a2dd#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B


#詰まったところ
上記の環境構築のところで、エラーがいくつか出てきて解決したので書いておきます。

###1.Dockerfile
以下のコマンド

```
$ docker-compose run web django-admin.py startproject djangopj .
```

を打った時に、以下のエラーが出てきました。

```python:zsh
Traceback (most recent call last):
  File "compose/cli/main.py", line 81, in main
  File "compose/cli/main.py", line 203, in perform_command
  File "compose/metrics/decorator.py", line 18, in wrapper
  File "compose/cli/main.py", line 968, in run
  File "compose/cli/main.py", line 1426, in run_one_off_container
  File "compose/project.py", line 664, in up
  File "compose/service.py", line 364, in ensure_image_exists
  File "compose/service.py", line 1111, in build
  File "compose/service.py", line 1841, in build
compose.service.BuildError: (<Service: web>, {'message': 'dockerfile parse error line 1: FROM requires either one or three arguments'})

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "docker-compose", line 3, in <module>
  File "compose/cli/main.py", line 92, in main
TypeError: can only concatenate str (not "dict") to str
[89456] Failed to execute script docker-compose
```


####解決方法
Dockerfileの１行目の

```
FROM python:3
```

以降に空白が入っていたことが原因でした。
なので、Dockerfile・docker-compose.yml・requirements.txt全てを以下のように変更してもう一度

```
$ docker-compose run web django-admin.py startproject djangopj .
```

を実行するとできました。

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

```python:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: django-db
      MYSQL_USER: django
      MYSQL_PASSWORD: django
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8a000"
    depends_on:
      - db
```

```python:requirements.txt
Django==3.1
mysqlclient
```

###2.起動

最後にサービスを起動させようと、

```
$ docker-compose up -d
```

を打ったところ、

```
sample-pj_db_1 is up-to-date
Starting sample-pj_web_1 ... 
Starting sample-pj_web_1 ... error

ERROR: for sample-pj_web_1  Cannot start service web: driver failed programming external connectivity on endpoint sample-pj_web_1 (363f0e70a5a24e61cb50bd873c1f037dbb675f908f9f3ed530e5a348406a60fe): Bind for 0.0.0.0:8000 failed: port is already allocated

ERROR: for web  Cannot start service web: driver failed programming external connectivity on endpoint sample-pj_web_1 (363f0e70a5a24e61cb50bd873c1f037dbb675f908f9f3ed530e5a348406a60fe): Bind for 0.0.0.0:8000 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.
```

というエラーが出てきました。

####試したこと
```
$ sudo lsof -i:8000
```
を打つと何か出てきたので、

```
$ sudo kill 8000 
```
をしましたが、

```
kill: 8000: No such process
```
と出てきてできませんでした。

####解決方法
```
$ docker ps
```
を打つと、

```
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS                          PORTS                                       NAMES
034a983e91a4   mysql:5.7        "docker-entrypoint.s…"   22 minutes ago   Up 22 minutes                   3306/tcp, 33060/tcp                         sample-pj_db_1
373f2f6bfffc   restaurant_web   "python3 manage.py r…"   5 weeks ago      Up 4 weeks                      0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   restaurant_web_1
8e747bef142f   mysql:5.7        "docker-entrypoint.s…"   5 weeks ago      Restarting (1) 10 seconds ago                                               restaurant_web
```
と出てきたので、

```
$ docker stop 373f2f6bfffc
$ docker stop 8e747bef142f
```
をしてから、

```
$ docker-compose up -d
```
をすると、できました！
![スクリーンショット 2022-01-17 11.18.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2200261/0b7c3ef8-fe77-82a3-d3a2-d43920fbe1ba.png)

#おわり
今日はここまでとします。