Общие сведения о приложениях контейнеров Python в Azure

В этой статье описывается, как перейти из кода проекта Python (например, веб-приложения) в развернутый контейнер Docker в Azure. В этой статье рассматривается общий процесс контейнеризации, варианты развертывания контейнеров в Azure и конфигурация контейнеров для Python в Azure.

Характер контейнеров Docker заключается в том, что создание образа Docker из кода и развертывание этого образа в контейнере в Azure аналогично языкам программирования. Вопросы, связанные с языком ( Python в этом случае, находятся в конфигурации во время процесса контейнеризации в Azure, в частности структура и конфигурация Dockerfile, поддерживающие веб-платформы Python, такие как Django, Flask и FastAPI.

Сценарии рабочего процесса контейнера

Для разработки контейнеров Python некоторые типичные рабочие процессы для перехода из кода в контейнер:

Сценарий Description Рабочий процесс
Dev Создайте образы Docker Python в среде разработки. Код: клонированный код git для среды разработки (с установленным Docker).

Сборка: использование Docker CLI, VS Code (с расширениями), PyCharm (с подключаемым модулем). Описано в разделе "Работа с образами и контейнерами Python Docker".

Тест. В среде разработки в контейнере Docker.

Отправка: в реестр, например Реестр контейнеров Azure, Docker Hub или частный реестр.

Развертывание: в службе Azure из реестра.
Гибридный В среде разработки создайте образы Docker Python в Azure. Код: клонированный код git для среды разработки (не требуется для установки Docker).

Сборка: VS Code (с расширениями), Azure CLI.

Отправка: чтобы Реестр контейнеров Azure

Развертывание: в службе Azure из реестра.
Azure Все в облаке; используйте Azure Cloud Shell для создания кода образов Docker Python из репозитория GitHub. Код: репозиторий GitHub GitHub в Azure Cloud Shell.

Сборка. В Azure Cloud Shell используйте Azure CLI или Docker CLI.

Отправка: в реестр, например Реестр контейнеров Azure, Docker Hub или частный реестр.

Развертывание: в службе Azure из реестра.

Цель этих рабочих процессов заключается в том, чтобы контейнер работал в одном из ресурсов Azure, поддерживающих контейнеры Docker, как указано в следующем разделе.

Среда разработки может быть локальной рабочей станцией с Visual Studio Code или PyCharm, Codespaces (среда разработки, размещенная в облаке), или контейнерами разработки Visual Studio (контейнером в качестве среды разработки).

Параметры контейнера развертывания в Azure

Приложения контейнеров Python поддерживаются в следующих службах.

Служба Description
Веб-приложение для контейнеров Полностью управляемая служба размещения для контейнерных веб-приложений, включая веб-сайты и веб-API. Контейнерные веб-приложения в службе приложение Azure могут масштабироваться по мере необходимости и использовать оптимизированные рабочие процессы CI/CD с Помощью Docker Hub, Реестр контейнеров Azure и GitHub. Идеально подходит для разработчиков, чтобы воспользоваться преимуществами полностью управляемой платформы службы приложение Azure, но которые также хотят, чтобы один развернутый артефакт, содержащий приложение и все его зависимости.

Пример. Развертывание веб-приложения Flask или FastPI в службе приложение Azure.
Приложения контейнеров Azure (ACA) Полностью управляемая бессерверная служба контейнеров с поддержкой Kubernetes и технологий с открытым кодом, таких как Dapr, KEDA и envoy. Основываясь на рекомендациях и оптимизированных для контейнеров общего назначения. Инфраструктура кластера управляется ACA и прямой доступ к API Kubernetes не поддерживается. Предоставляет множество концепций, относящихся к приложениям, на основе контейнеров, включая сертификаты, редакции, масштабирование и среды. Идеально подходит для команд, которые хотят начать создание микрослужб контейнеров без необходимости управлять базовой сложностью Kubernetes.

Пример. Развертывание веб-приложения Flask или FastPI в приложениях контейнеров Azure.
Экземпляры контейнеров Azure Бессерверное предложение, которое предоставляет единый модуль изолированных контейнеров Hyper-V по запросу. Выставляется плата за потребление, а не подготовленные ресурсы. Такие понятия, как масштабирование, балансировка нагрузки и сертификаты, не предоставляются контейнерами ACI. Пользователи часто взаимодействуют с ACI через другие службы; например, AKS для оркестрации. Идеально, если вам нужен менее "сознаенный" стандартный блок, который не соответствует сценариям, для работы с приложениями контейнеров Azure оптимизированы.

Пример. Создание образа контейнера для развертывания для Экземпляры контейнеров Azure. (Учебник не относится к Python, но эти понятия применяются ко всем языкам.)
Служба Azure Kubernetes (AKS) Полностью управляемый параметр Kubernetes в Azure. Поддерживает прямой доступ к API Kubernetes и выполняет любую рабочую нагрузку Kubernetes. Весь кластер размещается в вашей подписке, включая конфигурации и операции кластера, находящиеся в пределах вашего контроля и ответственности. Идеально подходит для команд, которые ищут полностью управляемую версию Kubernetes в Azure.

Пример. Развертывание кластера Служба Azure Kubernetes с помощью Azure CLI.
Функции Azure Решение, управляемое событиями, бессерверными функциями как услуга (FAAS). Предоставляет множество характеристик приложениям контейнеров Azure для масштабирования и интеграции с событиями, но оптимизирован для временных функций, развернутых как код или контейнеры. Идеально подходит для команд, желающих активировать выполнение функций на событиях; например, для привязки к другим источникам данных.

Пример. Создание функции в Linux с помощью пользовательского контейнера.

Более подробное сравнение этих служб см. в статье "Сравнение приложений контейнеров" с другими параметрами контейнера Azure.

Виртуальные среды и контейнеры

При запуске проекта Python в среде разработки использование виртуальной среды — это распространенный способ управления зависимостями и обеспечения воспроизводимости настройки проекта. Виртуальная среда содержит интерпретатор Python, библиотеки и скрипты, необходимые для кода проекта, выполняемого в этой среде. Зависимости для проектов Python управляются с помощью файла requirements.txt .

Совет

При использовании контейнеров виртуальные среды не требуются, если вы не используете их для тестирования или других причин. Если вы используете виртуальные среды, не копируйте их в образ Docker. Используйте файл dockerignore, чтобы исключить их.

Контейнеры Docker можно рассматривать как предоставление аналогичных возможностей в качестве виртуальных сред, но с дополнительными преимуществами в воспроизводимости и переносимости. Контейнер Docker можно запускать в любом месте, независимо от ОС.

Контейнер Docker содержит код проекта Python и все необходимое для выполнения кода. Чтобы перейти к этой точке, необходимо создать код проекта Python в образ Docker, а затем создать контейнер, выполняющийся экземпляр этого образа.

Для контейнерных проектов Python используются ключевые файлы:

Файл проекта Description
requirements.txt Используется во время сборки образа Docker для получения правильных зависимостей в образе.
Dockerfile Используется для указания способа сборки образа Docker Python. Дополнительные сведения см. в разделе Инструкции Dockerfile для Python.
.dockerignore Файлы и каталоги в dockerignore не копируются в образ Docker с COPY помощью команды в Dockerfile. Файл dockerignore поддерживает шаблоны исключений, аналогичные файлам gitignore . Дополнительные сведения см . в файле dockerignore.

Исключение файлов помогает повысить производительность сборки изображений, но также следует использовать для предотвращения добавления конфиденциальной информации в образ, где его можно проверить. Например, dockerignore должен содержать строки, чтобы игнорировать .env и .venv (виртуальные среды).

Параметры контейнера для веб-платформ

Веб-платформы имеют порты по умолчанию, на которых они прослушивают веб-запросы. При работе с некоторыми решениями контейнеров Azure необходимо указать порт, который будет прослушивать контейнер.

Веб-платформа Порт
Django 8000
Flask 5000 или 5002
FastAPI (uvicorn) 8000 или 80

В следующей таблице показано, как задать порт для разных решений контейнеров Azure.

Решение контейнера Azure Настройка порта веб-приложения
Веб-приложение для контейнеров По умолчанию Служба приложений предполагает, что ваш пользовательский контейнер прослушивает порт 80 или 8080. Если контейнер прослушивает другой порт, задайте параметр приложения WEBSITES_PORT в приложении Служба приложений. Дополнительные сведения см. в разделе "Настройка пользовательского контейнера для службы приложение Azure".
Приложения контейнеров Azure Приложения контейнеров Azure позволяют предоставлять приложение-контейнер для общедоступного веб-сайта, виртуальной сети или другим приложениям-контейнерам в вашей среде, включив входящий трафик. Задайте для порта входящий трафик targetPort , который контейнер прослушивает входящие запросы. Конечная точка входящего трафика приложения всегда предоставляется через порт 443. Дополнительные сведения см. в статье "Настройка httpS или TCP-входящего трафика" в приложениях контейнеров Azure.
Экземпляры контейнеров Azure, Azure Kubernetes Задайте порт во время создания контейнера. Необходимо убедиться, что решение имеет веб-платформу, сервер приложений (например, gunicorn, uvicorn) и веб-сервер (например, nginx). Например, можно создать два контейнера, один контейнер с веб-платформой и сервером приложений и другой платформой с веб-сервером. Два контейнера взаимодействуют по одному порту, а контейнер веб-сервера предоставляет 80/443 для внешних запросов.

Python Dockerfile

Dockerfile — это текстовый файл, содержащий инструкции по созданию образа Docker. Первая строка указывает базовый образ, с который начинается. За этой строкой следует инструкции по установке необходимых программ, копированию файлов и другим инструкциям по созданию рабочей среды. Например, некоторые примеры, относящиеся к Python, для ключевых инструкций Dockerfile Python, показаны в таблице ниже.

Инструкция Характер использования Пример
FROM Задает базовый образ для последующих инструкций. FROM python:3.8-slim
ПРЕДОСТАВЛЯТЬ Сообщает Docker, что контейнер прослушивает указанные сетевые порты во время выполнения. EXPOSE 5000
COPY Копирует файлы или каталоги из указанного источника и добавляет их в файловую систему контейнера по указанному пути назначения. COPY . /app
ЗАПУСТИТЬ Выполняет команду внутри образа Docker. Например, вытягивание зависимостей. Команда выполняется сразу во время сборки. RUN python -m pip install -r requirements.txt
CMD Эта команда предоставляет значение по умолчанию для выполнения контейнера. Существует только одна инструкция CMD. CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

Команда сборки Docker создает образы Docker из Dockerfile и контекста. Контекст сборки — это набор файлов, расположенных по указанному пути или URL-адресу. Как правило, вы создадите образ из корневого каталога проекта Python, а путь к команде сборки — ".", как показано в следующем примере.

docker build --rm --pull  --file "Dockerfile"  --tag "mywebapp:latest"  .

Процесс сборки может ссылаться на любой из файлов в контексте. Например, сборка может использовать инструкцию COPY для ссылки на файл в контексте. Ниже приведен пример dockerfile для проекта Python с помощью платформы Flask :

FROM python:3.8-slim

EXPOSE 5000

# Keeps Python from generating .pyc files in the container.
ENV PYTHONDONTWRITEBYTECODE=1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

# Install pip requirements.
COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder.
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

# Provides defaults for an executing container; can be overridden with Docker CLI.
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

Можно создать Dockerfile вручную или создать его автоматически с помощью VS Code и расширения Docker. Дополнительные сведения см. в разделе "Создание файлов Docker".

Команда сборки Docker входит в интерфейс командной строки Docker. При использовании таких идентификаторов, как VS Code или PyCharm, команды пользовательского интерфейса для работы с образами Docker вызывают команду сборки для вас и автоматизируют задание параметров.

Работа с образами и контейнерами Python Docker

VS Code и PyCharm

Работа в интегрированной среде разработки (IDE) для разработки контейнеров Python не требуется, но может упростить множество задач, связанных с контейнерами. Ниже приведены некоторые действия, которые можно сделать с помощью VS Code и PyCharm.

  • Скачайте и создайте образы Docker.

    • Создайте образы в среде разработки.
    • Создание образов Docker в Azure без установки Docker в среде разработки. (Для PyCharm используйте Azure CLI для создания образов в Azure.)
  • Создайте и запустите контейнеры Docker из существующего образа, извлеченного образа или непосредственно из Dockerfile.

  • Запуск многоконтайнерных приложений с помощью Docker Compose.

  • Подключение и работать с реестрами контейнеров, такими как Docker Hub, GitLab, JetBrains Space, Docker V2 и другие локальные реестры Docker.

  • (только VS Code) Добавьте файлы Dockerfile и Docker Compose, адаптированные для проекта Python.

Чтобы настроить VS Code и PyCharm для запуска контейнеров Docker в среде разработки, выполните следующие действия.

Если вы еще не сделали этого, установите средства Azure для VS Code.

Instructions Снимок экрана
Шаг 1. Используйте SHIFT + ALT + A, чтобы открыть расширение Azure и подтвердить подключение к Azure.

Вы также можете выбрать значок Azure на панели расширений VS Code.

Если вы не вошли, выберите вход в Azure и следуйте инструкциям.

Если у вас возникли проблемы с доступом к подписке Azure, это может быть связано с тем, что вы находитесь за прокси-сервером. Сведения об устранении проблем с подключением см. в разделе "Сетевые Подключение ions" в Visual Studio Code.
Screenshot showing how Azure Tools looks once signed in.Screenshot showing how Azure Tools looks if you aren't signed in.
Шаг 2. Используйте CTRL + SHIFT + X для открытия расширений, поиска расширения Docker и установки расширения.

Вы также можете выбрать значок расширений на панели расширений VS Code.
Screenshot showing how to add Docker extension to VS Code.
Шаг 3. Выберите значок Docker на панели расширения, разверните изображения и щелкните его в качестве контейнера правой кнопкой мыши. Screenshot showing how to use the Docker extension in VS Code to run a container from a Docker image.
Шаг 4. Мониторинг выходных данных Запуска Docker в окне терминала . Screenshot showing an example of running a container in VS Code.

Azure CLI и Интерфейс командной строки Docker

Вы также можете работать с образами и контейнерами Python Docker с помощью Azure CLI и Docker CLI. В VS Code и PyCharm есть терминалы, где можно запускать эти среды CLIs.

Используйте интерфейс командной строки, если требуется более подробный контроль над аргументами сборки и выполнения, а также для автоматизации. Например, следующая команда показывает, как использовать Azure CLI az acr build , чтобы указать имя образа Docker.

az acr build --registry <registry-name> \
  --resource-group <resource-group> \
  --target pythoncontainerwebapp:latest .

В другом примере рассмотрим следующую команду, в которой показано, как использовать команду запуска Интерфейса командной строки Docker. В примере показано, как запустить контейнер Docker, который взаимодействует с экземпляром MongoDB в среде разработки за пределами контейнера. Различные значения для выполнения команды проще автоматизировать при указании в командной строке.

docker run --rm -it \
  --publish <port>:<port> --publish 27017:27017 \
  --add-host mongoservice:<your-server-IP-address> \
  --env CONNECTION_STRING=mongodb://mongoservice:27017 \
  --env DB_NAME=<database-name> \
  --env COLLECTION_NAME=<collection-name> \
  containermongo:latest  

Дополнительные сведения об этом сценарии см. в статье о сборке и тестировании контейнерного веб-приложения Python локально.

Переменные среды в контейнерах

Проекты Python часто используют переменные среды для передачи данных в код. Например, можно указать сведения о подключении к базе данных в переменной среды, чтобы его можно было легко изменить во время тестирования. При развертывании проекта в рабочей среде подключение к базе данных можно изменить, чтобы ссылаться на экземпляр рабочей базы данных.

Пакеты, такие как python-dotenv , часто используются для чтения пар "ключ-значение" из env-файла и задают их в качестве переменных среды. Env-файл полезен при запуске в виртуальной среде, но не рекомендуется при работе с контейнерами. Не копируйте env-файл в образ Docker, особенно если он содержит конфиденциальную информацию, и контейнер будет открыт. Используйте файл dockerignore, чтобы исключить копирование файлов в образ Docker. Дополнительные сведения см. в разделе "Виртуальные среды и контейнеры " в этой статье.

Переменные среды можно передать контейнерам несколькими способами:

  1. Определяется в Dockerfile в виде инструкций ENV.
  2. Передан в качестве --build-arg аргументов с помощью команды сборки Docker.
  3. Передан в качестве --secret аргументов с помощью команды сборки Docker и серверной части BuildKit .
  4. Переданы как --env или --env-file аргументы с помощью команды запуска Docker.

Первые два варианта имеют тот же недостаток, что и выше с env-файлами , а именно, что вы жестко закодировали потенциально конфиденциальную информацию в образ Docker. Можно проверить образ Docker и просмотреть переменные среды, например с помощью проверки образа docker команды.

Третий вариант с BuildKit позволяет передавать секретные сведения, которые будут использоваться в Dockerfile для создания образов docker безопасным способом, который не будет храниться в окончательном образе.

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

Ниже приведен пример передачи переменных среды с помощью команды выполнения интерфейса командной строки Docker и использования аргумента --env .

# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>

docker run --rm -it \
  --publish $PORT:$PORT \
  --env CONNECTION_STRING=<connection-info> \
  --env DB_NAME=<database-name> \
  <dockerimagename:tag>

Если вы используете VS Code или PyCharm, параметры пользовательского интерфейса для работы с изображениями и контейнерами в конечном итоге используют команды Интерфейса командной строки Docker, как показано выше.

Наконец, указание переменных среды при развертывании контейнера в Azure отличается от использования переменных среды в среде разработки. Например:

  • Для веб-приложения для контейнеров можно настроить параметры приложения во время настройки Служба приложений. Эти параметры доступны для кода приложения в виде переменных среды и вызываются с помощью стандартного шаблона os.environ. При необходимости можно изменить значения после первоначального развертывания. Дополнительные сведения см. в разделе "Параметры приложения Access" в качестве переменных среды.

  • Для приложений контейнеров Azure вы настраиваете переменные среды во время начальной настройки приложения-контейнера. Последующее изменение переменных среды создает редакцию контейнера. Кроме того, приложения контейнеров Azure позволяют определять секреты на уровне приложения, а затем ссылаться на них в переменных среды. Дополнительные сведения см. в статье "Управление секретами в приложениях контейнеров Azure".

В качестве другого варианта можно использовать службу Подключение or для подключения вычислительных служб Azure к другим службам резервного копирования. С помощью соединителя можно настроить параметры сети и сведения о соединении (например, создать переменные среды) между службой вычислений и целевой вспомогательной службой в плоскости управления.

Просмотр журналов контейнера

Просмотрите журналы экземпляров контейнера, чтобы просмотреть выходные данные диагностических сообщений из кода и устранить неполадки в коде контейнера. Ниже приведено несколько способов просмотра журналов при запуске контейнера в среде разработки:

  • Запуск контейнера с VS Code или PyCharm, как показано в разделе VS Code и PyCharm, можно увидеть журналы в окнах терминала, открытых при выполнении docker.

  • Если вы используете команду запуска Интерфейса командной строки Docker с интерактивным флагом-it, вы увидите выходные данные после команды.

  • В Docker Desktop можно также просматривать журналы для запущенного контейнера.

При развертывании контейнера в Azure также есть доступ к журналам контейнеров. Ниже приведены несколько служб Azure и как получить доступ к журналам контейнеров в портал Azure.

Служба Azure Доступ к журналам в портал Azure
Веб-приложение для контейнеров Перейдите к ресурсу диагностики и решения проблем , чтобы просмотреть журналы. Диагностика — это интеллектуальный и интерактивный интерфейс, помогающий устранять неполадки с приложением без требуемой конфигурации. Для просмотра журналов в режиме реального времени перейдите в поток журнала мониторинга - . Дополнительные сведения о запросах и конфигурации журналов см. в разделе "Мониторинг" других ресурсов.
Приложения-контейнеры Azure Перейдите к ресурсу среды Для диагностики и устранения проблем с средой. Чаще всего вы хотите просмотреть журналы контейнеров. В ресурсе контейнера в разделе "Управление редакцией приложений - " выберите редакцию и оттуда можно просмотреть журналы системы и консоли. Дополнительные сведения о запросах и конфигурации журналов см. в разделе "Мониторинг".
Экземпляры контейнеров Azure Перейдите к ресурсу "Контейнеры " и выберите "Журналы".

Для указанных выше служб приведены команды Azure CLI для доступа к журналам.

Служба Azure Команда Azure CLI для доступа к журналам
Веб-приложение для контейнеров az webapp log
Приложения-контейнеры Azure az containerapps logs
Экземпляры контейнеров Azure az container logs

Также поддерживается просмотр журналов в VS Code. Необходимо установить средства Azure для VS Code . Ниже приведен пример просмотра журналов веб-приложения для контейнеров (Служба приложений) в VS Code.

Screenshot showing how to view logs in VS Code for Web Apps for Containers.

Следующие шаги