カタカタジムを開発してます。タカモリです。 今日はDjango(Python)の環境を構築していきます。

Pythonは初心者です!笑

環境

. MacOs BIg Sur(11.5.2) . Docker 20.10.8 . mysql 8.0.26 . python 3.9.6 . Django 3.2

作業ディレクトリを作成

好きな場所に作業をする為のディレクトリを作成してください。

$ mkdir djangoapp

このディレクトリ内にファイルを作成していきます。

djangoapp
- Dokerfile
- docker-compose.yml
- reuirements.txt

requirements.txtは、pythonのパッケージをpipで管理している場合に、このファイルに書かれているパッケージが一括でインストールされるようです。 なお、 reuirements.txtという名前は強制ではないようです。 以下のDockerfileでpipで一括管理するファイルでrequirements.txtを指定してますね。

Dockerfile

FROM python:3.9.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip3 install -r requirements.txt
ADD . /code/

docker-compose.yml

version: '3'

services:
  db:
    image: mysql:8.0.26
    environment:
      MYSQL_DATABASE: django_db
      MYSQL_PASSWORD: password
      MYSQL_ALLOW_EMPTY_PASSWORD: ‘yes’
    ports:
      - "3306:3306"
    volumes:
      - ./data:/var/lib/mysql

  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

volumes:
  data:

requirements.txt

今回はmysqlを使用するので、mysqlclientをインストールしてきます。

Django>=3.2
mysqlclient==2.0.3

ビルドしていきます!

docker-compose build

無事にビルドが終われば、Djungoをインストールしてきます。 今回は「myapp」という名前で作成します。

docker-compose run web django-admin startproject myapp .

無事にインストールができたら、dataとmyappディレクトリが作業ディレクトリに追加されています。 そして、myapp内の設定ファイルを変更していきます。

# myapp/settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

上の記述を以下に変更していきます。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_db',
        'USER': 'root',
        'HOST': 'db',
        'PORT': 3306
}

これで終わりなのですが、このまま一括でコンテナを起動したいところなのですが

docker-compose up -d

で起動すると僕はエラーが発生しました。

django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")

dbはあるはずなのですが、これは立ち上がりの順序が関係してそうです。

docker-compose.ymlでコンテナの立ち上がりの順番については

depends_on:
      - db

で指定しているはずなのですが、この記述では立ち上がったことを待つという動作はしてくれないようです。なのでちょっとブサイクですが、一個一個立ち上げていきます。

docker-compose up -d db
docker-compose up -d web

一つづつコンテナを起動させることで、エラーを解消できました。

スクリーンショット 2021-10-18 11.22.11.png