Сборка многоархитектурных образов с помощью Docker Buildx
Одной из самых мощных функций Docker Buildx является его способность собирать образы для нескольких архитектур одновременно. На этом этапе мы узнаем, как создавать многоархитектурные образы.
Понимание многоархитектурных образов
Многоархитектурные образы позволяют одному и тому же имени образа работать на разных платформах (например, AMD64, ARM64 и т. д.). Docker автоматически выбирает подходящую версию для архитектуры хоста при извлечении образа.
Это особенно полезно для:
- Поддержки устройств на базе x86 и ARM
- Обеспечения работы ваших приложений у различных поставщиков облачных услуг
- Сборки для устройств IoT с разными архитектурами
Настройка для многоархитектурных сборок
Docker Buildx необходимо настроить для многоархитектурных сборок. Сначала убедимся, что наш сборщик поддерживает эту функцию:
docker buildx inspect --bootstrap mybuilder
Если вы видите ошибку о том, что сборщик недоступен, давайте воссоздадим его с правильной конфигурацией:
docker buildx rm mybuilder
docker buildx create --name mybuilder --driver docker-container --bootstrap --use
Создание многоархитектурного образа
Теперь давайте соберем наш образ Nginx для нескольких архитектур:
docker buildx build --platform linux/amd64,linux/arm64 -t nginx-test:multi .
Вы можете увидеть сообщение об ошибке, похожее на:
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
Это происходит потому, что драйвер Docker по умолчанию не поддерживает многоархитектурные сборки. Давайте изменим наш подход.
В демонстрационных целях мы будем собирать для конкретных платформ отдельно:
docker buildx build --platform linux/amd64 -t nginx-test:amd64 --load .
Это собирает образ специально для архитектуры AMD64 и загружает его в локальное хранилище образов Docker.
Использование аргументов сборки
Docker Buildx позволяет нам использовать аргументы сборки для настройки наших сборок. Давайте изменим наш Dockerfile, чтобы использовать аргумент сборки:
nano Dockerfile
Обновите содержимое Dockerfile до:
FROM ubuntu:22.04
ARG PACKAGE=nginx
RUN apt-get update && apt-get install -y \
curl \
${PACKAGE} \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Нажмите Ctrl+O, затем Enter для сохранения, затем Ctrl+X для выхода из nano.
Теперь мы можем собрать образ с пользовательским пакетом:
docker buildx build --build-arg PACKAGE=nginx-extras -t nginx-extras:latest .
Отправка в реестр (необязательно)
Чтобы в полной мере использовать многоархитектурные образы, вы обычно отправляете их в реестр. Для этого требуются учетные данные Docker Hub или частный реестр. В реальном сценарии команда будет выглядеть так:
## Example only - not required for this lab
## docker buildx build --platform linux/amd64,linux/arm64 -t username/nginx-test:multi --push .
Проверка образов
Давайте рассмотрим образы, которые мы создали:
docker images | grep nginx
Вы должны увидеть вывод, похожий на:
nginx-extras latest abcdef123456 1 minute ago 130MB
nginx-test amd64 123456abcdef 2 minutes ago 123MB
nginx-test latest fedcba654321 10 minutes ago 123MB
Тестирование нашего образа
Наконец, давайте запустим контейнер, используя наш образ, чтобы убедиться, что он работает:
docker run -d --name test-nginx -p 8080:80 nginx-test:latest
Проверьте, работает ли контейнер:
docker ps
Вы должны увидеть вывод, указывающий на то, что ваш контейнер работает:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abcdef123456 nginx-test:latest "nginx -g 'daemon of…" 10 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp test-nginx
Давайте выполним curl на сервере nginx, чтобы убедиться, что он отвечает:
curl http://localhost:8080
Вы должны увидеть HTML-страницу приветствия Nginx по умолчанию.
Когда закончите, очистите контейнер:
docker stop test-nginx
docker rm test-nginx
Поздравляем! Вы успешно поработали с Docker Buildx, поняли и решили ошибку "requires exactly 1 argument" и узнали, как создавать специализированные сборки для разных архитектур.