Programa
Docker Buildx: Como criar imagens de contêineres multiplataforma
Criar contêineres para várias plataformas parece intimidador e demorado, mas você está prestes a ver que isso não é verdade.
O comando docker buildx
resolve esse desafio ampliando os recursos de compilação do Docker com recursos avançados, como criação de imagens multiplataforma, cache aprimorado e processamento de compilação paralela. Ele integra o mecanismo de compilação de última geração BuildKit diretamente na CLI do Docker. Com o comando buildx
, você criará imagens de contêineres menores, mais rápidas e mais seguras sem precisar aprender um conjunto de ferramentas totalmente novo.
Nos últimos anos, o Buildx se tornou mais ou menos essencial para as melhores práticas de DevOps e para o desenvolvimento de aplicativos nativos em nuvem. Ele simplifica os pipelines de CI/CD e ajuda você e sua equipe a fornecer aplicativos de forma consistente em diversos alvos de implementação, desde dispositivos IoT baseados em ARM até farms de servidores em nuvem.
> Você é novo no Docker? Nosso guia prático para iniciantes completos fará com que você comece a trabalhar em pouco tempo.
Neste artigo, orientarei você sobre as técnicas iniciantes e avançadas do docker buildx
.
Entendendo o Docker Buildx
Você provavelmente já usa o Docker, portanto conhece o comando padrão docker build
. No entanto, mais cedo ou mais tarde, isso começará a parecer limitante, especialmente quando os projetos se tornarem mais complexos.
> O Docker Buildx pressupõe que você tenha o Docker instalado. Se você não tiver e estiver executandoo gLinux, siga este guia para facilitar a instalação.
O Docker Buildx oferece a você uma experiência de compilação aprimorada que funciona com seu conhecimento existente. Não se trata de uma ferramenta separada que você precisa instalar - ela já vem com o Docker Desktop e o Engine desde a versão 19.03. O Buildx usa o BuildKit como base, que é o construtor de última geração do Docker que reescreve a forma como as imagens são criadas. Você notará compilações mais rápidas, imagens menores e suporte para recursos adicionais.
O salto de docker build
para docker buildx build
pode parecer pequeno - afinal, é apenas uma palavra - mas os recursos que você ganha são enormes.
Vamos explorar como o Buildx realmente funciona e o que o torna diferente do construtor legado.
Fundamentos arquitetônicos do Buildx
A magia do Buildx vem de seu design inteligente de cliente-servidor.
Quando você executa um comando Buildx, está usando a CLI do Docker como o cliente que se comunica com o daemon do BuildKit - o componente do servidor que lida com o trabalho pesado. Essa separação permite que o BuildKit faça coisas que o construtor legado não pode fazer, como executar estágios de construção em paralelo em vez de sequencialmente. As instruções do seu Dockerfile não precisam mais ser executadas uma após a outra, o que reduz significativamente o tempo de compilação quando você tem estágios independentes.
O modelo cliente-servidor também permite a execução de compilação remota. Você pode apontar sua CLI local do Docker para uma instância remota do BuildKit em execução em qualquer lugar, em um servidor de compilação robusto, na nuvem ou até mesmo em um cluster do Kubernetes. Essa flexibilidade significa que você não precisa utilizar os recursos do seu laptop para grandes compilações nem se preocupar com problemas de compatibilidade de arquitetura.
O design modular do BuildKit também permite que você conecte diferentes analisadores de front-end. A sintaxe do Dockerfile é a padrão, mas você pode usar formatos alternativos de definição de compilação se eles se adequarem melhor ao seu fluxo de trabalho.
Criar fluxo de processo
Quando você executa docker buildx build
, a CLI primeiro seleciona uma instância do construtor, que é a instância padrão ou a que você especificou. Seu contexto de compilação e o Dockerfile são enviados para o daemon do BuildKit, que analisa as instruções e cria um gráfico acíclico direcionado (DAG) de etapas de compilação. Ao contrário do construtor legado, que processa cada instrução sequencialmente, o BuildKit analisa esse gráfico para determinar quais etapas podem ser executadas em paralelo.
Em seguida, o construtor executa essas etapas usando algoritmos de cache eficientes que são muito mais inteligentes do que o antigo cache baseado em camadas. O BuildKit programa as entradas e saídas exatas de cada etapa, o que evita reconstruções desnecessárias quando nada de relevante tiver sido alterado. Ele também oferece suporte à distribuição da compilação em vários nós de trabalho para um processamento ainda mais rápido.
Após a criação, o Buildx pode exportar os resultados em diferentes formatos, não apenas como imagens do Docker. Você pode gerar saída para formatos OCI, diretórios locais ou tarballs, ou até mesmo ignorar totalmente a criação de imagens se quiser apenas testar o processo de compilação.
Você tem razão: esta seção poderia se beneficiar de mais exemplos práticos e visuais para demonstrar como o Buildx funciona em cenários do mundo real. Aqui está como eu o aprimoraria com mais exemplos de código e sugestões de imagens:
Funcionalidade e recursos principais
O Docker Buildx não se trata apenas de criar imagens com mais rapidez, embora isso seja definitivamente possível. Trata-se de expandir o que é possível com seus pipelines de compilação.
Vamos nos aprofundar nos recursos de destaque que fazem valer a pena considerar o Buildx para seu próximo projeto.
> Você está procurando um projeto Docker emdeas? Com essas 10 opções, você alinhará seu portfólio de DevOps.
Aplicativo Python usado
Para os fins deste artigo, criei um aplicativo simples do Python Flask. Para acompanhar o processo, crie três arquivos: app.py
, requirements.txt
e Dockerfile
.
Estes são os conteúdos de cada um:
app.py
from flask import Flask, render_template_string
import platform
import socket
import psutil
import datetime
app = Flask(__name__)
@app.route("/")
def home():
html = """
<!DOCTYPE html>
<html>
<head>
<title>Docker Buildx Python Demo</title>
<style>
body {
max-width: 800px;
}
.container {
border: 1px solid #ddd;
border-radius: 5px;
background-
}
.info {
}
.platform {
font-weight: bold;
}
</style>
</head>
<body>
<h1>Docker Buildx Multi-Platform Demo (Python)</h1>
<div class="container">
<div class="info">Hostname: {{ hostname }}</div>
<div class="info">Platform: <span class="platform">{{ os_platform }} ({{ architecture }})</span></div>
<div class="info">CPUs: {{ cpu_count }}</div>
<div class="info">Total Memory: {{ memory_mb }} MB</div>
<div class="info">Server Time: {{ server_time }}</div>
</div>
</body>
</html>
"""
return render_template_string(
html,
hostname=socket.gethostname(),
os_platform=platform.system(),
architecture=platform.machine(),
cpu_count=psutil.cpu_count(),
memory_mb=round(psutil.virtual_memory().total / (1024 * 1024)),
server_time=datetime.datetime.now().isoformat(),
)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
requirements.txt
flask==3.1.0
psutil==7.0.0
Dockerfile
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
Quando terminar, abra uma nova janela do Terminal e navegue até a pasta do projeto.
Construção de imagens multiplataforma
Criar imagens que funcionem em diferentes arquiteturas de CPU parece um pesadelo, mas o Buildx torna isso surpreendentemente simples.
Dê uma olhada neste comando:
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest .
Imagem 1 - Usando o Docker Buildx
Em resumo, ele permite que você crie imagens para várias arquiteturas simultaneamente. O Buildx lida com isso por meio de três abordagens inteligentes: ele pode usar o QEMU para emulação de arquitetura (permitindo que você crie imagens ARM em uma máquina x86), conectar-se a nós de construção nativos para cada plataforma de destino ou combinar os dois métodos para obter o desempenho ideal. O resultado é uma lista de manifestos de várias arquiteturas, às vezes chamada de "manifesto gordo", que contém variantes da sua imagem para cada plataforma.
Se você estiver implantando em diversos ambientes, como instâncias do AWS Graviton, clusters Raspberry Pi ou infraestrutura mista, esse suporte multiplataforma é crucial.
Estratégias de cache aprimoradas
O Buildx transforma completamente a forma como o cache de compilação funciona e, em geral, torna suas compilações mais rápidas.
O sistema implementa uma estratégia de cache de três camadas que vai além do cache de camada simples das compilações tradicionais do Docker:
- Incorporação de cache em linha: Primeiro, o Buildx usa um cache em linha incorporado às imagens, permitindo que você aproveite camadas em cache de compilações anteriores, mesmo em ambientes novos.
- Cache de compilação local: Em segundo lugar, ele oferece suporte a um cache de compilação local que é gerenciado de forma inteligente com base nas entradas de instruções de compilação, e não apenas na ordem delas.
- Cache baseado em registro: Terceiro, ele oferece cache baseado em registro que permite que você compartilhe o cache de compilação entre máquinas, perfeito para pipelines de CI/CD ou equipes distribuídas.
Com nosso aplicativo Python, vamos ver como podemos usar estratégias de cache local:
# Create a directory for local cache
mkdir -p buildx-cache
# First build - export cache to local directory
docker buildx build --cache-to type=local,dest=./buildx-cache -t myapp:latest .
# Make a small change to app.py
echo "# Small comment change" >> app.py
# Second build - use the local cache
docker buildx build --cache-from type=local,src=./buildx-cache -t myapp:latest .
A segunda compilação será muito mais rápida porque reutiliza as camadas armazenadas em cache da primeira compilação.
Imagem 2 - Estratégias de cache local
Você também pode usar o cache em linha, que incorpora metadados de cache na própria imagem:
docker buildx build --cache-to type=inline -t myapp:latest .
Você pode configurar esses back-ends de cache com sinalizadores simples como --cache-to
e --cache-from
, apontando para diretórios locais, repositórios de registro ou até mesmo serviços de cache especializados. Essa flexibilidade significa que suas compilações permanecem rápidas em diferentes ambientes sem sacrificar a reprodutibilidade.
Recursos de segurança
O Buildx inclui ferramentas que eliminarão as preocupações com a segurança de seus pensamentos.
Digamos que seu aplicativo Python precise acessar uma API meteorológica durante o processo de compilação. Em vez de codificar sua chave de API no Dockerfile, você pode usar segredos de compilação:
# Store your API key in a local file
echo "abc123yourweatherapikey" > ./api_key.txt
# Build with the secret
docker buildx build --secret id=weather_api_key,src=./api_key.txt -t myapp:latest .
Então, no seu Dockerfile, você pode acessar o segredo somente quando necessário:
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
# Create a config file using the secret at build time
RUN --mount=type=secret,id=weather_api_key \
echo "WEATHER_API_KEY=$(cat /run/secrets/weather_api_key)" > .env
EXPOSE 5000
CMD ["python", "app.py"]
Você pode verificar se a chave da API não está na imagem final verificando o histórico da imagem ou executando:
docker run --rm myapp:latest cat .env
Figura 3 - Gerenciando variáveis de ambiente
Em seu site app.py
, você poderia carregar a chave da API da seguinte forma:
import os
from dotenv import load_dotenv
load_dotenv() # Load variables from .env file
api_key = os.getenv("WEATHER_API_KEY", "")
# ...
Essa abordagem significa que sua chave de API sensível só estará disponível durante a etapa de compilação específica em que for necessária, mas não será salva em nenhuma das camadas de imagem. Qualquer pessoa que extraia sua imagem não conseguirá extrair sua chave de API, mesmo que inspecione as camadas da imagem.
Para aumentar a segurança, você também pode usar contêineres de compilação temporários que são removidos automaticamente após a compilação:
docker buildx build --secret id=weather_api_key,src=./api_key.txt --rm -t myapp:latest .
O sinalizador --rm
garante que todos os contêineres intermediários criados durante o processo de compilação sejam removidos, reduzindo ainda mais o risco de vazamento de credenciais.
Configuração operacional
A configuração do Buildx para o seu fluxo de trabalho requer apenas alguns comandos, mas a compreensão das opções ajuda você a tirar o máximo proveito dele.
Vamos nos aprofundar em como você pode configurar e gerenciar o Buildx em um ambiente local para atender às suas necessidades específicas.
Gerenciamento de instâncias do construtor
O Docker Buildx usa o conceito de "construtores" - instâncias separadas do BuildKit com diferentes recursos e configurações. Você pode criar vários construtores para diferentes finalidades.
Primeiro, vamos ver quais construtores você já tem:
docker buildx ls
Você verá um resultado semelhante a este:
Imagem 4 - Construtores disponíveis
Para criar uma nova instância do builder, execute os seguintes comandos:
# Create a new builder
docker buildx create --name mybuilder
# Switch to using that builder
docker buildx use mybuilder
# Bootstrap the builder (start it)
docker buildx inspect --bootstrap
Você pode verificar se ele está funcionando com:
# Check the status
docker buildx ls
Imagem 5 - Mudança para um construtor personalizado
Se você precisar remover um construtor, basta executar o seguinte:
docker buildx rm mybuilder
Manuseio de saída
O Buildx oferece opções flexíveis sobre o que fazer com as imagens que você cria. Você pode carregá-los diretamente no daemon do Docker local, exportá-los como tarballs ou salvá-los em um diretório local.
Vamos ver como você pode usar essas opções com nosso aplicativo Python:
# Load the image directly into Docker (default behavior)
docker buildx build --load -t myapp:latest .
# Export the image as a tarball
docker buildx build --output type=docker,dest=myapp.tar -t myapp:latest .
# Save the image contents to a local directory
docker buildx build --output type=local,dest=./image-output -t myapp:latest .
Depois de usar a exportação do tarball, você pode carregá-lo no Docker com:
docker load < myapp.tar
Imagem 6 - Carregando uma imagem de uma exportação de tarball
A saída do diretório local é particularmente útil para inspeção. Vamos dar uma olhada no que é criado:
ls -la ./image-output
Você verá o sistema de arquivos de imagem bruta:
Imagem 7 - Conteúdo da exportação do diretório local
Você pode até mesmo executar estágios específicos de compilação sem criar uma imagem final. Isso é útil para depurar ou testar etapas de compilação:
# Create a multi-stage Dockerfile
cat > Dockerfile.multi << 'EOF'
FROM python:3.13-slim AS base
WORKDIR /app
COPY requirements.txt .
FROM base AS dev-deps
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install pytest
FROM base AS prod-deps
RUN pip install --no-cache-dir -r requirements.txt
FROM prod-deps AS final
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
EOF
# Build only the dev-deps stage and export its filesystem
docker buildx build --file Dockerfile.multi --target dev-deps --output type=local,dest=./dev-deps-output .
Agora você pode inspecionar quais pacotes foram instalados no ambiente de desenvolvimento:
cat ./dev-deps-output/usr/local/lib/python3.13/site-packages/pytest/__init__.py
Figura 8 - Conteúdo do arquivo do estágio de desenvolvimento
Em resumo, essas opções de saída oferecem controle total sobre o destino das imagens criadas, quer você esteja depurando localmente ou preparando imagens para serem compartilhadas com sua equipe.
Domine o Docker e o Kubernetes
Casos de uso avançados
Até agora, mostrei a você comandos básicos do Buildx e casos de uso. Há muito mais que o Buildx pode fazer, sendo que alguns dos recursos são impossíveis de implementar com o construtor clássico.
Vamos explorar algumas técnicas avançadas para levar o seu fluxo de trabalho de conteinerização para o próximo nível.
Otimização de compilação em vários estágios
As compilações em vários estágios são um dos recursos mais avançados do Docker para criar imagens eficientes, e o Buildx as torna ainda melhores.
Para demonstrar, vamos criar um aplicativo Python otimizado com vários estágios:
# Dockerfile.optimized
FROM python:3.13-slim AS base
WORKDIR /app
COPY requirements.txt .
FROM base AS builder
RUN pip install --no-cache-dir --target=/install -r requirements.txt
FROM base AS linter
COPY --from=builder /install /usr/local/lib/python3.13/site-packages
COPY app.py .
RUN pip install pylint && pylint app.py || exit 0
FROM base AS tester
COPY --from=builder /install /usr/local/lib/python3.9/site-packages
COPY app.py .
RUN pip install pytest && python -m pytest app.py -v || exit 0
FROM python:3.13-alpine AS final
WORKDIR /app
COPY --from=builder /install /usr/local/lib/python3.13/site-packages
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
Com o Buildx, você pode criar isso com mais eficiência:
docker buildx build --file Dockerfile.optimized -t myapp:optimized --load .
Imagem 9 - Construções em vários estágios
Então, o que torna isso especial? O Buildx processa estágios independentes em paralelo. Enquanto o construtor legado executaria cada estágio sequencialmente, o Buildx identifica que os estágios linter
e tester
não dependem um do outro e os constrói simultaneamente.
Outro benefício adicional dessa otimização de compilação é a redução no tamanho do arquivo. Você pode verificar o tamanho da imagem executando o seguinte:
docker images myapp
Você verá algo parecido com isto:
Imagem 10 - Tamanhos de imagem do Docker
A imagem final baseada em alpinos é muito menor.
Integração do pipeline de CI/CD
Enquanto estiver trabalhando localmente, você ainda poderá definir as configurações do Buildx que espelham seu ambiente de CI/CD.
Para começar, crie um arquivo .dockerignore
para manter as compilações limpas:
.git
__pycache__
*.pyc
*.pyo
*.pyd
.Python
env
venv
*.so
.coverage
htmlcov
Em seguida, crie um script de compilação que imite o que o pipeline de CI pode fazer:
#!/bin/bash
# build.sh - Local CI/CD simulation
echo "Starting CI/CD build process..."
# Setup builder with emulation support
echo "Setting up builder..."
docker buildx create --name cibuilder --use || true
docker buildx inspect --bootstrap
# Run linting
echo "Running lint stage..."
docker buildx build --file Dockerfile.optimized --target linter .
# Run tests
echo "Running test stage..."
docker buildx build --file Dockerfile.optimized --target tester .
# Build for multiple platforms
echo "Building multi-platform image..."
docker buildx build --file Dockerfile.optimized \
--platform linux/amd64,linux/arm64 \
--tag myapp:$(date +%Y%m%d) \
--tag myapp:latest \
--load \
--progress=plain \
.
echo "Build process complete!"
Em linguagem simples, esse script faz o seguinte:
- Cria um construtor dedicado para CI/CD.
- Executa o estágio de linting.
- Executa o estágio de teste.
- Cria a imagem final multiplataforma com tags com controle de versão.
Agora a parte divertida: torne o script executável e o execute:
chmod +x build.sh
./build.sh
Edição local
Um ponto problemático comum ao trabalhar com o Docker é que, toda vez que você altera o arquivo de origem, precisa reconstruir a imagem e executar o contêiner. Isso leva muito tempo.
Aqui está a boa notícia: para o desenvolvimento local com iterações mais rápidas, você pode criar uma versão de desenvolvimento:
# Dockerfile.dev
FROM python:3.13-slim
WORKDIR /app
RUN pip install flask psutil python-dotenv
# Install development tools
RUN pip install pytest pylint watchdog
# Mount app code at runtime instead of copying
CMD ["python", "app.py"]
Execute-o com uma montagem de volume para recarregar o código em tempo real:
docker buildx build -f Dockerfile.dev -t myapp:dev --load .
docker run -it --rm -p 5000:5000 -v $(pwd):/app myapp:dev
Agora você pode editar o arquivo app.py
localmente, e as alterações serão refletidas imediatamente no contêiner em execução!
A seguir, vamos discutir o desempenho.
Considerações sobre o desempenho
Ninguém gosta de um fluxo de trabalho de desenvolvimento lento, e o poder da paralelização com o Docker Buildx pode ajudar.
Vamos explorar como otimizar suas compilações e aproveitar os recursos de desempenho do Buildx para criar imagens mais rapidamente.
Criar técnicas de paralelização
Uma das maiores vantagens do Buildx é sua capacidade de criar estágios em paralelo. O construtor tradicional do Docker executa cada etapa sequencialmente, mas o Buildx analisa seu Dockerfile e identifica quais etapas podem ser executadas ao mesmo tempo.
Para demonstrar, usarei dois arquivos: Dockerfile.standard
e Dockerfile.parallel
. Aqui estão os conteúdos de ambos:
Dockerfile.standard
FROM python:3.13-slim
WORKDIR /app
# System dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
g++ \
&& rm -rf /var/lib/apt/lists/*
# Python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Application code
COPY app.py .
# Linting
RUN pip install pylint && pylint app.py || true
EXPOSE 5000
CMD ["python", "app.py"]
Dockerfile.parallel
FROM python:3.13-slim AS python-base
WORKDIR /app
# Independent stage for installing system dependencies
FROM python-base AS system-deps
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
g++ \
&& rm -rf /var/lib/apt/lists/*
# Independent stage for installing Python dependencies
FROM python-base AS python-deps
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Independent stage for static code analysis
FROM python-deps AS linting
COPY app.py .
RUN pip install pylint && pylint app.py || true
# Final stage that combines dependencies
FROM python-base AS final
# Copy from system deps stage
COPY --from=system-deps /usr/bin/gcc /usr/bin/gcc
# Copy from Python deps stage
COPY --from=python-deps /usr/local/lib/python3.13/site-packages /usr/local/lib/python3.13/site-packages
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
Vamos avaliar como essa estrutura paralela melhora os tempos de construção:
# Time the standard sequential build
time docker build -t myapp:standard -f Dockerfile.standard .
# Time the parallel-optimized build with Buildx
time docker buildx build --load -t myapp:parallel -f Dockerfile.parallel .
Para referência, a compilação padrão levou 18,48 segundos, enquanto a compilação paralela levou apenas 1,17 segundos!
Para obter um desempenho ainda melhor, você pode tentar usar os sinalizadores --cache-from
e --cache-to
para aproveitar o cache de disco local:
# First build - create cache
docker buildx build --load -t myapp:latest --cache-to type=local,dest=./buildcache .
# Subsequent builds - use cache
docker buildx build --load -t myapp:latest --cache-from type=local,src=./buildcache .
Você também pode limitar o tamanho do contexto com arquivos .dockerignore
cuidadosos:
# Create a comprehensive .dockerignore
cat > .dockerignore << 'EOF'
.git
.github
.dockerignore
.pytest_cache
__pycache__
*.pyc
*.pyo
*.pyd
.Python
venv
env
node_modules
.coverage
htmlcov
.DS_Store
EOF
Resumindo, ao estruturar seus Dockerfiles com a paralelização em mente e aproveitar o cache avançado do Buildx, você passará menos tempo esperando por compilações e mais tempo desenvolvendo recursos.
Integração do ecossistema
O Docker Buildx não existe isoladamente. Ele foi criado para se integrar perfeitamente a outras ferramentas em seu ambiente de desenvolvimento.
Vamos explorar como o Buildx funciona com as ferramentas locais do desenvolvedor e torna o fluxo de trabalho do contêiner mais eficiente.
Criar clusters do Kubernetes
O Kubernetes oferece recursos avançados para executar operações distribuídas do Docker Buildx em um cluster. Ao integrar o Buildx com o Kubernetes, você pode obter compilações mais rápidas e resilientes que se adaptam às necessidades do seu projeto.
> Você é novo no Kubernetes? O Kubernetes vs Docker: Diferenças que todo desenvolvedor deve conhecer post é sua próxima parada.
Usar o Kubernetes para sua infraestrutura de compilação oferece algumas vantagens:
- Dimensionamento automático: O Kubernetes pode aumentar ou diminuir a escala dos nós do construtor com base na demanda, alocando recursos de forma eficiente em todo o cluster. Você pode até mesmo configurar regras de dimensionamento automático com base na utilização da CPU.
- Otimização de recursos: O agendamento do Kubernetes garante que suas compilações obtenham os recursos necessários sem sobrecarregar os nós individuais. Você pode definir limites de recursos e solicitações para garantir um desempenho consistente.
- Alta disponibilidade: Ao distribuir as instâncias do BuildKit em vários nós, sua infraestrutura de compilação permanece disponível mesmo que os nós individuais falhem.
- Ambientes consistentes: Todos os membros da equipe se conectam à mesma infraestrutura de compilação, eliminando problemas de "funciona no meu computador".
- Execução paralela: Construções complexas com muitos estágios podem ser executadas em paralelo em vários nós, reduzindo significativamente os tempos de construção. Um projeto que pode levar 15 minutos para ser desenvolvido localmente pode ser concluído em 3 a 4 minutos quando distribuído.
Considere esta uma seção mais "teórica", pois aprofundar-se no Kubernetes é um tópico avançado por si só.
Para começar, crie um arquivo chamado buildkit-deployment.yaml
com o seguinte conteúdo:
apiVersion: apps/v1
kind: Deployment
metadata:
name: buildkit
namespace: buildkit
spec:
replicas: 3
selector:
matchLabels:
app: buildkit
template:
metadata:
labels:
app: buildkit
spec:
containers:
- name: buildkit
image: moby/buildkit:latest
args:
- --addr
- tcp://0.0.0.0:1234
ports:
- containerPort: 1234
securityContext:
privileged: true
---
apiVersion: v1
kind: Service
metadata:
name: buildkit
namespace: buildkit
spec:
type: ClusterIP
ports:
- port: 1234
targetPort: 1234
selector:
app: buildkit
A próxima etapa é aplicar esse arquivo ao seu cluster do Kubernetes:
kubectl create namespace buildkit
kubectl apply -f buildkit-deployment.yaml
Por fim, conecte-se a essa implementação a partir de seu computador local:
docker buildx create --name k8s-builder \
--driver remote \
--driver-opt endpoint=tcp://<cluster-ip>:1234 \
--use
E é isso, você está pronto para começar!
Suporte ao plug-in do IDE
IDEs como o Visual Studio Code oferecem excelente integração com o Docker Buildx por meio de sua extensão Docker. Essa integração facilita o gerenciamento dos fluxos de trabalho do Buildx diretamente do seu ambiente de desenvolvimento.
Para começar a usar o Docker Buildx no VS Code, instale a extensão "Docker" do marketplace do VS Code.
Depois de instalado, você obterá vários recursos específicos do Buildx:
- Clique com o botão direito do mouse em qualquer Dockerfile para ver um menu de contexto com a opção "Build Image..." que oferece suporte ao Buildx.
- Acesso a argumentos de compilação, metas de plataforma e opções de saída por meio da interface do usuário.
- Capacidade de gerenciar e alternar entre diferentes instâncias do construtor.
- Integração com o terminal VS Code para executar comandos complexos do Buildx.
Imagem 11 - Extensão do Docker para VSCode
Aqui está um exemplo de personalização das tarefas do VS Code para usar o Buildx, criando um arquivo .vscode/tasks.json
:
{
"version": "2.0.0",
"tasks": [
{
"label": "Docker: Buildx Build",
"type": "shell",
"command": "docker buildx build --load -t ${input:imageName} .",
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "Docker: Buildx Multi-Platform",
"type": "shell",
"command": "docker buildx build --platform linux/amd64,linux/arm64 -t ${input:imageName} ."
}
],
"inputs": [
{
"id": "imageName",
"description": "Image name (with tag):",
"default": "myapp:latest",
"type": "promptString"
}
]
}
Com essa configuração, você pode acessar rapidamente comandos comuns do Buildx no menu Tarefas do VS Code(Terminal > Executar tarefa). A extensão também fornece realce de sintaxe útil para Dockerfiles e preenchimento automático para comandos comuns do Docker, o que torna o fluxo de trabalho do Buildx mais produtivo.
Solução de problemas e depuração
Toda ferramenta de desenvolvimento às vezes (com muita frequência) precisará de solução de problemas, e o Docker Buildx não é exceção. Nesta seção, apresentarei alguns problemas comuns para que você mesmo possa diagnosticá-los rapidamente e voltar ao programa.
Problemas e resoluções comuns
Ao trabalhar com o Buildx, você pode encontrar alguns desafios comuns. Aqui estão os problemas mais frequentes e suas soluções:
- A criação do construtor falha. Se você encontrar erros ao criar um construtor com
docker buildx create
, verifique sua versão do Docker:
docker version
O Buildx requer o Docker 19.03 ou mais recente. Se você estiver usando uma versão mais antiga, atualize o Docker para acessar os recursos do Buildx.
Para erros do tipo "no such plugin", verifique se o Buildx está instalado corretamente executando:
docker buildx version
- Falhas de compilação em várias plataformas. Ao compilar para várias plataformas com erros como "erro de formato de execução" ou "nenhum manifesto correspondente", verifique se o QEMU está instalado:
docker buildx inspect --bootstrap
Se necessário, instale emuladores de plataforma:
docker run --privileged --rm tonistiigi/binfmt --install all
- Problemas relacionados ao cache. Se você tiver problemas com o cache, tente limpar o cache de compilação local:
# Remove specific builder's cache
docker buildx prune -b mybuilder
# Remove all build cache
docker buildx prune --all
> O que exatamente é o comando Docker prune? Aprenda com vários exemplos práticos.
- Problemas de conexão do daemon do BuildKit. Se você vir a mensagem "failed to solve" ou erros de conexão, reinicie o construtor:
docker buildx rm mybuilder
docker buildx create --name mybuilder --use
docker buildx inspect --bootstrap
- Problemas relacionados ao desempenho. Para compilações lentas, experimente a saída de depuração para identificar gargalos:
docker buildx build --progress=plain --no-cache .
Essa saída detalhada ajuda a identificar quais estágios de compilação estão levando mais tempo, permitindo que você otimize seu Dockerfile de acordo.
- Falhas no comando "Load". Se você encontrar a mensagem "error: docker exporter does not currently support exporting manifest lists" ao usar o site
--load
com compilações multiplataforma, lembre-se de que não há suporte para o carregamento simultâneo de várias plataformas no daemon do Docker. Instead:
# Build for your current platform and load it
docker buildx build --platform linux/amd64 --load -t myapp:latest .
- Práticas de depuração. Para problemas mais complexos, essas abordagens de depuração ajudarão você:
# Enable BuildKit debug logs
BUILDKIT_DEBUG=1 docker buildx build .
# Inspect the builder's internal state
docker buildx inspect
# Check system requirements
docker info
# For specific stage failures, build only up to that stage
docker buildx build --target problem-stage .
# Verify your Docker context
docker context ls
Ao trabalhar sistematicamente com essas etapas de solução de problemas, você pode resolver a maioria dos problemas do Buildx e manter um fluxo de trabalho eficiente de criação de contêineres.
Resumindo o guia Docker Buildx
Cobrimos muitas coisas neste artigo do Docker Buildx! Você já viu como essa poderosa ferramenta pode tornar as compilações de contêineres mais rápidas e flexíveis.
Lembre-se dos principais benefícios: Você pode criar imagens para várias plataformas com um único comando, acelerar suas criações com cache avançado e manter suas imagens seguras com o gerenciamento adequado de segredos. As melhorias de desempenho são reais, especialmente quando você estrutura seus Dockerfiles para aproveitar a criação paralela.
Eu o utilizo o tempo todo em meu Macbook com chip M, pois nem todas as imagens estão disponíveis para ARM.
Não importa se você é um desenvolvedor individual ou faz parte de uma grande equipe, o Buildx oferece ferramentas que se adaptam ao seu fluxo de trabalho. Você pode executar compilações localmente, distribuí-las entre contêineres ou até mesmo escalar para clusters do Kubernetes à medida que suas necessidades aumentam.
Para saber mais sobre o Docker e o Docker Buildx, recomendo que você se inscreva nos seguintes cursos da DataCamp:
Domine o Docker e o Kubernetes
Saiba mais sobre o Docker com estes cursos!
Curso
Introduction to Docker
Curso
Intermediate Docker

blog
O guia completo da certificação Docker (DCA) para 2024
blog
Jupyter e R Markdown: Notebooks com R
blog
Contratos de dados desmistificados: Tudo o que você precisa saber

Mike Shakhomirov
11 min

Tutorial
Como instalar e configurar o MySQL no Docker
Tutorial
Como escrever um script Bash: um tutorial simples de scripts Bash
Tutorial
Desenvolvimento de back-end em Python: Um guia completo para iniciantes

Oluseye Jeremiah
15 min