Django приложение в Docker: запускаем по шагам
Узнайте, как запустить Django-приложение в Docker-контейнере. Настройка Dockerfile, docker-compose, зависимостей и запуск проекта.


Docker позволяет запускать Django-приложение в изолированном контейнере вместе со всеми необходимыми зависимостями. Это упрощает разработку, тестирование и CI/CD развёртывание проекта на сервере, а так же ручной перенос проекта на другую машину.
В этой статье разберём, простой пример начального уровня, как запустить Django-приложение в Docker-контейнере, создать Dockerfile, настроить docker-compose.yml на базе данных SQLite и выполнить базовые команды Django внутри контейнера.
Убедитесь, что у вас установлен докер при помощи следующих команд:
docker --version
docker compose versionкоманды проверки установленного Docker
Запускаем команду, которая сохранит необходимые библиотеки в файл requirements.txt.
pip freeze > requirements.txtкоманда сохранения зависимостей
Проверяем версию Python
Вводим в консоль команду, чтобы узнать какая версия питона используется в проекте.
python --versionкоманда, чтобы узнать версию питона
В корне проекта создайте файл Dockerfile.
FROM python:3.12-slim замените на версию вашего питона из шага выше
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
пример Dockerfile для Django
Чтобы не копировать ненужные файлы в Docker, создайте .dockerignore.
Особенно важно запретить копировать виртуальное окружение и файлы с конфиденциальными данными (пароли, API ключи и прочее)
.git
.gitignore
__pycache__
*.pyc
*.pyo
*.pyd
.pytest_cache
.venv
venv
env
.env
.idea
.vscodeпример .dockerignore файла
Если Django-приложению нужно несколько контейнеров, например Redis, Celery или база данных (не SQLite, а PostgreSQL), то удобно использовать Docker Compose, а не просто Dockerfile.
Создайте docker-compose.yml файл.
services:
web:
restart: always
build: .
ports:
- "8000:8000"
env_file:
- .env
пример docker-compose.yml файла
Здесь мы говорим что у нас будет 1 контейнер с названием web, при падении его нужно всегда включать снова (restart), при создании контейнер должен брать файлы рядом с собой (указываем точку), и наш сервис должен быть проброшен с 8000 порта в контейнере на 8000 порт на нашем компьютере, а так же должен брать переменные из файла .env, который лежит в проекте.
В профессиональной разработке неприемлемо хранить ключи и пароли в коде, для этого используется специальный файл .env , такой файл не отправляется в системы хранилища кода по типу git.
Найдите в файле settings.py переменные типа DEBUG, ALLOWED_HOSTS и SECRET_KEY и перенесите их в .env файл.
Для удобства работы с .env файлом, рекомендуется использовать библиотеку environs из этой статьи.
Выполнив шаги выше, мы готовы к запуску нам нужно ввести одну команду:
docker compose upкоманда запуска файла docker compose
После запуска такой команды, docker автоматически делает следующие шаги, указанные нами прежде в Dockerfile:
установка линукс образа с питоном из первой строки
Dockerfileназначение рабочей папки
/appкопирование
requirements.txtфайла с зависимостями (с названиями библиотек)установка зависимостей
копирование файлов внутрь контейнера
запуск команды для включения Django на порту 8000
Если все сделано верно Django сайт будет доступен по ссылке http://127.0.0.1:8000/, в зависимости от запущенного проекта вам потребуется открыть свой путь, если вы использовали проект из статьи, то путь будет такой http://127.0.0.1:8000/news/articles/.
Для входа в контейнер из папки где лежит docker-compose.yml мы можем ввести следующую команду:
docker compose exec web bashкоманда для входа в контейнер в Docker
Если мы хотим узнать ID или имя нашего контейнера с другой папки компьтера, требуется команда:
docker ps -aкоманда для просмотра контейнеров в Docker
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84e7164e9f09 folder-web "python manag..." 10 minutes ago Up 10 minutes 0.0.0.0:8000->8000/tcp folder-web-1отображение результата команды docker ps -a
Обнаружив имя нашего контейнера и ID, мы можем вбить команду
docker exec -it folder-web-1 bashкоманда для входа в контейнер в Docker
в команде docker exec -it можно использовать как ID, так и имя из столбца NAMES
Внутри контейнера можно смотреть файлы или выполнять иные команды, однако наши действия перезапишутся при пересоздании образа.
Для примера введем командуls для просмотра файлов в папке где мы находимся:
root@84e7164e9f09:/app# ls
Dockerfile db.sqlite3 docker-compose.yml main_app manage.py news requirements.txtкоманда для просмотра папок внутри Docker контейнера
Так же можем перейти в папку main_app введя cd main_app.
В конце можем выйти из контейнера командой exit.
Будьте внимательны, после удаления контейнера и/или образа, в зависимости от настроек данные могут быть утеряны навсегда.
Удалить контейнер мы можем командой:
docker compose downкоманда удаления Docker контейнера
При желании удалить и контейнер и образ, требуется команда:
docker compose down --rmi allкоманда удаления контейнера и образа в Docker
Выше мы рассмотрели пример начального уровня для настройки django в Docker.
В боевом режиме - когда ваш сайт доступен в интернете, требуются дополнительные шаги, чтобы избежать ошибок в работе и взлома.
По необходимости вы можете обратиться к программисту.
По необходимости вы можете обратиться за консультацией
Вам может быть интересно

Ваш первый сайт на Django: обзор фреймворка на Python

Django CBV: готовые классы на примере Generic Base View

Переменные окружения и секретные ключи в Python

Django CBV: CRUD с ListView, DetailView и другими Views

Почему сложно конвертировать Word 2003 с MathType в PDF
