Pular para o conteúdo principal

Docker Buildx: Como criar imagens de contêineres multiplataforma

Saiba como o Docker Buildx amplia a criação tradicional de contêineres com suporte a várias plataformas, estratégias avançadas de armazenamento em cache e otimizações de desempenho. Este guia abrange tudo, desde conceitos básicos até técnicas avançadas.
Actualizado 15 de mai. de 2025  · 14 min de leitura

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

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:

  1. 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.
  2. 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.
  3. 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

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

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

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

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

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

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

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

Aprenda o poder do Docker e do Kubernetes com uma trilha interativa para criar e implantar aplicativos em ambientes modernos.
Inicie a trilha gratuitamente

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

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

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:

  1. 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.
  2. 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.
  3. 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.
  4. Ambientes consistentes: Todos os membros da equipe se conectam à mesma infraestrutura de compilação, eliminando problemas de "funciona no meu computador".
  5. 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 12 - Extensão do Docker para VSCode

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

Aprenda o poder do Docker e do Kubernetes com uma trilha interativa para criar e implantar aplicativos em ambientes modernos.

Dario Radečić's photo
Author
Dario Radečić
LinkedIn
Cientista de dados sênior baseado na Croácia. Principal redator técnico com mais de 700 artigos publicados, gerando mais de 10 milhões de visualizações. Autor do livro Automação do aprendizado de máquina com TPOT.
Temas

Saiba mais sobre o Docker com estes cursos!

Programa

Containerization and Virtualization with Docker and Kubernetes

13 hr
Learn the power of Docker and Kubernetes, this interactive track will allow you to build and deploy applications in modern environments.
Ver DetalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado

blog

O guia completo da certificação Docker (DCA) para 2024

Libere seu potencial no Docker e na ciência de dados com nosso guia abrangente. Explore as certificações do Docker, os caminhos de aprendizado e as dicas práticas.
Matt Crabtree's photo

Matt Crabtree

8 min

blog

Jupyter e R Markdown: Notebooks com R

Saiba como instalar, executar e usar o R com o Jupyter Notebook e o R Notebook do RStudio, incluindo dicas e alternativas
Karlijn Willems's photo

Karlijn Willems

15 min

blog

Contratos de dados desmistificados: Tudo o que você precisa saber

Obtendo escalabilidade em sistemas de dados distribuídos e reduzindo erros.
Mike Shakhomirov's photo

Mike Shakhomirov

11 min

Tutorial

Como instalar e configurar o MySQL no Docker

Saiba como instalar e configurar o banco de dados MySQL dentro de contêineres do Docker. O tutorial inclui conceitos como conexão com servidores MySQL, execução de clientes MySQL para conexão com contêineres e assim por diante.
Bex Tuychiev's photo

Bex Tuychiev

12 min

Tutorial

Como escrever um script Bash: um tutorial simples de scripts Bash

Descubra os fundamentos da criação de scripts Bash e aprenda a escrever um script Bash.
Kurtis Pykes 's photo

Kurtis Pykes

5 min

Tutorial

Desenvolvimento de back-end em Python: Um guia completo para iniciantes

Este guia completo ensina a você os fundamentos do desenvolvimento de back-end em Python. Aprenda conceitos básicos, estruturas e práticas recomendadas para você começar a criar aplicativos da Web.
Oluseye Jeremiah's photo

Oluseye Jeremiah

15 min

Ver maisVer mais