Как машина узнаёт, где находится образ Linux (например, для контейнера)?

«Как машина узнаёт, где находится образ Linux (например, для контейнера)?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Система находит образ контейнера по его полному имени (FQDN), которое включает адрес реестра (registry), имя репозитория и тег или диджест. Механизм поиска зависит от контекста.

В Docker команда docker pull сначала проверяет локальный кеш. Если образа нет, Docker обращается к публичному Docker Hub (это registry по умолчанию) или к приватному registry, указанному в полном имени.

# Ищет в локальном кеше, затем качает с Docker Hub (registry-1.docker.io)
docker pull nginx:alpine

# Ищет и качает из приватного реестра GitLab
docker pull registry.gitlab.com/mygroup/myapp:latest

В Kubernetes путь к образу указывается в манифесте Pod или Deployment в поле spec.containers[].image. Kubelet на узле, используя Container Runtime Interface (CRI), выполняет аналогичную логику: проверяет локальный кеш и при необходимости обращается к удаленному registry.

apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  containers:
  - name: app
    image: nginx:1.25 # Скачается с Docker Hub
    # image: myprivateregistry.local:5000/app:v2 # Скачается с кастомного registry

Ключевые нюансы:

  • Аутентификация: Для приватных registry необходимо настроить секреты. В Kubernetes это imagePullSecrets, в Docker — логин через docker login.
  • Теги vs Диджесты: Тег (:latest) — это изменяемая метка. Диджест (nginx@sha256:a1b2c3...) — это криптографический хэш конкретного слоя образа, гарантирующий неизменность.
  • Локальные образы: Можно загрузить образ из tar-архива (docker load -i image.tar) или собрать локально (docker build). В этом случае registry не используется.