Docker compose

Теги: docker 

Основаня статья

Compose - это инструмент для определения и запуска многоконтейнерных приложений Docker. В Compose вы используете файл YAML для настройки служб вашего приложения. Затем с помощью одной команды вы создаете и запускаете все службы из своей конфигурации. Чтобы узнать больше обо всех функциях Compose, см. Список функций.

Compose работает во всех средах: production, staging, development, testing а так-же CI workflows. Вы можете узнать больше о каждом случае в разделе Common Use Cases.

Использование Compose - это, по сути, трехэтапный процесс:

  1. определите среды вашего приложения с помощью Dockerfile, чтобы его можно было воспроизвести где угодно.
  2. Определите службы, составляющие ваше приложение, в docker-compose.yml, чтобы их можно было запускать вместе в изолированной среде.
  3. Запустите docker compose up, и Docker compose comands запустит все ваше приложение.

Docker-compose.yml выглядит так:

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Дока compose

инстал

Пример использования

Step 1: setup

Создать папку проекта

mkdir composetest
cd composetest

Создать файл приложения

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)

Создать [requirements].txt

flask
redis

Step 2: Create a Dockerfile

# syntax=docker/dockerfile:1
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
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

Это дает:

  • Build an image starting with the Python 3.7 image.
  • Set the working directory to /code.
  • Set environment variables used by the flask command.
  • Install gcc and other dependencies
  • Copy requirements.txt and install the Python dependencies.
  • Add metadata to the image to describe that the container is listening on port 5000
  • Copy the current directory . in the project to the workdir . in the image.
  • Set the default command for the container to flask run.

Подробнее о [dockerfile-learn]

Step 3: Define services in a Compose file

docker-compose.yml

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

В данном случае определили два сервиса - web и [redis]

Web-сервис использует image, созданный из Dockerfile в текущем каталоге. Затем он связывает контейнер и хост-машину через открытый порт 5000. В этом примере службы используется порт по умолчанию для веб-сервера Flask, 5000.

Redis-сервис использует публичный [redis] image полученный из Docker Hub registry.

Step 4: Build and run your app with Compose

docker-compose up

Compose развернет имеджи и стартанет сервисы. Теперь можно посмотреть открытый порт локально: http://localhost:5000/ или http://127.0.0.1:5000

Можно посмотреть что запущено

docker image ls

И остановить приложение

docker-compose down

Step 5: Edit the Compose file to add a bind mount

Зададим привязку [docker-bind-mound] для web-сервиса

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

Новый ключ томов монтирует каталог проекта (текущий каталог) на хосте в /code внутрm контейнера, что позволяет вам изменять код на лету, без необходимости перестраивать образ. Ключ среды устанавливает переменную среды FLASK_ENV, которая сообщает flask run о запуске в режиме разработки и перезагрузке кода при изменении. Этот режим следует использовать только в разработке.

Step 6: Re-build and run the app with Compose

docker-compose up

Step 7: Update the application

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

Step 8: Experiment with some other commands

Detached mode - запуск сервисов в фоне

docker-compose up -d

Просмотр того, что в текущий момент запущено

docker-compose ps

Полный список команд

Далее:

Еще один пример для compose - веб сервис и база данных

The following is the docker-compose.yml for the application:

version: '2'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    env_file: .env
    depends_on:
      - db
    volumes:
      - ./webapp:/opt/webapp
  db:
    image: postgres:latest
    ports:
      - "5432:5432"
  redis:
    image: redis:alpine
    ports:
      - "6379:6379"

The first section defines the web service. It opens port 5000, sets environment variables defined in .env, and mounts our local code directory as a volume.

services:
  web:
    build: .
    ports:
      - "5000:5000"
    env_file: .env
    depends_on:
      - db
    volumes:
      - ./webapp:/opt/webapp

The next service is the [postgres] database, which opens port 5432 and uses the latest official Postgres image on Docker Hub.

db:
    image: postgres:latest
    ports:
      - "5432:5432"

This section defines our [redis] service, which opens port 6379 and uses the official Redis image on Docker Hub.

redis:
    image: redis:alpine
    ports:
      - "6379:6379"

Now that the local development environment is defined in docker-compose.yml, you can spin up all three services with one command:

docker-compose up

The following command confirms that all three containers are running:

docker ps
CONTAINER ID        IMAGE                COMMAND
8e422ff92239        python_web           "/bin/sh -c 'python a"
4ac9ecc8a2a3        python_db            "/docker-entrypoint.s"
2cbc8febd074        redis:alpine         "docker-entrypoint.sh"

Using Docker and defining your local development environment with Docker Compose provides you with a number of benefits:

  • By running Redis and Postgres in a Docker container, you don’t have to install or maintain the software on your local machine
  • Your entire local development environment can be checked into source control, making it easier for other developers to collaborate on a project
  • You can spin up the entire local development environment with one command: docker-compose up

Docker-compose поддерживается на [heroku]

официальная документация

Читай еще про [docker-swarm-rocks]

Про то как отправлять стек образов в [digital-ocean-container-registry] чиатй тут [2021-08-27-daily-note]

В конце этой заметки про ошибку синтаксиса в некоторых командах для compose: [2021-09-07-daily-note]

Environment variables in Compose. Env files для compose v2. Можно так (будут доступны все переменные, при совпадении последняя ихз последнего энва в списке):

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/runtime_opts.env

Смотри еще: