Как отправить стек Docker Compose в Docker Swarm без загрузки контейнеров в реестр?

Я исследовал, прежде чем спрашивать здесь, но все ответы приводят меня к одному и тому же выводу:

  1. Создайте свой стек Docker Compose локально
  2. Пометьте и отправьте изображения в реестр (частный или общедоступный, например Docker Hub)
  3. Переместите стек в рой, используя docker stack deploy --compose-file docker-compose.yml stackdemo
  4. Отсюда стек берет и «вытягивает» образы из реестра и запускает контейнеры.

Нет ли простого способа заставить следующий (я думаю, здравый смысл) сценарий работать без проблем?

  1. У Docker Swarm Manager есть доступ (ключи SSH) для извлечения проекта из Git.
  2. Он периодически извлекает проект и строит его «локально», используя docker-compose up
  3. Когда сборка завершается успешно (контейнеры готовы), он отправляет стек в рой с помощью docker stack deploy, распространяя изображения на все рабочие узлы.
  4. Таким образом, исходный «исходный код» известен только узлу Manager, и только он имеет прямой доступ к репозиторию Git.

Ведение реестра (или оплата облачного) кажется огромным недостатком для использования Docker в режиме Swarm.

Боковое примечание: я пробовал подход развертывание реестра как службы в стеке и добавление тегов + отправка изображений в 127.0.0.1/myimage, но это привело к другому набору собственных проблем - например, тот факт, что рабочие узлы, на которых не запущен экземпляр контейнера реестра, не имеют доступа для извлечения образа (реестр необходимо реплицировать на все узлы).


person Dzhuneyt    schedule 07.03.2019    source источник


Ответы (2)


Используйте докер save и докер load, чтобы передавать образы с вашего компьютера разработчика на все ваши роевые машины.

person herm    schedule 07.03.2019

Docker swarm - это оркестровка, которая используется или предназначена для управления кластером docker node. Когда какая-либо служба развернута, механизм докеров может запустить ее на любом узле в кластере (узле, который удовлетворяет ограничениям размещения, если они предусмотрены). Теперь, если у кого-то нет реестра и изображения доступны на узле локально, докер не может проверить, все ли узлы указывают на одну и ту же версию изображения. Следовательно, swarm извлекает изображение из реестра и затем развертывает его на узлах.

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

Запустить реестр (по крайней мере, на localhost) очень просто, но ваш вопрос не в этом.

Переходя к вашему вопросу, вы можете сохранить файл стека компоновки в том же каталоге, где у вас есть Dockerfile, а затем в файле компоновки стека вы можете написать службу, которая получит сборку во время развертывания стека:

version: "3.9"

services:
  web:
    image: 127.0.0.1:5000/stackdemo
    build: .
    ports:
      - "8000:8000"

Здесь,

build: .

эта строка создает образ с заданными тегами имен в реестр на локальном хосте, но не проталкивается, что необходимо делать вручную. Итак, в Dockerfile вы можете написать git pull или git clone, а затем запустить команду для сборки кода и так далее.

Вот ссылка, которая предоставляет простые шаги для запуска реестра и создания образа на лету при развертывании стека: https://docs.docker.com/engine/swarm/stack-deploy/

Кроме того, рой не работает без реестра, поэтому невозможно просто сохранить и загрузить изображение и использовать его с оркестровкой роя.

person Saurabhcdt    schedule 12.05.2021