Упаковка простого Flask приложения в Docker контейнер
Из этой статьи вы узнаете, как создать и упаковать простое Flask приложение в Docker контейнер.
Требования
- Docker
- python 2.7 или выше
К окончанию статьи у вас должна получиться следующая структура директорий и файлов
Создание простого 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.»
Упаковка 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 приложения локально.
Адрес 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.