💻

Django4.2 コンテナ環境構築

2023/12/10に公開

概要

Django4.2 コンテナ環境構築に関する手順やメモ
環境:windows11(wsl2+ubuntu)
コンテナ構成:Django + MySQL

ファイル構成(今回作成するもの)

$ tree -aL 2 django-env/
django-env/
├── .env
├── Dockerfile
├── docker-compose.yml
├── manage.py
├── myblog
│   ├── __init__.py
│   ├── __pycache__
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── requirements.txt

手順

docker 初期導入手順

# install
sudo apt-get update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# iptables-nft -> iptables-legacy 切り替え(WSL2 + Ubuntu22.04のみ)
sudo update-alternatives --config iptables

# sudo 権限なしで dockerコマンド
sudo usermod -aG docker $USER
# セッションリフレッシュ
exec su -1 $USER

# 失敗したとき用
# docker compose で完全削除
docker-compose down --rmi all --volumes --remove-orphans

Djangoコンテナ設定

作業ディレクトリの作成

mkdir django-env ; cd django-env

Dockerファイル作成

cat <<EOF > Dockerfile
FROM python:3.12
USER root

ENV PYTHONUNBUFFERED 1

RUN mkdir /code
WORKDIR /code

RUN apt-get update \
    && apt-get -y install locales \
    && localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN pip install --upgrade pip \
    && pip install --upgrade setuptools

COPY requirements.txt /code/
RUN pip install -r ./requirements.txt

COPY . /code/
EOF

requirements.txt作成

cat <<EOF > requirements.txt
Django~=4.2
psycopg2~=2.9
python-environ
mysqlclient~=2.1.0
EOF

env作成

cat <<EOF > .env
DJANGO_DB_HOST=db
DJANGO_DB_PORT=3306
DJANGO_DB_NAME=myblog_db
DJANGO_DB_USER=myblog_user
DJANGO_DB_PASSWORD=myblog_password
DJANGO_DB_ROOT_PASSWORD=root_password
EOF

docker-compose.yml作成

cat <<'EOF' > docker-compose.yml
version: '3'

services:
  db:
    image: mysql:latest
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    ports:
      - '3306:3306'
    environment:
      TZ: Asia/Tokyo
      MYSQL_ROOT_PASSWORD: '${DJANGO_DB_ROOT_PASSWORD}'
      MYSQL_DATABASE: '${DJANGO_DB_NAME}'
      MYSQL_USER: '${DJANGO_DB_USER}'
      MYSQL_PASSWORD: '${DJANGO_DB_PASSWORD}'
    volumes:
      - /var/lib/mysql
    env_file:
      - ./.env

  web:
    build: .
    command: "python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/code
      - /etc/passwd:/etc/passwd:ro
      - /etc/group:/etc/group:ro
    ports:
      - "8000:8000"
    depends_on:
      - db
    env_file:
      - ./.env
EOF

Djangoプロジェクトの初期化

docker compose run -u (id -u $USER) web django-admin startproject myblog .

Django 設定

下記を追記(追記箇所は良しなにお願いします。)

emacs myblog/settings.py
---
import os
import environ

# .env読み込み
env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env'))

ALLOWD_HOSTS = ['*']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': env('DJANGO_DB_HOST'),
        'PORT': env('DJANGO_DB_PORT', default='3306'),
        'NAME': env('DJANGO_DB_NAME'),
        'USER': env('DJANGO_DB_USER'),
        'PASSWORD': env('DJANGO_DB_PASSWORD'),
    }
}
---

DB立ち上げ&DB初期化

docker compose up db -d
docker compose run -u $(id -u $USER) web python manage.py migrate

コンテナ起動

docker compose up -d

管理ユーザの設定

docker compose exec -u $(id -u $USER) web python manage.py createsuperuser
---
Username: admin
Password: **********
Password (again): *********
Superuser created successfully.
---

確認

下記確認できれば完了です。

Discussion