В этом руководстве вы узнаете, как контейнеризировать веб-приложение
Django с помощью Docker, и поймете, почему это хорошая идея.
Инструменты, которые вам понадобятся
Чтобы следовать этому руководству, сначала убедитесь, что вы:
- Установите Docker Desktop и Docker Compose на свой компьютер.
- Используйте учетную запись Docker Hub для хранения образов Docker и доступа к ним.
- Убедитесь, что в вашей системе установлен Django.
Если вам нужна помощь с установкой, вы можете найти подробные инструкции на сайтах Docker и Django.
Как настроить ваш проект Django
Следующие шесть шагов включают фрагменты кода, которые помогут вам пройти через весь процесс.
Настройте свой проект Django
1. Инициализируйте проект Django.
Если у вас ещё нет настроенного проекта Django, вы можете создать его с помощью следующих команд:
django-admin startproject my_docker_django_app
cd my_docker_django_app
2. Создайте requirements.txt
файл.
В вашем проекте создайте requirements.txt
файл для хранения зависимостей:
pip freeze > requirements.txt
3. Обновите ключевые настройки среды.
Вам нужно изменить некоторые разделы в файле settings.py
так, чтобы их можно было задать с помощью переменных среды при запуске контейнера. Это позволит вам изменять эти настройки в зависимости от среды, в которой вы работаете.
# The secret key
SECRET_KEY = os.environ.get("SECRET_KEY")
DEBUG = bool(os.environ.get("DEBUG", default=0))
ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS","127.0.0.1").split(",")
Создайте Dockerfile
Dockerfile — это скрипт, который сообщает Docker, как создать образ Docker. Поместите его в корневой каталог вашего проекта Django. Вот базовая настройка Dockerfile для Django:
# Use the official Python runtime image
FROM python:3.13
# Create the app directory
RUN mkdir /app
# Set the working directory inside the container
WORKDIR /app
# Set environment variables
# Prevents Python from writing pyc files to disk
ENV PYTHONDONTWRITEBYTECODE=1
#Prevents Python from buffering stdout and stderr
ENV PYTHONUNBUFFERED=1
# Upgrade pip
RUN pip install --upgrade pip
# Copy the Django project and install dependencies
COPY requirements.txt /app/
# run this command to install all dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Copy the Django project to the container
COPY . /app/
# Expose the Django port
EXPOSE 8000
# Run Django’s development server
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Каждая строка в Dockerfile служит определенной цели:
FROM
: Выбирает изображение с нужной вам версией Python.WORKDIR
: Задает рабочий каталог приложения внутри контейнера.ENV
: Задает переменные среды, необходимые для сборки приложения.RUN
иCOPY
команды: Установите зависимости и скопируйте файлы проекта.EXPOSE
иCMD
: Предоставьте доступ к порту сервера Django и определите команду запуска.
Вы можете создать контейнер Django Docker с помощью следующей команды:
docker build -t django-docker .
Чтобы просмотреть свое изображение, вы можете запустить:
docker image list
Результат будет выглядеть примерно так:
REPOSITORY TAG IMAGE ID CREATED SIZE
django-docker latest ace73d650ac6 20 seconds ago 1.55GB
Хотя это отличное начало для контейнеризации приложения, вам нужно будет внести ряд улучшений, чтобы подготовить его к запуску.
- CMD
manage.py
предназначен только для разработки и должен быть заменён на сервер WSGI. - Уменьшите размер изображения, используя изображение меньшего размера.
- Оптимизируйте изображение с помощью многоступенчатого процесса сборки.
Давайте начнем с этих улучшений.
Обновление requirements.txt
Не забудьте добавить gunicorn
к requirements.txt
. Это должно выглядеть так:
asgiref==3.8.1
Django==5.1.3
sqlparse==0.5.2
gunicorn==23.0.0
psycopg2-binary==2.9.10
Внесите улучшения в файл Dockerfile
В приведенном ниже файле Dockerfile есть изменения, которые решают три проблемы из списка. Изменения в файле следующие:
- Обновлено изображение
FROM python:3.13
доFROM python:3.13-slim
. Это изменение значительно уменьшает размер изображения, так как теперь оно содержит только то, что необходимо для запуска приложения. - В Dockerfile добавлен многоэтапный процесс сборки. При сборке приложений в файловой системе обычно остается много файлов, которые нужны только во время сборки и не нужны после того, как приложение собрано и запущено. Добавив этап сборки, вы используете один образ для сборки приложения, а затем перемещаете собранные файлы во второй образ, оставляя только собранный код. Подробнее о многоэтапных сборках читайте в документации.
- Добавьте сервер Gunicorn WSGI на сервер, чтобы обеспечить готовность приложения к работе.
# Stage 1: Base build stage
FROM python:3.13-slim AS builder
# Create the app directory
RUN mkdir /app
# Set the working directory
WORKDIR /app
# Set environment variables to optimize Python
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# Upgrade pip and install dependencies
RUN pip install --upgrade pip
# Copy the requirements file first (better caching)
COPY requirements.txt /app/
# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Stage 2: Production stage
FROM python:3.13-slim
RUN useradd -m -r appuser && \
mkdir /app && \
chown -R appuser /app
# Copy the Python dependencies from the builder stage
COPY --from=builder /usr/local/lib/python3.13/site-packages/ /usr/local/lib/python3.13/site-packages/
COPY --from=builder /usr/local/bin/ /usr/local/bin/
# Set the working directory
WORKDIR /app
# Copy application code
COPY --chown=appuser:appuser . .
# Set environment variables to optimize Python
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# Switch to non-root user
USER appuser
# Expose the application port
EXPOSE 8000
# Start the application using Gunicorn
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "3", "my_docker_django_app.wsgi:application"]
Снова создайте образ контейнера Docker.
docker build -t django-docker .
После внесения этих изменений мы можем снова запустить docker image list
:
REPOSITORY TAG IMAGE ID CREATED SIZE
django-docker latest 3c62f2376c2c 6 seconds ago 299MB
Вы можете видеть значительное улучшение размеров контейнера.
Размер был уменьшен с 1,6 ГБ до 299 МБ, что позволяет ускорить процесс развёртывания при загрузке изображений и сократить расходы на хранение изображений.
Вы можете использовать docker init
в качестве команды для создания Dockerfile и compose.yml
-файла для вашего приложения, чтобы начать работу.
Настройте файл Docker Compose
Файл compose.yml
позволяет управлять приложениями с несколькими контейнерами. Здесь мы определим контейнер Django и контейнер базы данных PostgreSQL.
Файл compose использует файл среды с именем .env
, который позволяет легко отделить настройки от кода приложения. Перечисленные здесь переменные среды являются стандартными для большинства приложений:
services:
db:
image: postgres:17
environment:
POSTGRES_DB: ${DATABASE_NAME}
POSTGRES_USER: ${DATABASE_USERNAME}
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
env_file:
- .env
django-web:
build: .
container_name: django-docker
ports:
- "8000:8000"
depends_on:
- db
environment:
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY}
DEBUG: ${DEBUG}
DJANGO_LOGLEVEL: ${DJANGO_LOGLEVEL}
DJANGO_ALLOWED_HOSTS: ${DJANGO_ALLOWED_HOSTS}
DATABASE_ENGINE: ${DATABASE_ENGINE}
DATABASE_NAME: ${DATABASE_NAME}
DATABASE_USERNAME: ${DATABASE_USERNAME}
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
DATABASE_HOST: ${DATABASE_HOST}
DATABASE_PORT: ${DATABASE_PORT}
env_file:
- .env
volumes:
postgres_data:
И пример .env
файла:
DJANGO_SECRET_KEY=your_secret_key
DEBUG=True
DJANGO_LOGLEVEL=info
DJANGO_ALLOWED_HOSTS=localhost
DATABASE_ENGINE=postgresql_psycopg2
DATABASE_NAME=dockerdjango
DATABASE_USERNAME=dbuser
DATABASE_PASSWORD=dbpassword
DATABASE_HOST=db
DATABASE_PORT=5432
Шаг 4: Обновите настройки Django и файлы конфигурации
1. Настройте параметры базы данных.
Обновление settings.py
для использования PostgreSQL:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.{}'.format(
os.getenv('DATABASE_ENGINE', 'sqlite3')
),
'NAME': os.getenv('DATABASE_NAME', 'polls'),
'USER': os.getenv('DATABASE_USERNAME', 'myprojectuser'),
'PASSWORD': os.getenv('DATABASE_PASSWORD', 'password'),
'HOST': os.getenv('DATABASE_HOST', '127.0.0.1'),
'PORT': os.getenv('DATABASE_PORT', 5432),
}
}
2. Установите ALLOWED_HOSTS
для чтения из файлов среды.
В settings.py
установите ALLOWED_HOSTS
значение:
# 'DJANGO_ALLOWED_HOSTS' should be a single string of hosts with a , between each.
# For example: 'DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1,[::1]'
ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS","127.0.0.1").split(",")
3. Установите SECRET_KEY
для чтения из файлов среды.
В settings.py
установите SECRET_KEY
значение:
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY")
4. Установите DEBUG
для чтения из файлов среды.
В settings.py
установите DEBUG
значение:
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = bool(os.environ.get("DEBUG", default=0))
Создайте и запустите свой новый проект Django
Чтобы создать и запустить свои контейнеры, выполните:
docker compose up --build
Эта команда загрузит все необходимые образы Docker, соберёт проект и запустит контейнеры. После завершения работы ваше приложение Django должно быть доступно по адресу http://localhost:8000
.
Протестируйте ваше приложение и получите доступ к нему
Как только приложение запустится, вы можете протестировать его, перейдя по адресу http://localhost:8000
. Вы увидите страницу приветствия Django, которая указывает на то, что ваше приложение работает. Чтобы проверить подключение к базе данных, попробуйте выполнить миграцию:
docker compose run django-web python manage.py migrate