Упаковка простого Flask приложения в Docker контейнер
О технологиях

Упаковка простого Flask приложения в Docker контейнер

45224
13 минут

Требования

  • Docker
  • python 2.7 или выше

К окончанию статьи у вас должна получиться следующая структура директорий и файлов
docker-simple-flask-app-structure.png

Создание простого Flask приложения

Создайте пустой каталог, в котором будут содержаться файлы проекта, а внутри него virtualenv окружение


 $ mkdir my_project
 $ cd my_project
 $ virtualenv venv

Активируйте окружение и установите в него Flask


 $ source venv/bin/activate
 $ pip install flask

Создайте отдельную директорию, в которой будет находиться Flask приложение


 $ mkdir my_flask_app

Сохраните список установленных в окружении пакетов в requirements.txt в каталоге my_flask_app


 $ pip freeze > my_flask_app/requirements.txt

Содержимое my_flask_app/requirements.txt будет следующим


 $ cat my_flask_app/requirements.txt
 click==6.7 Flask==0.12
 itsdangerous==0.24
 Jinja2==2.9.4
 MarkupSafe==0.23
 Werkzeug==0.11.15
 wheel==0.24.0

Создайте файл app.py в каталоге my_flask_app, который будет содержать наше простое python Flask Web-приложение


 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 from flask import Flask
 app = Flask(__name__)
 
 @app.route('/')
 def hello_world():
 return 'Moe Flask приложение в контейнере Docker.'
 
 if __name__ == '__main__':
 app.run(debug=True,host='0.0.0.0')

Проверьте работоспособность вашего приложения, запустив его командой


 $ python my_flask_app/app.py
 * Running on (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 160-707-431

После чего в браузере на странице http://127.0.0.1:5000/ можно будет увидеть строку «Moe Flask приложение в контейнере Docker.»

docker-simple-flask-app-run-example.png

Упаковка Flask приложения в контейнер Dockerfile

Для сборки Docker образа используется специальный Dockerfile, который необходимо создать в директории my_flask_app. Содержимое Dockerfile файла в нашем случае будет:


$ cat my_flask_app/Dockerfile
FROM ubuntu:latest
MAINTAINER Andrey Maksimov 'maksimov.andrei@gmail.com'
RUN apt-get update -y
RUN apt-get install -y python-pip python-dev build-essential
COPY . /app
WORKDIR /app 
RUN pip install -r requirements.txt
ENTRYPOINT ['python']
CMD ['app.py']

Описание инструкций Dockerfile

Инструкция

Описание

FROM ubuntu:latest

В качестве базового образа будет использоваться latest версия образа Ubuntu.

MAINTAINER Andrey Maksimov

Справочная информация. Не обязательный параметр. Укажите контакты создателя образа.

RUN apt-get update -y

Обновить информацию о репозиториях внутри контейнера

RUN apt-get install -y python-pip python-dev build-essential

Установить внутрь контейнера пакеты: python-pip, python-dev, build-essential

COPY . /app

Скопировать содержимое текущей директории «.» в директорию /app внутри образа. Внимание: текущей директорией в процессе сборки будет считаться директория, содержащая Dockerfile, т.е. в нашем случае my_flask_app/

WORKDIR /app

Сменить рабочую директорию внутри контейнера. Все команды далее будут запускаться внутри директории /app внутри контейнера

RUN pip install -r requirements.txt

Установить зависимости, сохраненные вами в requirements.txt. Данная команда установить Flask и все, что необходимо для его запуска внутри контейнера.

ENTRYPOINT [«python»]

Запускать интерпретатор python по умолчанию

CMD [«app.py»]

В сочетании с использованием ENTRYPOINT интерпретатору python будет передан дополнительный аргумент app.py. Другими словами, во время запуска контейнера последней инструкцией будет выполнена команда python app.py из директории /app


Внедряем и поддерживаем Kubernetes/DevOps
Развертываем и сопровождаем инфраструктуру для бизнес-приложений на базе микросервисов и контейнеров

Создание образа контейнера

Для создания собственного контейнера, содержащего ваше простое Flask приложение, находясь внутри директории my_project необходимо выполнить команду:


$ docker build -t my_flask_app:v0.1 my_flask_app/

Ключ -t предназначен для того, чтобы присвоить вашему образу метку (label) «my_flask_app» и его версию «v0.1». Метка и версия могут быть произвольными. Если в качестве версии использовать «latest», то собранный вами образ будет помечен как имеющий самую свежую версию.

В процессе выполнения команды как описано в вашем Dockerfile будет произведена загрузка последнего образа ubuntu, внутри него установлены все необходимые зависимости, создана директория /app, в которую будет помещено содержимое директории my_flask_app/, установлены все зависимости из файла requirements.txt, а сам образ настроен на запуск вашего Flask приложения из директории /app, находящейся внутри образа.

После успешного выполнения команды в списке ваших образов появится только что созданный образ my_flask_app:v0.1

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_flask_app v0.1 afe8322ae297 8 minutes ago 440.9 MB

Запуск контейнера из собранного образа

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

$ docker run -d -p 5000:5000 my_flask_app:v0.1

Ключ -d предназначен для запуска вашего контейнера в фоновом режиме (необходим для того, чтобы вернуть управление терминалу, в котором вы работаете).

Ключ -p заставит Docker Machine пробрасывать подключения, приходящие на порт 5000 внешнего адреса Docker Machine на порт 5000 контейнера, на котором будет слушать подключения ваше Flask приложение. Использование -p [порт на Docker Machine:порт контейнера].

Проверить, что контейнер успешно запущен можно командой

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a166878f263 my_flask_app:v0.1 'python app.py' About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp stoic_allen 

После чего в браузере по адресу http://192.168.99.100:5000/ будет выведена строка «Moe Flask приложение в контейнере Docker.» так же, как это было сделано при тестовом запуске Flask приложения локально.

docker-simple-flask-app-run-example.png

Адрес 192.168.99.100 обычно используется Docker Machine для публикации портов ваших контейнеров. Этот адрес обычно сообщается в выводе настроек вашей виртуальной машины в переменной DOCKER_HOST.

Посмотреть список всех созданных вами Docker машин, выполните команду

$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default                   *        virtualbox     Running   tcp://192.168.99.100:2376           v1.12.4

Посмотреть настройки Docker машины с именем default выполните команду

$ docker-machine env default
export DOCKER_TLS_VERIFY='1'
export DOCKER_HOST='tcp://192.168.99.100:2376'
export DOCKER_CERT_PATH='/Users/amaksimov/.docker/machine/machines/default'
export DOCKER_MACHINE_NAME='default'
# Run this command to configure your shell:
# eval $(docker-machine env default)

Остановка и удаление запущенного контейнера

Для того, чтобы выполнить какие-либо операции с тем или иным контейнером сначала необходимо узнать идентификатор.

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a166878f263 my_flask_app:v0.1 'python app.py' 3 hours ago Up 3 hours 0.0.0.0:5000->5000/tcp stoic_allen

В моем случае — это 5a166878f263.

Остановка запущенного контейнера выполняется командой

$ docker stop 5a166878f263

А для того, чтобы удалить запущенный контейнер, необходимо выполнить команду

$ docker rm 5a166878f263

Заключение

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

Итоговый Docker образ, созданный в статье можно найти на Docker Hub, а сходный код приложения на GitHub.

13 февраля 2023
Замена игрока: выбираем альтернативу зарубежному системному ПО (взгляд облачного провайдера)

На поле ИТ сегодня захватывающая интрига – выбор адекватной замены зарубежным системам, производители которых массово вышли из игры. На онлайн-митапе поделились опытом подбора, внедрения и сопровождения решений, способных заместить платформу виртуализации, почту, файловое хранилище, каталог пользователей, backup и др.

Предлагаем вашему вниманию запись и расшифровку митапа.

2 минуты
2170
15 ноября 2022
OpenShift остался без поддержки – как решить проблему российским клиентам
Интерес к семейству ПО для контейнеризации OpenShift был довольно высоким в корпоративном сегменте в прежние годы. По данным мониторинговой службы Datadog, только за прошлый год во всем мире количество пользователей платформ от RedHat увеличилось на 28%. Весной IBM объявил об уходе из России и прекращении поддержки всех программных продуктов для текущих клиентов. Разберемся, насколько критичной оказалась данная ситуация для заказчиков, и какие варианты действий существуют, чтобы минимизировать возможные риски отключения от сервиса.
1 минута
1028
25 февраля 2021
Свидетели DevOps: мифы и байки про девопсов и тех, кто их нанимает
Те, кто решил стать девопсом, видят в этой профессии заманчивые перспективы. Это новый уровень мышления, это творчество и возможность создавать, это безграничные просторы для самосовершенствования. Не секрет также, что девопсам хорошо платят. Вместе с тем, вокруг понятия DevOps сформировался некий культ, овеянный мифами и легендами.
1 минута
4436
4 декабря 2020
Дайджест обновлений Облака КРОК за осень 2020 г.
За осень в Облаке КРОК многое изменилось. Мы активно писали код и не успевали сообщать обо всех переменах. Постараемся исправиться и информировать вас ASAP, чтобы вы могли сразу же использовать новые фичи.
2 минуты
2386
scrollup