Как использовать команду docker manifest create для создания многоархитектурных образов

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии (LabEx) вы узнаете, как создавать и управлять многоархитектурными Docker-изображениями с помощью команды docker manifest create. Многоархитектурные изображения являются важными для развертывания приложений в различных средах с разными CPU-архитектурами, такими как amd64 и arm64.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/push("Push Image to Repository") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/inspect -.-> lab-555169{{"Как использовать команду docker manifest create для создания многоархитектурных образов"}} docker/create -.-> lab-555169{{"Как использовать команду docker manifest create для создания многоархитектурных образов"}} docker/push -.-> lab-555169{{"Как использовать команду docker manifest create для создания многоархитектурных образов"}} docker/build -.-> lab-555169{{"Как использовать команду docker manifest create для создания многоархитектурных образов"}} end

Подготовка многоархитектурных изображений

На этом этапе мы подготовим многоархитектурные изображения. Многоархитектурные изображения позволяют создавать и отправлять изображения, которые могут работать на разных архитектурах, таких как amd64 и arm64. Это полезно для развертывания приложений в различных средах, включая облачные серверы, устройства реального времени (edge devices) и локальные компьютеры.

Сначала нам нужно включить экспериментальные функции в Docker. Это позволит нам использовать команду buildx, которая необходима для создания многоархитектурных изображений. Мы можем сделать это, создав или изменив файл конфигурации Docker.

Откройте файл конфигурации Docker с помощью nano:

nano ~/.docker/config.json

Если файл не существует, nano создаст его. Добавьте следующее содержимое в файл. Если файл уже существует, добавьте строку "experimental": "enabled" в основной JSON-объект.

{
  "experimental": "enabled"
}

Сохраните файл, нажав Ctrl + X, затем Y и Enter.

Далее нам нужно создать новый экземпляр сборщика (builder instance), который поддерживает несколько архитектур. Экземпляр сборщика - это компонент Docker, который управляет процессом сборки.

Создайте новый экземпляр сборщика с именем mybuilder:

docker buildx create --name mybuilder --use

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

Теперь давайте создадим простое многоархитектурное изображение. Мы будем использовать базовый Dockerfile, который создает изображение на основе Alpine Linux.

Создайте каталог для нашего проекта и перейдите в него:

mkdir ~/project/multiarch-demo
cd ~/project/multiarch-demo

Создайте Dockerfile в этом каталоге:

nano Dockerfile

Добавьте следующее содержимое в Dockerfile:

FROM alpine:latest
CMD ["echo", "Hello from multi-architecture image!"]

Сохраните Dockerfile, нажав Ctrl + X, затем Y и Enter.

Теперь создайте изображение для архитектур linux/amd64 и linux/arm64 и отправьте его в фиктивный реестр. Мы будем использовать localhost:5000 в качестве заглушки для реестра. В реальной ситуации вы замените это на адрес своего реального реестра.

Создайте и отправьте многоархитектурное изображение:

docker buildx build --platform linux/amd64,linux/arm64 -t localhost:5000/multiarch-demo:latest --push .

Эта команда создает изображение для указанных платформ (linux/amd64 и linux/arm64), помечает его как localhost:5000/multiarch-demo:latest и отправляет его в реестр localhost:5000. В выводе будет показан процесс сборки для каждой архитектуры и операция отправки.

Создание списка манифестов для изображений

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

Мы будем использовать команду docker manifest create для создания списка манифестов. Эта команда принимает имя списка манифестов, который вы хотите создать, а затем имена изображений, которые вы хотите включить в список.

Создайте список манифестов с именем localhost:5000/multiarch-demo:latest:

docker manifest create localhost:5000/multiarch-demo:latest \
  localhost:5000/multiarch-demo:latest@sha256:$(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | head -n 1) \
  localhost:5000/multiarch-demo:latest@sha256:$(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | tail -n 1)

Разберем эту команду на части:

  • docker manifest create localhost:5000/multiarch-demo:latest: Здесь указывается имя списка манифестов, который мы создаем.
  • localhost:5000/multiarch-demo:latest@sha256:...: Это изображения, которые мы добавляем в список манифестов. Мы используем имя изображения, за которым следует @sha256: и дайджест (хэш-сумма) изображения. Дайджест уникально идентифицирует определенный слой изображения.
  • $(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | head -n 1): Эта цепочка команд извлекает дайджест первого изображения, перечисленного в результате выполнения docker buildx imagetools inspect.
  • $(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | tail -n 1): Эта цепочка команд извлекает дайджест второго изображения, перечисленного в результате выполнения docker buildx imagetools inspect.

Результатом выполнения команды docker manifest create будет дайджест только что созданного списка манифестов.

Проверка созданного списка манифестов

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

Мы будем использовать команду docker manifest inspect для просмотра деталей списка манифестов.

Проверьте список манифестов localhost:5000/multiarch-demo:latest:

docker manifest inspect localhost:5000/multiarch-demo:latest

Результатом выполнения этой команды будет JSON-документ, описывающий список манифестов. Вы должны увидеть массив "manifests", каждый из которых представляет изображение для другой архитектуры. Найдите поле "platform" в каждой записи манифеста, чтобы увидеть архитектуру и операционную систему. Вы должны увидеть записи как для linux/amd64, так и для linux/arm64.

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

Отправка списка манифестов в реестр

На этом этапе мы отправим созданный список манифестов в реестр. Отправка списка манифестов делает его доступным для других пользователей, которые могут скачать многоархитектурное изображение. Когда кто-то скачивает изображение с использованием тега списка манифестов, Docker автоматически загрузит правильное изображение для архитектуры их системы.

Мы будем использовать команду docker manifest push для отправки списка манифестов.

Отправьте список манифестов localhost:5000/multiarch-demo:latest в реестр:

docker manifest push localhost:5000/multiarch-demo:latest

Эта команда отправляет список манифестов и все изображения, на которые он ссылается, в указанный реестр (localhost:5000). Поскольку мы уже отправили отдельные изображения на первом этапе с помощью команды docker buildx build --push, эта команда в основном отправляет сам список манифестов.

Вывод команды покажет прогресс отправки списка манифестов.

После отправки списка манифестов вы можете проверить, что он доступен в реестре. Хотя в этой лабораторной среде у нас нет работающего реестра для прямого запроса, успешное выполнение команды docker manifest push указывает на то, что список манифестов готов к отправке.

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

Резюме

В этой лабораторной работе мы научились готовить многоархитектурные изображения с использованием Docker. Это включает в себя включение экспериментальных функций в Docker для использования команды buildx, которая является важной для создания изображений, совместимых с различными архитектурами, такими как amd64 и arm64. Мы настроили клиент Docker, изменив файл config.json для включения экспериментальных функций. Затем мы создали новый экземпляр сборщика с именем mybuilder с помощью команды docker buildx create --name mybuilder --use, который способен управлять многоархитектурными сборками. Наконец, мы настроили базовую директорию проекта и создали простой Dockerfile на основе Alpine Linux в качестве основы для создания нашего многоархитектурного изображения.