DEV Community

Cover image for Por Que Usar Alpine Linux para Criar Imagens Docker Mais Leves?
Rodolffo Nivass
Rodolffo Nivass

Posted on

Por Que Usar Alpine Linux para Criar Imagens Docker Mais Leves?

Um pouco de História:

1 A Origem do Alpine Linux¹

O Alpine Linux nasceu de um contexto de restrição e criatividade. Sua história remonta ao Projeto LEAF (Linux Embedded Appliance Framework), uma coleção de distribuições Linux voltadas para aplicações de rede, como roteadores e firewalls, especialmente em hardware antigo ou de recursos limitados. O LEAF, por sua vez, foi um fork do Linux Router Project (LRP), famoso por rodar Linux a partir de um único disquete.

O Alpine se destacou por adotar componentes enxutos e priorizar segurança e simplicidade. Seu foco sempre foi entregar um sistema operacional mínimo, eficiente e seguro, ideal para ambientes onde cada megabyte conta. Com o tempo, Alpine se tornou referência para quem busca criar sistemas embarcados, containers e appliances de rede robustos, mas extremamente leves.

A filosofia do Alpine é clara: menos é mais. Ele oferece um ambiente Linux completo, mas sem desperdício de recursos, permitindo que desenvolvedores instalem apenas o necessário para suas aplicações. Isso se reflete em seu gerenciador de pacotes (apk), no uso do sistema de inicialização OpenRC e em configurações baseadas em scripts simples.

¹ Alpine Linux:Overview

2 A História dos Containers

A ideia de containers não é nova, mas ganhou tração com o surgimento do Docker em 2013. Antes disso, tecnologias como chroot² e jails³ já permitiam algum grau de isolamento de processos no Linux e BSD. O Docker revolucionou ao simplificar a criação, distribuição e execução de containers, tornando-os acessíveis a desenvolvedores e equipes de DevOps no mundo todo.

O Docker introduziu o conceito de imagens imutáveis, camadas reutilizáveis e um ecossistema vibrante de ferramentas e repositórios (Docker Hub). Isso permitiu que aplicações fossem empacotadas com todas as suas dependências, garantindo portabilidade e previsibilidade do ambiente de execução.

Com o tempo, surgiram alternativas como o Podman⁴, que oferece compatibilidade com o Docker CLI, mas com foco em segurança (rootless containers) e integração nativa com o sistema operacional. O Podman não depende de um daemon centralizado, o que facilita sua adoção em ambientes corporativos e sistemas operacionais modernos.

Ambas as tecnologias, Docker e Podman, impulsionaram a adoção de microserviços, CI/CD e a cultura DevOps, tornando containers uma peça fundamental da infraestrutura moderna.

² O comando chroot


³ Sobre Jails 17 no BSD

Chapter 17. Jails and Containers | FreeBSD Documentation Portal

Jails improve on the concept of the traditional chroot environment in several ways

favicon docs.freebsd.org

Podman x Docker

3 Alpine Linux e Containers: Uma Combinação Natural

A ascensão do Docker coincidiu com a busca por imagens menores e mais seguras. Distribuições tradicionais como Ubuntu e Debian, embora estáveis, carregam muitos pacotes e dependências desnecessárias para a maioria dos casos de uso em containers. O Alpine Linux, com seu tamanho reduzido (menos de 8 MB em sua imagem base), rapidamente se tornou a escolha padrão para quem busca eficiência.

A combinação de Alpine com Docker (ou Podman) permite criar imagens enxutas, rápidas de baixar e iniciar, com menor superfície de ataque. Isso é especialmente valioso em pipelines de CI/CD, ambientes serverless e clusters Kubernetes, onde centenas ou milhares de containers podem ser instanciados em minutos.

Vantagens de Usar Alpine no Docker

1 Imagens Menores e Mais Rápidas

O principal atrativo do Alpine é o tamanho. Imagens baseadas em Alpine são significativamente menores do que suas equivalentes baseadas em Debian ou Ubuntu. Isso reduz o tempo de build, upload e download das imagens, além de economizar espaço em disco e largura de banda.
Atítulo de comparação:

Image description

2 Superfície de Ataque Reduzida

Menos pacotes instalados significa menos vulnerabilidades potenciais. O Alpine compila todos os binários como PIE⁵ (Position Independent Executable) e ativa proteções como stack smashing, tornando-o mais seguro por padrão.

O PIE é bem descrito nesta apresentação do OpenBSD PIE.

3 Inicialização e Deploy Mais Ágeis

Containers baseados em Alpine inicializam mais rápido, o que é crucial em ambientes elásticos e serverless. O tempo de deploy é reduzido, acelerando pipelines de CI/CD e escalabilidade automática.

4 Customização e Controle

O Alpine permite instalar apenas o que é necessário, evitando o "inchaço" de dependências. Seu gerenciador de pacotes apk é rápido e eficiente.

Principais desafios de se usar Alpine Linux como base para containers Docker:

Image description

1. Não recomendado para iniciantes.

O Alpine Linux utiliza o apk (Alpine Package Keeper)⁶ como seu gerenciador de pacotes padrão. Embora seja eficiente e rápido, o apk sofre com a falta de popularidade em comparação com gerenciadores como apt (Debian/Ubuntu) ou yum (RedHat/CentOS). Isso se reflete diretamente na escassez de documentação, tutoriais e exemplos práticos disponíveis na internet. Além disso, o nome "apk" é amplamente associado a pacotes de aplicativos Android, o que polui os resultados de buscas técnicas e dificulta ainda mais o acesso a informações relevantes sobre o gerenciador de pacotes do Alpine.

Ao tentar instalar um pacote comum como o curl, a diferença já é perceptível:

# Debian/Ubuntu
RUN apt-get update && apt-get install -y curl

# Alpine
RUN apk add --no-cache curl
Enter fullscreen mode Exit fullscreen mode

No entanto, ao buscar por erros ou problemas relacionados ao comando apk add, a maioria dos resultados pode se referir a Android, não ao Alpine Linux.

Na wiki.alpinelinux existe um artigo interessante sobre o assunto:

2. Shell padrão "ash" (Almquist Shell)⁷

O Alpine Linux adota o ash (Almquist Shell) como shell padrão, em vez do mais popular bash. Embora o ash seja leve e rápido, ele oferece menos recursos e compatibilidade. Muitos scripts de automação, especialmente aqueles desenvolvidos para ambientes baseados em bash, podem não funcionar corretamente no Alpine sem adaptações⁸. Isso ocorre porque o bash possui diversas extensões e funcionalidades que não estão presentes no ash, como arrays associativos, substituição de processos avançada e manipulação de variáveis mais sofisticada. Como resultado, equipes que migram scripts existentes para Alpine frequentemente se deparam com erros inesperados, exigindo retrabalho e testes adicionais.

Um script simples que funciona no bash pode falhar no ash:

# Script bash
for i in {1..5}; do echo $i; done

# No ash, isso não funciona; é preciso adaptar:
i=1; while [ $i -le 5 ]; do echo $i; i=$((i+1)); done
Enter fullscreen mode Exit fullscreen mode

Novamente, estamos num cenário que, caso o desenvolvedor não "saiba o que está fazendo", é melhor seguir pelo "seguro".
Essa diferença pode gerar impactos em pipelines de CI/CD, scripts de inicialização e automações em geral, caso não seja escritos para o ambiente correto.

Já há um artigo que resume bem as diferenças entre bash e ash

Difference Between Ash and Bash | GeeksforGeeks

Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.

favicon geeksforgeeks.org

É claro que podemos simplesmente instalar o bash ou zsh no Alpine Linux

3. Menor Popularidade e Suporte da Comunidade⁹

A popularidade de uma distribuição Linux influencia diretamente o suporte da comunidade e a disponibilidade de exemplos práticos. O Alpine, apesar de crescer no universo de containers, ainda é menos utilizado que distribuições como Debian ou Ubuntu¹⁰. Isso significa que, ao enfrentar um problema específico, é mais difícil encontrar discussões em fóruns, respostas no Stack Overflow ou artigos detalhados sobre o tema. Para equipes que dependem de soluções rápidas e de fácil acesso, essa limitação pode aumentar a curva de aprendizado e a dependência de especialistas internos, elevando o custo de manutenção e operação do ambiente.

O famoso distrowatch o lista como 30 na colocação:

Image description


¹⁰ Ao buscar por "erro ao instalar psycopg2 no Alpine", há menos resultados e soluções do que para o mesmo problema em Debian, tornando a resolução mais demorada.
4. Performance e Compatibilidade (musl libc)¹¹

O Alpine Linux utiliza a biblioteca C musl libc em vez da tradicional glibc (GNU C Library). Embora a musl seja mais enxuta e adequada para ambientes minimalistas, ela não é 100% compatível com a glibc. Isso pode causar problemas de performance e compatibilidade, especialmente em aplicações que dependem de módulos nativos ou bibliotecas compiladas, como Python, Node.js e Ruby. Em benchmarks, aplicações Python e Node.js podem ser até 15-35% mais lentas em Alpine, principalmente em operações de I/O intensivo. Além disso, bibliotecas populares como psycopg2 (Python/PostgreSQL) ou node-sass (Node.js) podem falhar na instalação ou apresentar comportamentos inesperados devido à ausência de suporte total à glibc.

Ao tentar instalar o psycopg2 em Alpine, pode ser necessário compilar dependências manualmente ou enfrentar erros de incompatibilidade, enquanto em Debian a instalação é direta:

# Debian
RUN apt-get update && apt-get install -y libpq-dev

# Alpine
RUN apk add --no-cache postgresql-dev
# Pode exigir ajustes adicionais ou falhar em alguns casos
Enter fullscreen mode Exit fullscreen mode

¹¹ Mais detalhes aqui:

5. Recomendações Oficiais

A própria documentação oficial¹² do Docker recomenda o uso de imagens baseadas em Debian como padrão para a maioria dos casos. O motivo é simples: o Debian é uma distribuição bem mantida, compacta e oferece ampla compatibilidade com a maioria das aplicações e bibliotecas. Ao seguir essa recomendação, equipes se beneficiam de um ecossistema mais maduro, com maior suporte da comunidade, atualizações frequentes e menos surpresas durante o desenvolvimento e a produção. Optar por Alpine, portanto, deve ser uma decisão consciente, baseada em necessidades específicas de redução extrema de tamanho de imagem, e não apenas por ser uma tendência.

A imagem oficial do Python no Docker Hub recomenda o uso de python:3.11-slim (baseada em Debian) para a maioria dos casos, reservando o uso de python:3.11-alpine para cenários onde o tamanho é absolutamente crítico.

¹² Documentação:

Docker Docs

Docker Documentation is the official Docker library of resources, manuals, and guides to help you containerize applications.

favicon docs.docker.com
6. Ganho de Tempo de Deploy Marginal

Um dos principais argumentos para o uso do Alpine é o tamanho reduzido das imagens, o que teoricamente aceleraria o tempo de deploy. No entanto, na prática, o tempo de upload ou download da imagem é apenas uma fração do tempo total de deploy de uma aplicação. Outros fatores, como inicialização de serviços, execução de testes e provisionamento de infraestrutura, costumam consumir muito mais tempo. Assim, o ganho obtido com uma imagem menor pode ser insignificante frente aos desafios de compatibilidade, manutenção e troubleshooting que o Alpine pode trazer. Em muitos casos, o tempo economizado no deploy não compensa o tempo gasto resolvendo problemas de dependências ou adaptando scripts.

Em um pipeline de CI/CD, baixar uma imagem de 100MB (Debian) pode levar apenas alguns segundos a mais do que baixar uma de 8MB (Alpine), mas o tempo perdido ajustando scripts ou corrigindo erros de dependências pode ser de horas ou dias.


Esse foi o maior "depende" que eu já disse.
Resumindo.
Quando usar Alpine?
1. Apenas se o tamanho da imagem for absolutamente crítico. Como no em embarcados
2. Você possui conhecimentos suficientes sobre o Alpine e não depende de suporte da comunidade.
Quando evitar Alpine?
1. Você não conhece o Alpine e precisa de suporte da comunidade.
2. Usa bibliotecas nativas ou dependências complexas.
3. Quer evitar problemas de compatibilidade e manutenção.

Top comments (2)

Collapse
 
analaura profile image
Ana Laura

Muuuito daora!

Collapse
 
rodolffo_nivass_f3c189668 profile image
Rodolffo Nivass

Que honra ter você como leitora.
Fico feliz que tenha gostado!
Sou sua tiete, só comecei a escrever aqui por influência sua (hehehe)