Докер / Основы docker-compose

И так, docker-compose – это фиговина которая позволяют виртуозно управлять несколькими контейнерами и реализовать взаимодействие между ними.

Ставим docker compose

sudo apt-get install docker-compose-plugin

после установки (с большой вероятностью он уже будет установлен) проверяем версию

docker compose version

выдаст что-то такое

теперь создадим docker-compose файлик, в котором пропишем наше сервисы. Создаем файлик docker-compose.yml и прописываем в него

version: "3.9"
services:
  daemon1:
    build: .
    ports:
      - "8080:8081"
  daemon2:
    build: .
    ports:
      - "8080:8082"      

мы прописали тут две копии нашего демона. У меня по умолчанию сервер использует порт 8080. Но казалось бы я не могу повесить два демона на один порт. Возможно некоторые из вас даже уже сталкивались с ошибкой Address already in use.

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

А так как я хочу иметь возможность подключаться к этим приложениям извне я говорю, что я хочу чтобы порт 8080 внутри докер контейнер мэпился в порт 8081 основной системы для первой копии демона и в 8082 для второй копии демона.

Попробуем запустить. Пишем:

docker compose up

эта команда автоматически запускает два контейнера по одному на каждого демона и начинает показывать их логи.

можно коннектится к разным контейнерам используя адрес localhost (ссылка на самого себя) типа так

сейчас у нас контейнеры запустились в режиме реального времени, и они блокируют консоль логами. Чтобы запустить контейнеры в режиме демона просто остановите логи через Ctrl+C

а затем запустите уже контейнеры в демон-режиме командой

docker compose up -d

Если захочется помониторить их логи, то можно использовать команду

docker compose logs -f

если хочется посмотреть лог только одного демона то

docker compose logs daemon1 -f

еще если хотите, чтобы docker запускался автоматически при перезапуске добавьте в docker-compose restart: always, вот так:

version: "3.9"
services:
  daemon1:
    build: .
    ports:
      - "8081:8080"
    restart: always
  daemon2:
    build: .
    ports:
      - "8082:8080"
    restart: always

активируйте сервис docker, остановите и заново запустите контейнеры

sudo systemctl enable docker
docker compose stop
docker compose up -d

теперь если перезапустить систему, а после перезапуска выполнить команду docker container list будет видно что-то в этом роде.

Теперь, как же нам разное поведение задать, для этого у нас есть возможность передать параметры в docker-compose.

Правда для этого надо подкрутить файлик Dockerfile вместо CMD использовать ENTRYPOINT

FROM ubuntu:20.04

// ...

COPY bin/Debug/net6.0/ /opt/

ENTRYPOINT ["/opt/daemon"] # заменил тут CMD на ENTRYPOINT

и теперь можно запустить docker-compose.yml добавить туда параметры через узел command вот так:

version: "3.9"
services:
  daemon1:
    build: .
    ports:
      - "8081:8080"
    restart: always
    command: -f figlet
  daemon2:
    build: .
    ports:
      - "8082:8080"
    restart: always
    command: -f cowsay

и теперь эти параметры можно обрабатывать через CommandLineParser

5.2

Используя docker-compose запустите 2 копии вашего демона.

  1. Первая копия слушает 8081 порт и прогоняет сообщение через figlet
  2. Вторая копия слушает 8082 порт и прогоняет сообщение через cowsay