Запросить демо
Я подтверждаю свое согласие на обработку компанией КРОК моих персональных данных, указанных в форме, в целях и пределах, установленных законодательством РФ о персональных данных в рамках проводимых мероприятий в течение неопределенного срока
Предпочтительный способ связи
Оставить заявку
Я подтверждаю свое согласие на обработку компанией КРОК моих персональных данных, указанных в форме, в целях и пределах, установленных законодательством РФ о персональных данных в рамках проводимых мероприятий в течение неопределенного срока
Узнать стоимость
Я подтверждаю свое согласие на обработку компанией КРОК моих персональных данных, указанных в форме, в целях и пределах, установленных законодательством РФ о персональных данных в рамках проводимых мероприятий в течение неопределенного срока
Предпочтительный способ связи
Попробовать бесплатно
Я подтверждаю свое согласие на обработку компанией КРОК моих персональных данных, указанных в форме, в целях и пределах, установленных законодательством РФ о персональных данных в рамках проводимых мероприятий в течение неопределенного срока
Предпочтительный способ связи
Регистрация в консоли
Я подтверждаю свое согласие на обработку компанией КРОК моих персональных данных, указанных в форме, в целях и пределах, установленных законодательством РФ о персональных данных в рамках проводимых мероприятий в течение неопределенного срока
Предпочтительный способ связи
Быть в теме

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

21.12.2018 11 минут 1900

Требования

  • 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

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

Для создания собственного контейнера, содержащего ваше простое 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.

Сервисы упоминаемые в статье

  1. Публичное облако КРОК

Не пропустите самые важные, интересные и полезные статьи недели

Ваш e-mail успешно подписан.

Смотрите также