Зі зростанням популярності контейнеризації у веб-розробці, Docker став незамінним інструментом для розробників. Docker дозволяє безперешкодно керувати залежностями та середовищами, що дає можливість розробникам зосередитися на написанні коду. У цій статті ми покажемо вам, як налаштувати середовище розробки Django за допомогою Docker.
Передумови
Перед початком переконайтеся, що на вашій системі встановлені наступні інструменти:
-
Docker: Відвідайте офіційний веб-сайт Docker, щоб завантажити та встановити Docker Desktop.
- Docker Compose: Зазвичай включено в Docker Desktop, встановіть окремо, якщо його немає.
Спочатку створимо папку для нашого проєкту та налаштуємо структуру для проєкту:
/app
/docker # # папка для налаштувань docker
nginx.conf # конфігураційний файл для nginx
python.Dockerfile # dockerfile для python
/pgdata # папка для postgres volume, порожня папка
/src # папка, де буде розміщено код вашого сайту
.env # конфігураційні значення для проекту
docker-compose.yml # файл конфігурації docker з сервісами
requirements.txt # пакети, які потрібні для проекту
Крок 1: Налаштування Docker середовища для Python
Створення .env файла з основними налаштуваннями проекта
# .env
DOCKER_HTTP_PORT=80 # стандартний порт для http
DOCKER_HTTPS_PORT=443 # стандартний порт для https
DJANGO_PROJECT_NAME=project # назва проекту, при потребі можна змінювати
NGINX_CONF_PATH='./docker/nginx.conf' # шлях до конфігураційного файлу nginx
# Доступ до бази даних
DB_USER= # назва користувача бази даних
DB_PASSWORD= # пароль для користувача бази даних
DB_DATABASE= # назва бази даних
DB_HOST=postgres # назва сервісу в docker-compose.yml
DB_PORT=5432 # стандартний порт для postgres
ADMINER_DB_PORT=8081 # порт для веб доступу до postgre адмін панелі
У папці docker вашого проєкту створіть файл під назвою python.Dockerfile. Цей файл визначає конфігурацію для нашого Docker контейнера. Додайте наступний вміст до вашого python.dockerfile:
# /docker/python.Dockerfile
FROM python:3.12-alpine
ENV PYTHONUNBUFFED 1
ENV PYTHONDONTWRITEBYTECODE 1
RUN apk upgrade && apk update \
&& apk add gcc python3-dev musl-dev \
jpeg-dev gettext zlib-dev py3-setuptools \
mariadb-connector-c-dev mariadb-dev
RUN apk del libressl
RUN apk add openssl
RUN apk fix
#libressl-dev
RUN apk add libffi-dev cargo
RUN mkdir /app
WORKDIR /app
COPY ./src /app
COPY ./requirements.txt /app/requirements.txt
# Install any required dependencies
RUN pip install --upgrade pip && pip install -r requirements.txt
# Expose port 8000 for Gunicorn
EXPOSE 8000
Цей python.dockerfile створює Docker контейнер з Python 3.12 та встановлює необхідні залежності для запуску проєкту Django.
Створіть файл requirements.txt і добавте пакети для проекту
# requirements.txt
Django
gunicorn
psycopg2-binary
Крок 2: Налаштування Docker середовища для Nginx
У папці docker створіть файл nginx.conf та вставте наступну конфігурацію сервера Nginx:
# /docker/nginx.conf
# Define the upstream server (Gunicorn)
upstream web {
server web:8000;
}
server {
listen 80;
server_name localhost;
client_max_body_size 50M;
client_body_buffer_size 50M;
location /static/ {
alias /static/;
expires 30d;
}
location /media/ {
alias /media/;
expires 30d;
}
location / {
proxy_pass http://web; # назва нашого сервісу в docker-compose.yml
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Крок 3: Створення файлу Docker Compose
У кореневій папці вашого проєкту створіть файл docker-compose.yml. Цей файл дозволяє нам визначати та керувати Docker додатками з кількома контейнерами. Вставте наступний вміст:
# docker-compose.yml
services:
web:
build:
context: .
dockerfile: ./docker/python.Dockerfile
command: gunicorn ${DJANGO_PROJECT_NAME}.wsgi:application --bind 0.0.0.0:8000
volumes:
- ./src:/app:delegated
expose:
- 8000
env_file:
- .env
restart: always
nginx:
image: nginx:latest
volumes:
- ${NGINX_CONF_PATH}:/etc/nginx/conf.d/default.conf
- ./src/static:/static:delegated
- ./src/media:/media:delegated
ports:
- "${DOCKER_HTTP_PORT}:80"
- "${DOCKER_HTTPS_PORT}:443"
env_file:
- .env
restart: always
depends_on:
- web
postgres:
image: postgres
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_DB=${DB_DATABASE}
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
adminer:
image: adminer
restart: always
ports:
- ${ADMINER_DB_PORT}:8080
volumes:
pgdata:
Цей `docker-compose.yml` файл створює три сервіси: один для Python (Django), один для PostgreSQL і один для Nginx. Він також визначає Docker мережу, яку використовують ці сервіси для спілкування.
Крок 4: Збірка Docker контейнерів
Тепер ми готові зібрати наші Docker контейнери. З кореневої папки вашого Django проєкту виконайте наступну команду:
docker compose build
Крок 5: Створення нового проєкту Django
Нам потрібно створити новий проєкт Django. Перейдіть до директорії, де ви бажаєте створити ваш проєкт, та виконайте наступну команду:
docker compose run --rm web django-admin startproject project .
Якщо вам потрібно виконати команди керування Django, ви можете використовувати:
docker compose run --rm web python manage.py
Запуск Docker контейнерів
docker compose up -d
Можна перевірити чи доступний проект. Якщо DOCKER_HTTP_PORT не 80, то вкінці потрібно дописати номер порту:
6. Налаштування Django проекту
Додавання STATIC_ROOT для статичних файлів в проекті і налаштування доступу до бази даних в файлі settings.py:
# /src/project/settings.py
import os
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': os.environ.get('DB_HOST'),
'PORT': os.environ.get('DB_PORT'),
'NAME': os.environ.get('DB_DATABASE'),
'USER': os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASSWORD'),
}
}
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
7. Виконання стандартних міграцій бази даних для проекту
docker compose run --rm web python manage.py migrate
Перезапуск проекту
docker compose up -d --build
Створення користувача для адмін панелі:
docker compose run --rm web python manage.py createsuperuser
Після цього можна перевірити доступ до адмін панелі Django:
8. Обробка статичних файлів
Додайте рядки для ENTRYPOINT у python.Dockerfile, який виконує команду для статичних файлів:
# /docker/python.Dockerfile
COPY ./docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Створюємо файл entrypoint.sh в папці docker з наступним вмістом:
#!/bin/sh
python manage.py collectstatic --noinput
exec "$@"
Перезапуск проекту
docker compose up -d --build
Або як альтернативу можна запустити наступну команду:
docker compose run --rm web python manage.py collectstatic
Доступ до повного проекту
Щоб отримати повний проект, відвідайте GitHub репозиторій