Изображение докера загружается через SSH (распространяется)

TL; DR В принципе, я ищу:

docker push myimage ssh://myvps01.vpsprovider.net/

Я не понимаю, что такое целая статья Docker Hub/Registry. Я знаю, что могу запустить частный реестр, но для этого мне нужно настроить инфраструктуру фактического запуска сервера.

Я заглянул внутрь внутренней работы Docker (ну, по крайней мере, в файловой системе), и похоже, что уровни образов Docker - это всего лишь куча tarballs, более или менее, с некоторыми сложными именами файлов. Я наивно думаю, что было бы невозможно взломать простой скрипт Python для распределения push/pull, но, конечно, я не пытался, поэтому я задаю этот вопрос.

Существуют ли какие-либо технические причины, по которым Docker не может просто распространять (без сервера) push/pull, например Git или Mercurial?

Я думаю, что это было бы огромной помощью, поскольку я мог просто подтолкнуть изображения, которые я построил на своем ноутбуке прямо на серверы приложений, вместо того, чтобы сначала нажать на сервер репо, а затем вытащить с серверов приложений. Или, может быть, я просто неправильно понял концепцию, и реестр - действительно важная функция, которая мне абсолютно необходима?

EDIT В каком-то контексте, который, надеюсь, объясняет, почему я хочу этого, рассмотрим следующий сценарий:

  • Разработка, тестирование, выполненное на моем ноутбуке (OSX, работающий на Docker-машине, использование докеров для определения сервисов и зависимостей)
  • Развертывание в живую среду с помощью скрипта (самозаписываемое, bash, несколько зависимостей от dev-машины, в основном, только Docker-машина)
  • Разверните новый VPS с очень небольшим количеством зависимостей, кроме SSH-доступа и Docker-демона.
  • Нет "постоянных" сервисов, работающих в любом месте, т.е. Я специально не хочу размещать постоянно действующий реестр (особенно недоступный для всех экземпляров VPS, хотя это, вероятно, можно было бы решить с помощью некоторого умного туннелирования SSH)

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

Ответ 1

Если вы хотите нажимать изображения докеров на заданный хост, в Докере уже есть все, чтобы это разрешить. В следующем примере показано, как нажать изображение докера с помощью ssh:

docker save <my_image> | ssh -C [email protected] docker load
  • docker save создаст tar-архив одного из ваших изображений докеров (включая его слои)
  • -C для ssh для сжатия потока данных
  • загрузка докера создает изображение докеры из tar-архива

Обратите внимание, что комбинация команды docker registry + docker pull имеет преимущество только при загрузке отсутствующих слоев. Поэтому, если вы часто обновляете изображение докеров (добавляете новые слои или изменяете несколько последних слоев), команда docker pull будет генерировать меньше сетевого трафика, чем нажатие полных изображений докеров через ssh.

Ответ 2

Сохранение/загрузка изображения на хост Docker и переход в реестр (частный или концентратор) - это две разные вещи.

Бывший @Thomasleveil уже обратился.

У последнего действительно есть "умники", чтобы только подталкивать нужные слои.

Вы можете легко проверить это самостоятельно с помощью частного реестра и нескольких образованных изображений.

Если у нас есть два изображения, а одно - из другого, то выполните:

docker tag baseimage myregistry:5000/baseimage
docker push myregistry:5000/baseimage

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

docker tag derivedimage myregistry:5000/derivedimage
docker push myregistry:5000/derivedimage

вы можете заметить, что нажимается только один слой - при условии, что ваш файл Docker был создан таким образом, что ему нужен только один уровень (например, привязка параметров RUN в соответствии с рекомендациями Dockerfile Best Practices).

На хосте Docker вы также можете запустить приватный приватный реестр.

См. Контейнерный реестр докеров

Насколько я знаю и на момент написания этого, механизм push/pull/query реестра не поддерживает SSH, а только HTTP/HTTPS. Это в отличие от Гит и друзей.

См. Insecure Registry о том, как запустить частный реестр через HTTP, особенно помните, что вам нужно изменить параметры механизма Docker и перезапустить его:

Откройте файл /etc/default/docker или /etc/sysconfig/docker для редактирования.

В зависимости от вашей операционной системы, параметры запуска демона Engine.

Измените (или добавьте) строку DOCKER_OPTS и добавьте флаг -insecure-registry.

Например, этот флаг использует URL вашего реестра.

DOCKER_OPTS = "- insecure-registry myregistrydomain.com:5000"

Закройте и сохраните файл конфигурации.

Перезапустите демона Docker

Вы также найдете инструкцию по использованию самозаверяющих сертификатов, позволяющую использовать HTTPS.

Использование самозаверяющих сертификатов

[...]

Это более безопасно, чем небезопасное решение для реестров. Вы должны настроить каждый демон докеров, который хочет получить доступ к вашему реестру

Generate your own certificate:

mkdir -p certs && openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \ -x509 -days 365 -out certs/domain.crt

Be sure to use the name myregistrydomain.com as a CN.

Use the result to start your registry with TLS enabled

Instruct every docker daemon to trust that certificate.

This is done by copying the domain.crt file to /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt.

Dont forget to restart the Engine daemon.