Включите исполнение JavaScript в браузере, чтобы запустить приложение.
25 мар 2025

Создание и запуск Python-приложений в Docker

Как создать скрипт/приложение на Python, поместить его в контейнер Docker и запустить (и для чего это вообще делать)? Предлагаем пошаговую инструкцию с примерами кода.

Что такое Docker и как он работает с Python?

Docker — контейнеризатор приложений. Он нужен, чтобы быстрее выкладывать и разворачивать приложения. Больше не нужно тратить время на бутстрэппинг (начальную загрузку) проекта: не придется согласовывать версии, настраивать зависимости и конфигурацию.

Почему это важно? На крупных проектах со временем появляется дерево зависимостей. Может возникнуть ситуация, когда у одного программиста все работает, а у другого после запуска скрипта в консоль падает куча ошибок. «У меня на машине работало. Нужно настроить окружение на твоей!» — может развести руками первый разработчик. На решение проблемы может уйти несколько дней. Docker решает проблему бутстрэппинга, обеспечивая почти тривиальную портируемость докеризованных приложений на Python и не только.

Почему стоит использовать Docker для Python-приложений?

Докер можно назвать едва ли не единственным способом «заморозить» библиотеки зависимостей проектов на Javascript, Python, PHP, Ruby. Docker позволяет получить неизменный артефакт (один файл). Далее его можно поочередно запустить на машине программиста, в облаке или даже на проде — и быть уверенными, что все будет работать корректно. 

Docker — «кирпичик», на основе которого строятся сложные ИТ-инфраструктуры. Для управления образами Докер-контейнеров на крупных проектах используют специальные решения, например, Software Repository for Container (SWR) от команды СберТех. Инструмент предоставляет хранение образов, ускоренную загрузку P2P, удобную консоль для управления полным жизненным циклом образов контейнеров и другие преимущества.

Для работы нужен минимальный набор инструментов:

  • Docker Desktop (для Windows, MacOS) или Docker и Docker Compose (для Linux);
  • среда разработки GigaIDE Desktop.

Все инструменты можно скачать и использовать бесплатно. 

Установка Docker и настройка окружения для Python

Скачать Докер можно с сайта docker.com. 

Главная страница Docker для скачивания на ПК
Главная страница Docker для скачивания на ПК

Пошаговая инструкция:

  1. Зайти на сайт docker.com. Нажать «Download Docker Desktop» и выбрать операционную систему. К примеру, Windows.
  2. Скачать загрузочный файл .exe и запустить установку. 
  3. Дождаться, чтобы install завершился. Нажать «Close and Restart», чтобы перезапустить устройство.
Процесс установки Docker
Процесс установки Docker

На рабочем столе появляется иконка для запуска «Докера». Далее необходимо пройти регистрацию с указанием адреса почты, логина и пароля на app.docker.com. Это нужно для работы с Docker Desktop.

Запуск Docker
Запуск Docker

В IDE можно поставить плагин, чтобы запускать работу «Докера» одной командой — например, docker run GitVerseFile.

Дополнительное преимущество среды разработки GigaIDE Desktop — поддержка плагинов для Docker. Сам плагин устанавливается в пару кликов (Tools Integration).

Docker для создания образа в GigaIDE Desktop
Docker для создания образа в GigaIDE Desktop

В разделе Marketplace можно найти плагины, нужные в ежедневной работе.

Плагины в GigaIDE Desktop
Плагины в GigaIDE Desktop
Плагины для Пайтона в GigaIDE Desktop
Плагины для Пайтона в GigaIDE Desktop

Как Docker работает с фреймворками Python (Django, Flask)

Необходимо создать простой проект, в котором будет несколько файлов. Для удобства работы используем GigaIDE Desktop:

  • main.py — файл с кодом приложения на язык программирования Python (основное Flask-приложение);
  • Dockerfile — файл для создания Docker-образа;
  • requirements.txt — файл с зависимостями Python;
  • README.md — классический ридми-файл с инструкциями по установке и запуску приложения на Python (его опустим в этой инструкции, т.к. не влияет на функциональность).
Структура проекта на Python в Docker
Структура проекта на Python в Docker

Файл main.py с основным Flask-приложением

В main.py написана логика приложения на языке программирования Python. В нашем примере она простая — вывести фразу Hello from GitVerse! на 5000-м порту. Сам код выглядит таким образом:

from flask import Flask
app = Flask(__name__)
# Основной маршрут для отображения текста "Hello from GitVerse!"
@app.route('/')
def hello():
    return "Hello from GitVerse!"
# Запуск приложения на 5000 порту
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
py
Файл main.py Python и Docker
Файл main.py Python и Docker

GigaIDE Desktop поддерживает работу с Python, а также другими языками программирования. На скриншоте среда разработки показывает, что можно выставить настройки для Python Interpreter.

Dockerfile — файл для создания Docker-образа

Dockerfile для создания Docker-образа — это список инструкций, необходимых для сборки образа. Сборщик «Докера» обрабатывает Dockerfile и генерирует нужный образ.

Ниже код с пояснениями, какая инструкция для чего используется:

# Используем Python 3.11 на базе Alpine
FROM python:3.11-alpine
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем файл requirements.txt в рабочую директорию
COPY requirements.txt .
# Устанавливаем зависимости из файла requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# Копируем остальные файлы приложения в контейнер
COPY . .
# Открываем порт 5000
EXPOSE 5000
# Устанавливаем переменные окружения для Flask
ENV FLASK_APP=main.py
ENV FLASK_RUN_HOST=0.0.0.0
# Команда для запуска Flask-приложения
CMD ["flask", "run"]
py
Dockerfile для создания образа
Dockerfile для создания образа

requirements.txt — файл с зависимостями Python

В requirements.txt прописываются зависимости. Приложение, которое выводит фразу: Hello from GitVerse! на 5000-м порту, содержит простую логику. Поэтому и файл с зависимостями Python содержит буквально две строчки:

Flask==2.1.0
Werkzeug==2.1.0
py
Файл requirements.txt в GigaIDE Desktop
Файл requirements.txt в GigaIDE Desktop

Flask — это фреймворк для создания веб-приложений на Python. В примере используем Фласк, хотя могли аналогично подключить Django. 

Werkzeug — это набор библиотек для создания WSGI-совместимых (WSGI — Web Server Gateway Interface) веб-приложений на Python. Функциональность — обработка исключений, мидлвари (Middleware), обработка запросов и ответов. Werkzeug предоставляет разработчику набор утилит для создания приложения на Python, которое может взаимодействовать с сервером WSGI — к примеру, с Gunicorn.

Приложение на Python из примера выше простое. Но программист может добавить нужные модули (pip install python-dotenv — RUN pip install requests beautifulsoup4 python-dotenv). Но их также стоит добавлять через requirements.txt.

В примере использован pip-менеджер по умолчанию. Но возможны и другие способы установить зависимости: например, через Pipenv package manager или Poetry package manager).

Создание Docker-образа для Python-приложения

В инструкции выше рассматривали, как создается образ в Docker. Он содержит набор инструкций по сборке для определенного сервиса. 

Проверить образ в локальном хранилище можно с помощью команды:

docker images

Образ Docker — это только читаемый стек, состоящий из разных слоев. Инструкции в Докерфайл выполняются поочередно (и от того, в какой очереди они написаны, может зависеть производительность — об этом ниже).

Запуск Python-приложения в контейнере Docker

В пошаговой инструкции выше подготовили проект и файлы для запуска в контейнере Docker. Теперь осталось выполнить несколько простых действий:

  1. Собрать Docker-образ (build).
  2. Запустить контейнер после успешной сборки Docker-образа (run).
  3. Посмотреть логи (состояние, logs).
  4. Открыть в браузере на выставленном в настройках порту и увидеть фразу: Hello from GitVerse!.

Для сборки Docker-образа в каталоге проекта необходимо выполнить команду:

docker build -t flask-app-alpine .

В терминале можно увидеть, как по шагам выполняются команды, указанные в Dockerfile: сначала FROM python:3.11-alpine, затем установка рабочей директории WORKDIR /app и так далее. По результату появляется сообщение Successfully built (успешно собран).

Сборка Докер-образа в терминале
Сборка Докер-образа в терминале

Когда образ был успешно собран, необходимо запустить контейнер. Для этого используется команда:

docker run --name=flask-app-alpine -d -p 5000:5000 flask-app-alpine

Запуск контейнера в терминале
Запуск контейнера в терминале

Далее можно посмотреть логи (состояние контейнера). Для этого используется команда:

docker logs flask-app-alpine

Появляется список сведений: про окружение, debug mode, порты и т.д.

Состояние контейнера в терминале
Состояние контейнера в терминале

Все работает так, как и ожидалось. Теперь осталось открыть приложение в браузере (Safari, Google Chrome, Opera или любой другой) и перейти по адресу, на котором открыт порт. В настройках проекта это http://localhost:5000. Приложение открывается на локалхосте в соответствии с той логикой, которая ожидается.

Запуск приложения на localhost
Запуск приложения на localhost

Таким образом, в пошаговой инструкции собрали проект, запустили Docker-образ и проверили, что все работает. 

Чтобы писать код было проще, использовали GigaIDE Desktop (также доступна облачная версия). Отечественная среда разработки поддерживает Python и предоставляет все необходимые для кодинга инструменты и настройки.

Настройки IDE для кодинга на Питоне
Настройки IDE для кодинга на Питоне

«Из коробки» в GigaIDE Desktop доступен умный AI-ассистент GigaCode. Он умеет писать тесты, генерировать документацию, объяснять код и делать многое другое. Например, можно использовать команду /explain main.py:

AI-ассистент GigaCode объясняет код на Питоне
AI-ассистент GigaCode объясняет код на Питоне

Умный помощник объяснит, что происходит в коде. Подключить AI-ассистента можно не только в GigaIDE Desktop, но и в других популярных средах разработки: phpStorm, VS Code, WebStorm. 

Личные и коммерческие проекты можно создавать, развивать и улучшать на платформе GitVerse — отечественном хостинге git-репозиториев.

Лучшие практики контейнеризации Python-приложений с Docker

Среди основных советов, как использовать контейнеризацию в Python:

  1. Сначала установить зависимости, а затем уже копировать остальной код.
  2. Использовать ENVIRONMENT variables вместо .env-файлов (за исключением локальной разработки).
  3. Настроить .dockerignore и не добавлять неиспользуемые файлы в контекст сборки. Причина проста: каждый раз после команды docker build Docker-клиент создает новый архив контекста сборки и отправляет его на Docker-сервер. На это нужно время. Выход — использовать .dockerignore.
  4. Контролировать контекст сборки и следить, чтобы в него не попали каталог git, файлы .aws, .env, закрытые ключи. В противном случае в контекст сборки и в конечный образ Docker могут попасть в том числе и чувствительные конфиденциальные данные.
  5. Использовать многоэтапные сборки, чтобы получать более компактные продакшн-образы.
  6. Продумывать расположение слоев до RUN pip install -r /requirements.txt. Те файлы, которые будут изменяться чаще всего, целесообразно расположить в конце. Это минимизирует проблему переустановки пакетов-зависимостей при каждом изменении файлов. Структура может выглядеть таким образом COPY requirements.txt, RUN pip install -r /requirements.txt, COPY changingfile.py, COPY changingfile2.py, COPY changingfile3.py.
  7. Комбинировать RUN apt-get update и RUN apt-get install в одну команду. Проверить, сколько удалось выиграть в размере, можно с помощью docker history.
  8. Использовать COPY вместо ADD. COPY обеспечивает копирование с Docker-хоста в образ локальных файлов и директорий (COPY <src> <dest>). ADD дает дополнительную функциональность, но она не всегда нужна.