← До програми курсу

Модуль 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.

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. 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