Как запустить Flask-приложение в рабочем режиме в Docker

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Docker стал популярным выбором для развертывания веб-приложений, в том числе приложений на основе Flask. В этом руководстве мы расскажем вам, как создать Docker-образ для Flask-приложения и запустить его в рабочем (production) режиме с использованием Docker. По окончании этого материала вы будете хорошо понимать, как использовать Docker для развертывания своего Flask-приложения в рабочей среде.

Понимание Docker

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

Что такое Docker?

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

Преимущества Docker

  1. Переносимость: Контейнеры Docker могут работать одинаково в разных вычислительных средах, от ноутбука разработчика до производственного сервера, что гарантирует, что приложение будет вести себя одинаково независимо от базовой инфраструктуры.
  2. Масштабируемость: Docker позволяет легко масштабировать приложения вверх или вниз в зависимости от спроса, добавляя или удаляя контейнеры по мере необходимости.
  3. Эффективность: Контейнеры Docker являются легковесными и используют меньше ресурсов, чем традиционные виртуальные машины, что позволяет более эффективно использовать вычислительные ресурсы.
  4. Согласованность: Docker гарантирует, что приложение и его зависимости упакованы вместе, устраняя проблему «на моем компьютере работает», и обеспечивает согласованное поведение в разных средах.

Архитектура Docker

Архитектура Docker состоит из следующих ключевых компонентов:

graph TD A[Docker Client] --> B[Docker Daemon] B --> C[Docker Images] B --> D[Docker Containers] B --> E[Docker Networking] B --> F[Docker Storage]
  1. Docker Client (Клиент Docker): Клиент Docker является основным пользовательским интерфейсом для взаимодействия с Docker. Он позволяет пользователям отправлять команды демону Docker, такие как создание, запуск и управление контейнерами.
  2. Docker Daemon (Демон Docker): Демон Docker — это сервис на стороне сервера, который управляет созданием, изменением и удалением объектов Docker, таких как образы, контейнеры, сети и тома.
  3. Docker Images (Образы Docker): Образы Docker — это чертежи для создания контейнеров Docker. Они содержат код приложения, библиотеки, зависимости и все другие файлы, необходимые для запуска приложения.
  4. Docker Containers (Контейнеры Docker): Контейнеры Docker — это запущенные экземпляры образов Docker. Они представляют изолированные, легковесные и переносимые среды, в которых запускается приложение.
  5. Docker Networking (Сетевые возможности Docker): Docker предоставляет встроенные сетевые возможности, которые позволяют контейнерам взаимодействовать друг с другом и с внешним миром.
  6. Docker Storage (Хранение в Docker): Docker предоставляет различные варианты хранения, включая тома и привязки (bind mounts), для управления постоянными данными, связанными с контейнером.

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

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

В этом разделе мы узнаем, как создать Docker-образ для Flask-приложения.

Создание Flask-приложения

Начнем с создания простого Flask-приложения. Создайте новую директорию и перейдите в нее в терминале. Затем создайте новый файл с именем app.py со следующим содержимым:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, LabEx!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Это Flask-приложение имеет один маршрут, который возвращает сообщение "Hello, LabEx!".

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

Для создания Docker-образа для Flask-приложения нам нужно создать файл Dockerfile. Создайте новый файл с именем Dockerfile со следующим содержимым:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]

Разберем содержимое файла Dockerfile:

  1. FROM python:3.9-slim: Эта строка указывает базовый образ для Docker-контейнера, в данном случае это slim-версия образа Python 3.9.
  2. WORKDIR /app: Эта строка устанавливает рабочую директорию внутри контейнера в /app.
  3. COPY requirements.txt .: Эта строка копирует файл requirements.txt в рабочую директорию контейнера.
  4. RUN pip install --no-cache-dir -r requirements.txt: Эта строка устанавливает зависимости Python, указанные в файле requirements.txt.
  5. COPY . .: Эта строка копирует весь код приложения (включая app.py) в рабочую директорию контейнера.
  6. CMD ["python", "app.py"]: Эта строка указывает команду, которая будет выполнена при запуске контейнера, а именно запуск скрипта app.py с использованием интерпретатора Python.

Сборка и запуск Docker-контейнера

Теперь давайте соберем Docker-образ и запустим контейнер:

  1. Соберите Docker-образ:
    docker build -t labex-flask-app .
  2. Запустите Docker-контейнер:
    docker run -p 5000:5000 labex-flask-app

Опция -p 5000:5000 сопоставляет порт 5000 хоста с портом 5000 контейнера, что позволяет вам получить доступ к Flask-приложению с локального компьютера.

После запуска контейнера вы можете получить доступ к Flask-приложению, открыв веб-браузер и перейдя по адресу http://localhost:5000. Вы должны увидеть отображаемое сообщение "Hello, LabEx!".

Поздравляем! Вы успешно создали Docker-образ для Flask-приложения.

Запуск Flask-приложения в рабочем (production) режиме

При запуске Flask-приложения в рабочей среде важно использовать готовый к эксплуатации веб-сервер вместо встроенного сервер разработки. В этом разделе мы узнаем, как запустить Flask-приложение в рабочем режиме с использованием Docker.

Выбор сервера для рабочей среды

Существует несколько веб-серверов, готовых к использованию в рабочей среде, которые можно использовать для запуска Flask-приложения, таких как Gunicorn, uWSGI и Waitress. В этом примере мы будем использовать Gunicorn, популярный и широко используемый веб-сервер для Python-приложений.

Изменение файла Dockerfile

Для запуска Flask-приложения в рабочем режиме с использованием Gunicorn нам нужно обновить файл Dockerfile. Замените содержимое файла Dockerfile следующим:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

RUN pip install gunicorn

CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]

Основные изменения:

  1. Мы добавили RUN pip install gunicorn для установки веб-сервера Gunicorn.
  2. Мы изменили инструкцию CMD для запуска Flask-приложения с использованием Gunicorn. Команда "gunicorn", "--bind", "0.0.0.0:5000", "app:app" сообщает Gunicorn привязать приложение к адресу 0.0.0.0:5000 и использовать объект app из файла app.py в качестве WSGI-приложения.

Сборка и запуск Docker-контейнера для рабочей среды

Теперь давайте соберем Docker-образ и запустим контейнер в рабочем режиме:

  1. Соберите Docker-образ:
    docker build -t labex-flask-app-prod .
  2. Запустите Docker-контейнер:
    docker run -p 5000:5000 labex-flask-app-prod

Теперь приложение должно запускаться в рабочем режиме с использованием Gunicorn.

Проверка настройки рабочей среды

Для проверки того, что Flask-приложение запущено в рабочем режиме, вы можете использовать следующую команду для просмотра журналов:

docker logs <container_id>

Вы должны увидеть вывод, похожий на следующий:

[2023-04-11 12:34:56 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2023-04-11 12:34:56 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
[2023-04-11 12:34:56 +0000] [1] [INFO] Using worker: sync
[2023-04-11 12:34:56 +0000] [8] [INFO] Booting worker with pid: 8

Это подтверждает, что Flask-приложение запущено в рабочем режиме с использованием веб-сервера Gunicorn.

Резюме

В этом руководстве были рассмотрены основные шаги по запуску Flask-приложения в рабочем (production) режиме с использованием Docker. Мы изучили процесс создания Docker-образа для Flask-приложения, включая создание файла Dockerfile и сборку Docker-образа. Кроме того, мы обсудили, как запустить Flask-приложение в рабочем режиме внутри Docker-контейнера, обеспечивая надежное и масштабируемое развертывание. Следуя практикам, описанным в этом руководстве, вы сможете эффективно использовать Docker для развертывания своих веб-приложений на основе Flask в рабочей среде.