
В статье «Упаковка Flask-приложения в контейнер Docker» вы создали простое Flask-приложение и научились запускать его внутри контейнера. Сегодня мы вернемся к этому проекту, добавив к нему поддержку инструмента Docker Compose, который позволяет автоматизировать запуск большого количества связанных контейнеров в сложных приложениях.
В директории нашего проекта my_project создайте файл docker-compose.yml, в который необходимо добавить следующее содержимое
$ cat docker-compose.yml
web:
build: ./my_flask_app
ports:
- "5000:5000"
volumes:
- ./my_flask_app:/app
Описание содержания docker-compose.yml
web:
Название компонента приложения, управляемого Docker Compose. Каждый компонент запускается в отдельном контейнере или их группе
build: ./my_flask_app
Обозначение того, что данный компонент будет запускаться из образа, который необходимо собрать. Инструкции по сборке будут искаться в Dockerfile в директории ./my_flask_app относительно docker-compose.yml файла
ports:
- "5000:5000"
Обозначение того, что необходимо выполнить публикацию порта 5000 данного компонента в порт 5000, доступный по внешнему IP-адресу хоста (или виртуальной машины), на котором будет запущено приложение.
volumes:
- ./my_flask_app:/app
Указывает на то, что внутрь контейнера, отвечающего за этот компонент приложения, нужно подключить диск Docker (Docker Volume). В нашем случае в роли такого диска будет выступать каталог ./my_flask_app, который будет смонтирован в каталог /app внутрь контейнера. Это делается для того, чтобы можно было легко менять Flask-приложение и отслеживать изменения, просто обновляя окно браузера, а не пересобирая весь контейнер целиком. Чтобы убедиться в этом, попробуйте изменить вывод функции hello_world в файле ./my_flask_app/app.py.
Если вы еще не остановили запущенный в прошлой статье контейнер, сделайте это, чтобы не возникло конфликта с использованием порта 5000 в процессе запуска нового контейнера, который будет управляться Docker Compose.
Сборка и запуск нового контейнера выполняется командой
$ docker-compose up -d
Ключ -d необходим, чтобы запустить ваше приложение, состоящее из одного контейнера, и вернуть управление терминалу, в котором вы вызывали docker-compose.
После успешной сборки и запуска контейнера, вы сможете снова увидеть вывод «Moe Flask приложение в контейнере Docker.» в браузере по адресу http://192.168.99.100:5000/.
Для того, чтобы пересобрать ваше приложение после сделанных вами изменений выполните команду
$ docker-compose build
А перезапуск контейнера вместе с предварительной пересборкой, выполняется командой
$ docker-compose up -d --build
Просмотр запущенных docker-compose контейнеров, а также информации по опубликованным ими портам осуществляется командой
$ docker-compose ps
Name Command State Ports
----------------------------------------------------------------
myproject_web_1 python app.py Up 0.0.0.0:5000->5000/tcp
Остановка приложения выполняется командой
$ docker-compose stop
Stopping myproject_web_1 ... done
Одновременная остановка и удаление выполняются командой
$ docker-compose down
Stopping myproject_web_1 ... done
Removing myproject_web_1 ... done
Использование Docker Compose существенно облегчает сборку, запуск и остановку вашего приложения. Наибольший эффект от его использования достигается при управлении приложением, состоящим из нескольких связанных контейнеров, о чем я расскажу в следующей статье.