Введение

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

Подготовка

Убедитесь что вы уже установили Docker Engine и Docker Compose. Вам не нужно устанавливать Python, мы установим его из Docker образа.

Шаг 1: Настройка

  1. Создайте каталог для проекта:

    $ mkdir composetest
    $ cd composetest
    

  2. В удобном для вас редакторе кода создайте файл app.py в каталоге проекта.

    from flask import Flask
    from redis import Redis
    
    app = Flask(__name__)
    redis = Redis(host='redis', port=6379)
    
    @app.route('/')
    def hello():
        redis.incr('hits')
        return 'Hello World! I have been seen %s times.' % redis.get('hits')
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    
  3. Создайте другой файл, с именем requirements.txtв каталоге проекта со следующим содержанием:

    flask
    redis
    

В нем указаны зависимости приложения.

Шаг 2: Создание Docker образа

В этом шаге, вы создадите новый образ Docker. Образ будет содержать все зависимости приложения Python включая сам Python.

  1. В каталоге вашего проекта создайте файл с именем Dockerfile и следующим содержанием:

    FROM python:2.7
    ADD . /code
    WORKDIR /code
    RUN pip install -r requirements.txt
    CMD python app.py
    

Данные команды говорят Docker сделать следующее:

  • Создать образ взяв за основу образ Python 2.7.
  • Добавить текущую директорию . в каталог /code в образе.
  • Установить рабочую директорию /code.
  • Установить Python зависимости.
  • Задать команду по умолчанию для контейнера python app.py

Больше информации о том как писать Dockerfiles, вы можете найти в разделах руководства пользователя Docker и руководства по Dockerfile.

  1. Сборка образа.

    $ docker build -t web .
    

Данная команда создает образ с названием web из содержимого текущего каталога. Команда автоматически находит Dockerfile, app.py и requirements.txt.

Шаг 3: Описание сервисов

Набор сервисов определяется с помощью файла docker-compose.yml:

  1. Создайте файл с именем docker-compose.yml в каталоге вашего проекта и следующим содержанием:

    version: '2'
    services:
      web:
        build: .
        ports:
         - "5000:5000"
        volumes:
         - .:/code
        depends_on:
         - redis
      redis:
        image: redis
    

В Compose файле определены два сервиса, web и redis. Web сервис:

  • Создается из Dockerfile в текущем каталоге.
  • Связывает 5000 порт контейнера с 5000 портом на хосте.
  • Монтирует каталог проекта на хосте в каталог /code внутри контейнера позволяя вам изменять код без пересоздания контейнера.
  • Линкует web сервис с Redis сервисом.

Сервис redis использует последний публичный образ Redis загруженный с Docker Hub.

Шаг 4: Сборка и запуск вашего приложения в Compose

  1. Из директории с вашим проектом запустим приложение.

    $ docker-compose up
    Pulling image redis...
    Building web...
    Starting composetest_redis_1...
    Starting composetest_web_1...
    redis_1 | [8] 02 Jan 18:43:35.576 # Server started, Redis version 2.8.3
    web_1   |  * Running on http://0.0.0.0:5000/
    web_1   |  * Restarting with stat
    

Compose загружает образ Redis, собирает образ для выполнения вашего кода и запускает сервисы которые вы задали.

  1. Введите в браузере http://0.0.0.0:5000/ что бы убедиться что ваше приложение работает.

Если вы используете Docker на Linux, то веб приложение будет слушать порт 5000 на хосте где запущен Docker демон. Если адрес http://0.0.0.0:5000 не отвечает, попробуйте ввести http://localhost:5000.

Если вы используете Docker Machine на Mac, используйте команду docker-machine ip MACHINE_VM что бы получить IP адрес Docker хоста. Затем введите open http://MACHINE_VM_IP:5000 в браузере.

Вы должны увидеть следующее сообщение в браузере:

Hello World! I have been seen 1 times.

  1. Обновите страницу.

Число должно увеличиться.

Шаг 5: Экспериментируем с другими командами

Если вы хотите запустить ваши сервисы в фоновом режиме, используйте флаг -d с командой docker-compose up, а также команду docker-compose ps для просмотра запущенных сервисов:

    $ docker-compose up -d
    Starting composetest_redis_1...
    Starting composetest_web_1...
    $ docker-compose ps
    Name                 Command            State       Ports
    -------------------------------------------------------------------
    composetest_redis_1   /usr/local/bin/run         Up
    composetest_web_1     /bin/sh -c python app.py   Up      5000->5000/tcp

Команда docker-compose run позволяет вам единоразово выполнять команды в вашем сервисе. К примеру, что бы увидеть какие переменные окружения доступны в сервисе web выполните:

    $ docker-compose run web env

Выполните docker-compose --help что бы увидеть другие доступные команды. Вы также можете установить command completion для оболочек bash и zsh, которые будут показывать вам доступные команды.

Если вы запускаете Compose командой docker-compose up -d, то вероятно потом вам понадобиться остановить сервисы когда вы закончите работать с ними:

    $ docker-compose stop

На данный момент вы ознакомились с основами работы Compose.

Что дальше

Перевод абзаца

Оригинал:


Комментарии:

  • Руслан
    очень прикольно можно управлять набором контейнеров одной командой я так понимаю это больше для разработки нежели продакшена?
    04 Фев 2017, 10:32 ответить
    • Михаил
      Не обязательно, его используют и на продакшене, так как docker-легковеснее и также докер настраивают с автоматическим запуском тестов перед выгрузкой на продакшен что при деплои остановит его если тест какой либо упал.
      15 Май 2018, 08:57 ответить

Пожалуйста, авторизуйтесь что бы оставлять комментарии.