← К программе курса

Модуль 8 / 24

Registry и immutable images

DOCKER SWARM

Содержание
01

1. Цели и результат модуля

После модуля вы сможете объяснить роль registry, публиковать версии образа, фиксировать deployment по digest и диагностировать image pull.

  • различать tag и digest
  • проверять доверие TLS registry
  • подтверждать одинаковый image на всех nodes
  • читать Rejected task при отсутствующем manifest
02

2. Теория: registry и distribution

Registry хранит content-addressed layers и manifests. Push загружает недостающие blobs и связывает manifest с tag. Каждый node самостоятельно получает image перед запуском task, поэтому registry и его CA должны быть доступны всем nodes.

Production registry требует TLS, аутентификации, контроля доступа, резервного копирования и очистки. Учебный registry доступен только в сети 10.77.0.0/24 и использует временный сертификат.

03

3. Теория: mutable tags и immutable digests

Tag — изменяемый указатель: повторный push может направить v1 или latest на другой manifest. Digest sha256 идентифицирует конкретный manifest по содержимому. Ссылка repository@sha256 фиксирует deployment и делает аудит и rollback воспроизводимыми.

Одинаковое имя tag в кэше разных nodes не доказывает одинаковое содержимое. Проверяйте RepoDigests и сохранённое поле ContainerSpec.Image.

04

4. Теория: разрешение образа

Manager пытается разрешить tag до digest при создании service. Если registry недоступен, nodes могут разрешать tag независимо, что Docker прямо отмечает предупреждением. Явный digest устраняет эту неоднозначность, но не заменяет доступность registry для nodes без layers.

05

5. Методические указания

  • Не публикуйте credentials в manifest или shell history
  • Проверяйте SAN сертификата и CA на каждом node
  • Используйте отдельные repositories и неизменяемые version tags
  • Записывайте digest из результата push
  • Развёртывайте production service по digest
  • Ошибку pull воспроизводите отдельным service и удаляйте после наблюдения
06

6. Лабораторная работа: registry и две версии

Инструктор заранее запускает временный TLS registry на 10.77.0.11:5000, устанавливает его CA на три nodes, собирает и публикует v1 и v2. Проверьте API и два разных RepoDigests. Значения ниже получены в этой лаборатории; при повторном build используйте новые digests из push.

terminal
ssh swarm-manager-1 curl --fail --silent --show-error --cacert /etc/docker/certs.d/10.77.0.11:5000/ca.crt https://10.77.0.11:5000/v2/
ssh swarm-manager-1 docker image inspect 10.77.0.11:5000/swarm-m08/web:v1 --format '{{index .RepoDigests 0}}'
ssh swarm-manager-1 docker image inspect 10.77.0.11:5000/swarm-m08/web:v2 --format '{{index .RepoDigests 0}}'
07

7. Лабораторная работа: deployment v1 по digest

Создайте три replicas по точному digest v1. service ps должен показать Running task на каждом node, а inspect — неизменяемую ссылку.

terminal
ssh swarm-manager-2 docker service create --detach=true --name swarm-m08-web --replicas 3 10.77.0.11:5000/swarm-m08/web@sha256:50b6bd7de1feea427f59c5499869be57a3e288728b0e6c770acd8005bf2ca5d0
ssh swarm-manager-2 docker service ps swarm-m08-web --no-trunc
ssh swarm-manager-2 docker service inspect swarm-m08-web --format '{{.Spec.TaskTemplate.ContainerSpec.Image}}'
08

8. Лабораторная работа: immutable update

Обновите spec на digest v2 и дождитесь convergence. История tasks должна связать старый и новый digest без зависимости от значения tag.

terminal
ssh swarm-manager-2 docker service update --detach=false --image 10.77.0.11:5000/swarm-m08/web@sha256:610682351bdcbeca24ec8de18b705505ec4baafbd401b39438c9e6b3b1d76256 swarm-m08-web
ssh swarm-manager-2 docker service inspect swarm-m08-web --format '{{.Spec.TaskTemplate.ContainerSpec.Image}}'
ssh swarm-manager-2 docker service ps swarm-m08-web
09

9. Диагностика image pull

Создайте отдельный service с отсутствующим tag. Ожидается Rejected с manifest not found; удалите его в cleanup. TLS unknown authority, timeout и denied означают другие уровни проблемы.

terminal
ssh swarm-manager-2 docker service create --detach=true --name swarm-m08-missing --replicas 1 10.77.0.11:5000/swarm-m08/web:missing
ssh swarm-manager-2 docker service ps swarm-m08-missing --no-trunc
terminal
ssh swarm-manager-2 docker service ps swarm-m08-web --no-trunc
ssh swarm-manager-1 docker pull 10.77.0.11:5000/swarm-m08/web:v2
ssh swarm-manager-1 journalctl -u docker --since today
  • x509 — неверная CA, SAN или срок
  • connection refused — registry недоступен
  • denied — ошибка auth/authorization
  • not found — repository, tag или digest отсутствует
10

10. Контроль, критерии освоения и cleanup

  • Почему tag считается mutable?
  • Что идентифицирует digest?
  • Когда manager не может закрепить tag?
  • Почему registry нужен каждому node?
  • Чем not found отличается от x509?
  • Что требуется production registry сверх этой лаборатории?

Модуль освоен, если вы публикуете разные manifests, развёртываете и обновляете по digest и точно классифицируете pull failure.

Удалите сервисы. Инструктор также удаляет временный registry, данные, CA, ключ и локальные учебные образы.

terminal
ssh swarm-manager-2 docker service rm swarm-m08-web swarm-m08-missing
ssh swarm-manager-2 docker service ls
ssh swarm-manager-2 docker node ls