ѕоговорим?јлиса это умеет

ћерион Ќетворкс

7 минут чтени€


„то это вообще такое?

Docker Compose €вл€етс€ инструментом дл€ определени€ и запуска контейнерных приложений. — Compose вы получаете возможность настраивать службы использу€ файл YAML. — помощью одной команды Compose вы создаете и запускаете все службы в соответствии с вашей конфигурацией.

”становка начинаетс€ с создани€ каталога проекта:

$ mkdir composetest
$ cd composetest

—оздайте файл под названием app.py и вставьте в него следующие данные:

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

¬ нашем случае название хоста - redis, который использует порт 6379. —оздайте файл под названием needs.txt в каталоге вашего проекта и вставьте его в:

flask
Redis

“еперь следует написать код дл€ файла Dockerfile, содержащий все необходимые переменные дл€ среды разработки.

¬ каталоге вашего проекта создайте файл с именем Dockerfile (файл будет определ€ть среду приложени€) и вставьте следующее содержимое:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

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

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

Ќа основании содержани€ файла происходит запуск двух сервисов: Web и Redis, а в дальнейшем вы можете вносить в этот файл различные Ѕƒ и иную важную информацию.

C помощью команды Compose создайте ваше приложение, после чего из каталога проекта запустите приложение, запустив docker-compose. ¬от так:

$ docker-compose up
Creating network "composetest_default" with the default driver
Creating composetest_web_1 ...
Creating composetest_redis_1 ...
Creating composetest_web_1
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
redis_1  | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
web_1    |  * Restarting with stat
redis_1  | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.
redis_1  | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
web_1    |  * Debugger is active!
redis_1  | 1:M 17 Aug 22:11:10.483 # Server initialized
redis_1  | 1:M 17 Aug 22:11:10.483 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
web_1    |  * Debugger PIN: 330-787-903
redis_1  | 1:M 17 Aug 22:11:10.483 * Ready to accept connections

Compose извлекает образ Redis, создава€ образ дл€ вашего приложени€ и запускает выбранные службы. ¬ этом случае код копируетс€ в образ во врем€ сборки.  ак вам такое?

“еперь попробуйте ввести http://localhost:5000/ в браузере, чтобы чекнуть запущенное приложение.

≈сли вы используете Docker дл€ Linux, Docker Desktop дл€ Mac или Docker Desktop дл€ Windows, то теперь веб-приложение должно "смотреть" на порт 5000 на хосте Docker. ¬ведите в своем веб-браузере адрес http://localhost:5000, чтобы увидеть сообщение Hello World. ≈сли не сработает, вы также можете попробовать зайти на http://127.0.0.1:5000.

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

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

ѕример рабочего тестового приложени€

Hello World! I have been seen 1 times.

ѕереключитесь на другое окно терминала и введите docker image ls, чтобы вывести список локальных образов/контейнеров. ¬ывод на этом этапе должен показывать redis и web.

$ docker image ls
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
composetest_web         latest              e2c21aa48cc1        4 minutes ago       93.8MB
python                  3.4-alpine          84e6077c7ab6        7 days ago          82.5MB
redis                   alpine              9d8fa9aa0e5b        3 weeks ago         27.5MB
¬ажно: ¬ы можете просматривать запущенные контейнеры с помощью Docker Inspect Tag или ID

«апустите docker-compose из каталога вашего проекта во втором терминале, либо нажмите CTRL + C в исходном терминале, где приложение уже запущено и отредактируйте файл Compose.

ќтредактируйте docker-compose.yml в каталоге вашего проекта дл€ внесени€ той или иной правки в веб-службе

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"

Ќовый ключ редактирует каталог проекта на хосте внутри контейнера, что позвол€ет измен€ть код без необходимости перестраивать весь образ.  люч среды устанавливает переменную FLASK_ENV, котора€ сообщает о запуске в режиме разработки и перезагрузке кода при изменении. ¬ажно: этот режим должен использоватьс€ только при разработке.

¬ каталоге проекта введите docker-compose up, чтобы создать приложение с обновленным файлом Compose, и запустите его.

$ docker-compose up
Creating network "composetest_default" with the default driver
Creating composetest_web_1 ...
Creating composetest_redis_1 ...
Creating composetest_web_1
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Е

ѕоскольку код приложени€ теперь добавл€етс€ в контейнер с помощью тома, вы можете вносить изменени€ в его код и мгновенно просматривать изменени€ без необходимости перестраивать образ.

»змените сообщение в app.py и сохраните его:

Hello from Docker!:
return 'Hello from Docker! I have been seen {} times.\n'.format(count)

ќбновите результат в вашем браузере (нажмите F5 или Ctrl + F5) . ѕриветствие должно быть обновлено, а счетчик должен увеличиватьс€.

¬ы можете поэкспериментировать с другими командами. ≈сли вы хотите запускать свои службы в фоновом режиме, вы можете сделать следующее:

docker-compose up and use docker-compose ps to see what is currently running:
$ 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 позвол€ет вам примен€ть одноразовые команды к вашим сервисов. Ќапример, чтобы увидеть, какие переменные среды доступны дл€ веб-службы:

$ docker-compose run web env

¬ыполните команду docker-compose Цhelp, чтобы увидеть весь список доступных команд.

≈сли вы запустили Compose с помощью docker-compose up -d, то нужно будет остановить ваши службы после работы с ними, дл€ этого поможет команда ниже:$ docker-compose stop

≈сли хотите полностью уничтожить контейнер, используйте команду down.


ѕолезна ли ¬ам эта стать€?


Ёти статьи могут быть вам интересны: