Django3.2(python)+MySQLをDockerで環境構築する
カタカタジムを開発してます。タカモリです。 今日は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
一つづつコンテナを起動させることで、エラーを解消できました。
タカモリ
機械学習のイメージの方がありますよね! pythonでできたWEBサービスって代表作はなんだろう?とふと思いました!
退会ユーザー
pythonを使ってWebアプリ作るイメージってあんまりなかったわ。