Перейти к содержимому
Главная страница » Деплой Django приложения в docker: шаг за шагом

Деплой Django приложения в docker: шаг за шагом

В этом руководстве вы узнаете, как контейнеризировать веб-приложение 
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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *