Как запустить контейнер на удаленном хосте докеров с помощью Jenkins

У меня два сервера:

  • Сервер A: сборка сервера с установленными Jenkins и Docker.
  • Сервер B: рабочий сервер с установленным Docker.

Я хочу создать образ Docker на сервере A, а затем запустить соответствующий контейнер на сервере B. Тогда возникает вопрос:

Каков рекомендуемый способ запуска контейнера на сервере B с сервера A после того, как Jenkins завершит сборку докеров? Нужно ли мне отправлять образ в концентратор Docker, чтобы вывести его на сервер B, или я могу каким-то образом передать образ напрямую?

Я действительно не ищу конкретные плагины Jenkins или что-то в этом роде, а, скорее, с точки зрения безопасности и архитектуры, какой лучший подход для этого?

Я прочитал тонну сообщений и ТАК ответов по этому поводу и понял, что есть много способов сделать это, но я все еще не уверен, каков наиболее распространенный способ сделать это. Я видел эти альтернативы:

  • Использование docker-machine
  • Использование Docker Restful Remote API
  • Использование обычного ssh [email protected] "docker run ..."
  • Использование Docker Swarm (я супер-новичок, поэтому я все еще не уверен, подходит ли это вообще для моего варианта использования)

Редактировать:

Я использую серверы A и B в Digital Ocean.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
3
0
7 973
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Образ Docker можно сохранить в обычный tar-архив:

docker image save -o <FILE> <IMAGE>

Документы здесь: https://docs.docker.com/engine/reference/commandline/image_save/

Затем scp с этим tar-архивом на другой хост и запустите docker load для загрузки образа:

docker image load -i <FILE>

Документы здесь: https://docs.docker.com/engine/reference/commandline/image_load/

Этот метод save-scp-load используется редко. Обычный подход - настроить частный реестр Docker за вашим брандмауэром. И отправлять изображения в этот частный реестр или извлекать из него. Этот документ описывает как развернуть реестр контейнеров. Или вы можете выбрать услугу реестра, предоставляемую третьей стороной, например Реестр контейнеров Gitlab.

Спасибо, это полезно. Интересно, какой общий подход используется в отрасли? Чтобы запихнуть образ в реестр и вытащить его в докер-хост? или передавать образы со сборки на прод-серверы через scp?

Carlos Roso 27.03.2018 06:03

Обычный подход - настроить частный реестр Docker за вашим брандмауэром. И отправлять изображения в этот частный реестр или извлекать из него.

Yuankun 27.03.2018 06:05

Отлично, спасибо большое, чувак. Не могли бы вы дополнить свой ответ этим последним замечанием? Тогда я отмечу его как принятый.

Carlos Roso 27.03.2018 18:25

Обновил мой исходный ответ.

Yuankun 27.03.2018 18:43

При использовании репозиториев Docker вы нажимаете / вытягиваете только те слои, которые были изменены. Вы можете использовать Докер REST API. Плагин Jenkins HTTP Request можно использовать для выполнения HTTP-запросов. Вы можете запускать команды Docker непосредственно на удаленном хосте Docker, задав переменную среды DOCKER_HOST. Чтобы экспортировать переменную среды в текущую оболочку:

export DOCKER_HOST = "tcp://your-remote-server.org:2375"

Помните о проблемах безопасности при разрешении TCP-трафика. Больше информации. Другой способ - использовать подключаемый модуль агента SSH в Jenkins.

Другие вопросы по теме