目次

27 Docker Djnago

Docker でJango環境を作ってみる。

pipでのインストールは、01 Django install です。

1 ファイル用意

Dockerfile

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

requirements.txt

Django>=4.2
mysqlclient==1.4.6
djangorestframework==3.14.0
django-cors-headers==4.3.1

docker-compose.yml

version: '3'
services:
 django:
   container_name: "django"
   build: .
   command: python3 manage.py runserver 0.0.0.0:8000
   working_dir: /code
   ports:
     - 8000:8000
   volumes:
     - .:/code
   depends_on:
     - db
   environment:
     - CHOKIDAR_USEPOLLING=true
 db:
   container_name: "db"
   image: mysql:8.0
   restart: always
   environment:
     MYSQL_DATABASE: "db"
     MYSQL_ROOT_PASSWORD: 'password'
   volumes:
     - ./mysql:/var/lib/mysql
   ports:
     - 3306:3306

※CHOKIDAR_USEPOLLING=Trueを入れておくと、編集するとホットリロードしてくれる。

Let's Encryptリバースプロキシを利用する場合のdocker-compose.yml

25 Let's Encrypt リバースプロキシで、SSL化して利用する場合

docker-compose.yml

version: '3'
services:
 django:
   container_name: "django"
   build: .
   command: python3 manage.py runserver 0.0.0.0:8000
   working_dir: /code
   #ports:
   #  - 8000:8000
   volumes:
     - .:/code
   depends_on:
     - db
   environment:
     - CHOKIDAR_USEPOLLING=true
     - VIRTUAL_HOST=django.fl8.jp
     - LETSENCRYPT_HOST=django.fl8.jp
   networks:
     - app_proxy-tier
     - default
 db:
   container_name: "db"
   image: mysql:8.0
   restart: always
   environment:
     MYSQL_DATABASE: "db"
     MYSQL_ROOT_PASSWORD: 'password'
   volumes:
     - ./mysql:/var/lib/mysql
   ports:
     - 3306:3306
networks:
  app_proxy-tier:
    external: true

2 build

docker-compose build

3 Jangoプロジェクト作成

※[プロジェクト名]の後ろのドットが重要

docker-compose run django django-admin startproject [プロジェクト名] .

例:

docker-compose run django django-admin startproject testproject .

プロジェクト作成後

[プロジェクト名]/settings.pyに下記を追加

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'db',
    'USER': 'root',
    'PASSWORD': 'password',
    'HOST': 'db',
    'POST': 3306,
    'OPTIONS': {
      'charset': 'utf8mb4'
    }
  }
}

4 起動

docker-compose up -d

ALLOWED_HOSTS追加

この画面が出るので、ALLOWED_HOSTSにホスト名を追加

testproject/setting.py

ALLOWED_HOSTS = ['django.fl8.jp']

or

ALLOWED_HOSTS = ['{IP}']

5 確認

ブラウザで http://[IP]:8000 をアクセス

6 自動起動

再起動後の自動起動は、/etc/rc.localを使うのが良いかも

Docker iptablesの話

/etc/rc.local

#!/bin/sh

sleep 5
iptables -I DOCKER-USER -p tcp --dport 3306 -d 0.0.0.0/0 -d 172.23.0.2 -j DROP
iptables -I DOCKER-USER -p tcp --dport 3306 -s 172.23.0.3 -d 172.23.0.2  -j ACCEPT
iptables -I DOCKER-USER -p tcp --dport 3306 -s 192.168.10.10 -d 172.23.0.2 -j ACCEPT

docker start django