Используя docker-compose запустите 2 копии вашего демона.
- Первая копия слушает 8081 порт и прогоняет сообщение через figlet
- Вторая копия слушает 8082 порт и прогоняет сообщение через cowsay
И так, 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
Используя docker-compose запустите 2 копии вашего демона.