Construindo Imagens Multi-Arquitetura com Docker Buildx
Uma das características mais poderosas do Docker Buildx é sua capacidade de construir imagens para múltiplas arquiteturas simultaneamente. Nesta etapa, aprenderemos como criar imagens multi-arquitetura.
Entendendo Imagens Multi-Arquitetura
Imagens multi-arquitetura permitem que o mesmo nome de imagem funcione em diferentes plataformas (como AMD64, ARM64, etc.). O Docker seleciona automaticamente a versão apropriada para a arquitetura do host quando a imagem é puxada.
Isso é especialmente útil para:
- Suportar dispositivos baseados em x86 e ARM
- Garantir que seus aplicativos sejam executados em vários provedores de nuvem
- Construir para dispositivos IoT com diferentes arquiteturas
Configurando para Construções Multi-Arquitetura
O Docker Buildx precisa ser configurado para construções multi-arquitetura. Primeiro, vamos garantir que nosso builder suporte este recurso:
docker buildx inspect --bootstrap mybuilder
Se você vir um erro sobre o builder não estar disponível, vamos recriá-lo com a configuração correta:
docker buildx rm mybuilder
docker buildx create --name mybuilder --driver docker-container --bootstrap --use
Criando uma Imagem Multi-Arquitetura
Agora, vamos construir nossa imagem Nginx para múltiplas arquiteturas:
docker buildx build --platform linux/amd64,linux/arm64 -t nginx-test:multi .
Você pode ver uma mensagem de erro semelhante a:
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
Isso acontece porque o driver Docker padrão não suporta construções multi-arquitetura. Vamos modificar nossa abordagem.
Para fins de demonstração, construiremos para plataformas específicas separadamente:
docker buildx build --platform linux/amd64 -t nginx-test:amd64 --load .
Isso constrói a imagem especificamente para a arquitetura AMD64 e a carrega no armazenamento local de imagens do Docker.
Usando Argumentos de Construção
O Docker Buildx nos permite usar argumentos de construção para personalizar nossas construções. Vamos modificar nosso Dockerfile para usar um argumento de construção:
nano Dockerfile
Atualize o conteúdo do Dockerfile para:
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;"]
Pressione Ctrl+O seguido por Enter para salvar, depois Ctrl+X para sair do nano.
Agora podemos construir a imagem com um pacote personalizado:
docker buildx build --build-arg PACKAGE=nginx-extras -t nginx-extras:latest .
Enviando para um Registro (Opcional)
Para utilizar totalmente imagens multi-arquitetura, você normalmente as enviaria para um registro. Isso requer credenciais do Docker Hub ou um registro privado. Em um cenário real, o comando seria semelhante a:
## Exemplo apenas - não é necessário para este laboratório
## docker buildx build --platform linux/amd64,linux/arm64 -t username/nginx-test:multi --push .
Inspecionando Imagens
Vamos examinar as imagens que criamos:
docker images | grep nginx
Você deve ver uma saída semelhante a:
nginx-extras latest abcdef123456 1 minute ago 130MB
nginx-test amd64 123456abcdef 2 minutes ago 123MB
nginx-test latest fedcba654321 10 minutes ago 123MB
Testando Nossa Imagem
Finalmente, vamos executar um contêiner usando nossa imagem para verificar se ela funciona:
docker run -d --name test-nginx -p 8080:80 nginx-test:latest
Verifique se o contêiner está em execução:
docker ps
Você deve ver uma saída indicando que seu contêiner está em execução:
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
Vamos usar o curl no servidor nginx para garantir que ele esteja respondendo:
curl http://localhost:8080
Você deve ver a página de boas-vindas padrão do Nginx em HTML.
Quando terminar, limpe o contêiner:
docker stop test-nginx
docker rm test-nginx
Parabéns! Você trabalhou com sucesso com o Docker Buildx, entendeu e resolveu o erro "requires exactly 1 argument" e aprendeu como criar construções especializadas para diferentes arquiteturas.