1

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

Эти серверы доступны только через обратные SSH-туннели, и сетевые подключения очень часто теряются. Пропускная способность в целом также довольно низкая (иногда только ~ 50 кбит / с или даже меньше).

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

Использование Docker репозитория и Docker Pull:

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

Использование docker save, rsync и docker load:

  1. Rsync позволяет продолжить частичную загрузку, мы можем начать загрузку и повторить попытку до конца.
  2. Можно сохранить и передать только все изображение, включая все слои. Таким образом, мы должны загрузить полное изображение, даже если только пара килобайт в верхнем слое изменилась по сравнению с предыдущей версией.

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

1 ответ1

0

Несколько идей приходят на ум

  1. Если вы создаете образы разумно, можете ли вы объединить оба метода и использовать rsync для начальной загрузки и извлечения докера для последующих обновлений (поскольку в этот момент он будет извлекать только измененные слои)

  2. Вы можете пометить больше слоев, чтобы вместо одного изображения Docker с 10 слоями у вас было 5 изображений Docker с 2 слоями. Вы можете разделить несколько файлов Docker или теги слоев по факту (подробности в "docker tag layerHash tagName" https://gist.github.com/dasgoll/476ecc7a057ac885f0be)

  3. Не очень хорошо, но вы должны иметь возможность экспортировать отдельные слои вместо целых изображений, указав хэш слоя. Единственная разница между слоями и "изображениями" состоит в том, что изображения имеют удобочитаемые теги, назначенные слою.

  4. Распакуйте экспортированное изображение, перенесите только новые слои и измените tar, объединив новые слои с кэшированными слоями (когда вы экспортируете изображение, это просто tar с 1 tar на слой внутри)

  5. Не используйте Docker для сборки - просто соберите и запустите. С этим вы просто перенесете rootfs (возможно, как обычные файлы и позволите rsync обрабатывать сжатие), затем заархивируете их и сделаете простой Dockerfile, который просто ADD rootfs.tar / и имеет команду run. Это гарантирует, что ничто не будет скопировано больше, чем необходимо

Вы также можете объединить эти подходы с чем-то вроде Bittorrent для распространения файлов

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .