How's that again?

Docker Compose

https://docs.docker.com/compose/gettingstarted/

https://docs.docker.com/compose/compose-file/

Позволяет управлять приложениями, которые используют функциональность нескольких контайнеров сразу.

Создаем YAML-файл

C:/tutorial/docker-compose.yml

version: '2'

services:
tarantool:
container_name: mytarantool
image: tarantool/tarantool:1.7
command: tarantool /usr/local/share/tarantool/app.init.lua
ports:
  - 3301:3301
volumes:
  - c:/tarantool/app:/usr/local/share/tarantool
  - c:/tarantool/data:/var/lib/tarantool

Если не указан container_name, то будет использоваться одноименный с сервисом, т.е. в этом случае - tarantool.

Если в сервисе указать build: . - это означает искать Dockerfile в той же директории, что и compose-файл. Тогда он попытается сбилдится. (При установке kafka было такое, что из-за windows почему-то не мог сбилдиться докерфайл, пришлось заменить build на Image и использовать готовый)

ports - маппинг портов. Первый идет порт хоста, второй - порт контейнера.

volumes - маунт директорий хоста на директории контейнера. Сначала директория хоста, потом - контейнера.

environment - переменные среды

Создание и запуск контейнера

docker-compose -f C:/tutorial/docker-compose.yml up -d

При этом будут остановлены входящие контейнеры, а потом созданы и запущены заново.

-f - путь к compose-файлу

up - команда "создать и стартовать контейнер"

-d - аналогично detach в docker, стартовать в фоне

После этого желательно проверить запущенные контейнеры: docker-compose ps

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

Можно поднять только некоторые сервисы: docker-compose up service1

При этом зависимости будут подняты автоматически.

Чтобы зависимости не останавливались, не перестраивались и не поднимались, можно указать флаг --no-dep

Остановка и удаление

docker-compose -f C:/tarantool/docker-compose.yml down

Чтобы удалить все волюмы, созданные этим компоузом на диске хоста, нужно указать флаг --v:

docker-compose down --v

Логи

docker-compose logs service1 service2 - выдаст аггрегированный лог с этих двух сервисов

Построение образов

docker-compose build

Скачивание образов

docker-compose pull

Масштабирование

docker-compose up --scale service1=5 - запустит 4 дополнительных контейнера

Рестарт контейнера

docker-compose -f C:/tarantool/docker-compose.yml restart

Остановка сервиса

docker-compose stop kafka - остановятся все контейнеры, принадлежащие службе kafka

То есть если мы запускали с параметром --scale kafka=5, то остановятся все 5.

Если нужно остановить какой-то один, то можем сделать docker stop <id контейнера>, а id посмотреть через docker ps

А вот как завести какой-то один - не понятно, можно конечно через docker run, но если в docker-compose.yml прописаны какие-то специальные параметры запуска, и мы их не укажем, то может и не стартануть.

Поэтому на данный момент известен только один выход: docker start kafka - все остановленные контейнеры службы kafka перезапустятся.

Пример compose-файла для Kafka с 3 брокерами

version: '2' 
services: 
	zookeeper: 
		image: wurstmeister/zookeeper 
		ports: 
			- "2181:2181" 
	kafka0: 
		image: wurstmeister/kafka 
		ports: 
			- "9092:9092"
		environment: 
			KAFKA_ADVERTISED_HOST_NAME: 192.168.1.65
			KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
		volumes:
			- /var/run/docker.sock:/var/run/docker.sock
	kafka1: 
		image: wurstmeister/kafka 
		ports: 
			- "9093:9092"
		environment: 
			KAFKA_ADVERTISED_HOST_NAME: 192.168.1.65
			KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
		volumes:
			- /var/run/docker.sock:/var/run/docker.sock
	kafka2: 
		image: wurstmeister/kafka 
		ports: 
			- "9094:9092"
		environment: 
			KAFKA_ADVERTISED_HOST_NAME: 192.168.1.65
			KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
		volumes:
			- /var/run/docker.sock:/var/run/docker.sock