Перейти к содержанию

DevOps Core

devops-core — служебный блок, создающий общую Docker-сеть dh_network, в которой работают все остальные компоненты платформы. Самый маленький блок поставки: один контейнер-инициализатор, никакой конфигурации, никаких данных. Должен запускаться первым — без него остальные блоки не стартуют.

Зачем нужен отдельный блок

Альтернатива блоку — поместить определение сети прямо в docker-compose.yml одного из основных блоков (например, postgres или backend). Это работало бы, но создаёт неудобство: остановить такой блок (docker compose down) означало бы попытаться удалить сеть, что заблокировано пока к ней подключены другие контейнеры.

Вынесение определения сети в отдельный служебный блок devops-core развязывает жизненный цикл сети и жизненный цикл основных сервисов. Сеть создаётся один раз и живёт независимо от пересоздания postgres, backend и других блоков.

Структура блока

Каталог блока — /etc/datahub/devops-core/:

/etc/datahub/devops-core/
└── docker-compose.yml

В блоке нет .env, .env.template, томов или подкаталогов с данными. Это чисто служебный блок.

Файл docker-compose.yml:

networks:
  dh_network:
    name: dh_network
    driver: bridge
    ipam:
      config:
        - subnet: 10.203.0.0/24

services:
  dh_initializer:
    container_name: dh_initializer
    hostname: dh_initializer
    image: registry.gitlab.com/datahub/v3/services/busybox:main
    command: ["sh", "-c", "echo 'network ready'"]
    networks:
      - dh_network
    restart: "no"

Особенности:

  • Сеть определена внутри блока (не external) — devops-core единственный создаёт dh_network. Все остальные блоки подключаются к ней как к external.
  • driver: bridge — стандартный bridge-driver Docker. Не требует overlay или внешнего SDN.
  • subnet: 10.203.0.0/24 — выделенная подсеть для платформы, 254 адреса. Не должна пересекаться с другими сетями хоста и Docker.
  • busybox — минимальный образ для контейнера-инициализатора (несколько мегабайт).
  • command: ["sh", "-c", "echo 'network ready'"] — контейнер запускается, выводит сообщение и завершается. Его задача — заставить Docker Compose реально создать сеть. Без сервиса определение сети без services: не применяется.
  • restart: "no" — после однократного отработки контейнер dh_initializer находится в состоянии Exited (0). Это нормально. Сама сеть dh_network продолжает существовать.

Запуск

Первый запуск при установке:

cd /etc/datahub/devops-core
sudo docker compose up -d

После завершения dh_initializer команда docker network ls покажет сеть в списке. Проверка:

sudo docker network inspect dh_network --format '{{.Name}} {{.IPAM.Config}}'

Ожидаемый ответ — dh_network [{10.203.0.0/24 ... }].

После этого можно поднимать остальные блоки.

Жизненный цикл

В отличие от остальных блоков, devops-core не нуждается в постоянной работе контейнера. После того как docker compose up создал сеть dh_network, она существует во внутреннем состоянии Docker независимо от dh_initializer: переживает остановку контейнера, перезагрузку сервера и рестарт Docker daemon. Сеть удаляется только в двух случаях:

  • docker compose down в каталоге devops-coreпри условии, что к сети не подключены контейнеры других блоков. Если подключены — Docker откажется удалять сеть с ошибкой has active endpoints, и она останется в живых.
  • Явная команда docker network rm dh_network — также сработает только если к сети никто не подключён.

На обычно работающем сервере в выводе docker ps -a будет запись:

dh_initializer    Exited (0) <время>    busybox

Это нормальное состояние. Заново запускать dh_initializer после рестарта сервера не нужно — Docker Compose не пересоздаёт сеть, если она уже есть.

Когда нужно перезапустить

Перезапуск devops-core нужен только в особых случаях:

  • При изменении подсети 10.203.0.0/24 на другую (например, если она пересекается с корпоративной сетью). В таком сценарии нужно сначала остановить все блоки, удалить сеть, обновить docker-compose.yml и запустить заново.
  • При диагностике сетевых проблем — пересоздание сети может сбросить «застрявшие» сетевые правила.

Полный пересоздать-цикл:

cd /etc/datahub/nginx && sudo docker compose down
cd /etc/datahub/frontend && sudo docker compose down
cd /etc/datahub/backend && sudo docker compose down
cd /etc/datahub/rabbitmq && sudo docker compose down
cd /etc/datahub/postgres && sudo docker compose down
cd /etc/datahub/devops-core && sudo docker compose down

Затем — поднять devops-core и остальные блоки в обратном порядке.

Что дальше