Otimizar o tamanho das imagens Docker é essencial para melhorar o desempenho e a eficiência dos seus contêineres. Aqui estão algumas dicas práticas para reduzir o tamanho das suas imagens:
Use Imagens Baseadas em Alpine:
Se você não precisa de nenhuma especificidade de sistema, considere o uso de imagens baseadas em Alpine.
Comparando com uma imagem baseada na versão slim do Debian:
Alpine: 5,53 MB
Debian (stretch-slim): 55,3 MB
.
O Alpine Linux é uma distribuição Linux leve e minimalista projetada para executar contêineres Docker. Baseado no Alpine Linux, conhecido por sua eficiência e tamanho reduzido, o Docker Alpine possui uma pequena pegada, exigindo menos recursos para ser executado e oferecendo um melhor desempenho em ambientes com restrições de recursos. Essa abordagem minimalista e foco em segurança tornam o Alpine Linux atraente para usuários avançados e também para sistemas com recursos limitados, como o Raspberry Pi. Em resumo, o Alpine Linux segue a filosofia “pequeno, simples e seguro” e é amplamente utilizado em ambientes de containerização e virtualização.
Evite Cache de Instalação:
Ao instalar pacotes, evite armazenar dados em cache no sistema.
.
Multi-Stage Build:
Use o multi-stage build para criar imagens intermediárias.
Compile e construa o código em uma imagem intermediária e, em seguida, copie apenas os artefatos necessários para a imagem final.
.
Lembre-se de que imagens menores resultam em contêineres mais rápidos e eficientes.
Laboratório
Por exemplo, para otimizar o Dockerfile abaixo, ao invés de instalar o Node.js pode-se utilizar a image oficial node existente no Docker Registry que já possui a versão Linux Alpine:
# imagem base
FROM ubuntu
# instalacao do node.js
RUN apt-get update && \
apt-get install -y curl && \
curl -fsSL https://deb.nodesource.com/setup_22.x -o nodesource_setup.sh && \
bash -E nodesource_setup.sh && \
apt-get update && \
apt-get install -y nodejs
# diretorio de trabalho
WORKDIR /app
# copiar a aplicacao
COPY . .
# instalar as dependencias
RUN npm install
# execucao do comando para iniciar a aplicacao
ENTRYPOINT [ "node", "server.js" ]
Ficaria desta forma com a definição da versão da imagem base:
# imagem base
FROM node:20.17.0
# diretorio de trabalho
WORKDIR /app
# copiar a aplicacao
COPY . .
# instalar as dependencias
RUN npm install
# execucao do comando para iniciar a aplicacao
ENTRYPOINT [ "node", "server.js" ]
Imagem Base com Versão
Utilizar uma imagem base versionada no Docker é uma prática recomendada por várias razões importantes:
Reprodutibilidade:
Ao usar uma imagem base versionada, você garante que todos os membros da equipe e ambientes de produção estejam usando a mesma versão da imagem.
Segurança:
Imagens base versionadas são revisadas e testadas pela comunidade e pelos mantenedores.
Estabilidade:
Versões estáveis e bem testadas são menos propensas a causar problemas inesperados em seus contêineres.
Controle de Mudanças:
Em resumo, usar imagens base versionadas promove consistência, segurança e confiabilidade em seus projetos Docker.
$ docker image ls
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
marcelodpbarbieri/conversao-temperatura v2 a72a57c5376b About a minute ago 1.12GB
marcelodpbarbieri/conversao-temperatura latest 4c32eaa602c1 11 hours ago 381MB
marcelodpbarbieri/conversao-temperatura v1 4c32eaa602c1 11 hours ago 381MB
$ docker container rm -f $(docker container ls -qa)
0fbc2f30c8c8
O tamanho da imagem na tag v2 ficou maior que as demais. A imagem base node:20.17.0 utiliza a distribuição debian que não é a mais enxuta. Para otimizar ainda mais poder ser utilizada o Linux Alpine.
$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
c6a83fedfae6: Pull complete
Digest: sha256:0a4eaa0eecf5f8c050e5bba433f58c052be7587ee8af3e8b3910ef9ab5fbe9f5
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
marcelodpbarbieri/conversao-temperatura v2 a72a57c5376b About a minute ago 1.12GB
marcelodpbarbieri/conversao-temperatura latest 4c32eaa602c1 11 hours ago 381MB
marcelodpbarbieri/conversao-temperatura v1 4c32eaa602c1 11 hours ago 381MB
alpine latest 324bc02ae123 4 weeks ago 7.8MB
Procurar no Docker Hub uma versão Node.js Alpine:
Dockerfile:
# imagem base
FROM node:22.7.0-alpine3.20
# diretorio de trabalho
WORKDIR /app
# copiar a aplicacao
COPY . .
# instalar as dependencias
RUN npm install
# execucao do comando para iniciar a aplicacao
ENTRYPOINT [ "node", "server.js" ]