Docker
  • Introdução a Containeres e Docker
    • Introdução
    • O que é um container e suas vantanges
    • VM versus Container
    • Como funcionam os containers
    • Linux
    • Container sem Docker
      • cgroup
      • cpu.max
    • LxC
    • LxD
    • Containers versus Imagens
    • Arquitetura do Docker
    • Arquitetura do Docker mais a fundo
    • Projetos Open Source
  • Instalação do Docker
    • Linux
    • Windows
      • Docker Desktop
      • Rancher Desktop
      • WSL
    • Mac
    • Visual Studio Code
  • Primeiros Passos com Docker
    • Criação e listagem básica de um container
    • Interagindo com o container
    • Executando containers continuamente
      • nginx
      • docker container run
      • docker container run nginx
      • docker container run -d nginx
      • docker container exec
    • Como usar publish de porta
      • docker container stop
      • docker container start
      • docker container rm
      • docker container rm -f $(docker container ls -qa)
    • Containers e variáveis de ambiente
      • docker container run -e
  • Desafio
    • Desafio 01 - Banco de Dados Postgresql
    • Desafio 02 - Banco de Dados MySQL
    • Desafio 03 - Banco de Dados MongoDB
  • Executando a sua primeira aplicação em containers
    • Introdução
    • Preparando o container para a aplicação
    • Executando a aplicação
      • docker container cp
  • Primeiros Passos com Docker Images
    • Introdução
    • OverlayFS na Prática
    • Copy-on-Write
    • Formas de criar uma imagem Docker
    • Como funciona o Docker Commit
    • Docker Commit na Prática
      • docker commit
    • Entendendo melhor a sua imagem
      • docker image history
      • docker image inspect
    • Entrando mais a fundo na imagem
    • Como usar a imagem Docker no modo raiz
  • Avançando em imagens Docker com Dockerfile
    • O que é Dockerfile
    • Primeira Imagem com Dockerfile
      • docker image build
    • Como funciona a construção com Dockerfile
    • Possibilidades com Dockerfile
    • FROM
    • RUN
    • WORKDIR
    • COPY
    • ADD
    • LABEL
    • ENV
    • VOLUME
    • ARG
    • EXPOSE
    • USER
    • ENTRYPOINT
    • CMD
    • ENTRYPOINT versus CMD
    • Principais comandos com imagem
    • Imagem da aplicação com Dockerfile
    • Comparando Docker Commit com Dockerfile
  • Docker Registry
    • Introdução
    • Docker Hub
    • Sua imagem com o nome certo
    • Renomear imagens com Docker Tag
      • docker image tag
    • Enviando a sua primeira imagem para o Docker Hub
      • docker image push
      • docker image pull
  • Algumas boas práticas para construção de imagem
    • Um processo por container
    • Usar imagens confiáveis
    • Otimizar sempre a sua imagem
    • Uso inteligente das camadas
    • Dockerignore
  • Multistage Build
    • Introdução
    • Multistage build na prática
    • Target para fazer o build
      • docker image build --target
    • Imagem externa no Multistage build
    • Usar um estágio de build como base
  • Docker Volume
    • Introdução
      • docker volume
    • Bind Mount
    • Particularidades do Bind Mount
    • Bind Mount no Windows
    • Exemplo com Bind Mount
    • Docker Volume
      • docker volume create
      • docker volume inspect
      • docker volume ls
      • docker volume prune
      • docker volume rm
    • Onde ficam os arquivos do Docker volume?
    • Usando o volume no Dockerfile
    • Como fazer backup de um Docker Volume
    • Exemplo com Docker Volume
    • Storage tmpfs
    • Como criar algo funcional com o que aprendemos
  • Network
    • Introdução
    • Componentes do Docker Network
    • Rede Bridge na prática
      • docker network
      • docker network create
      • docker network inspect
      • docker network ls
      • docker network prune
      • docker network rm
    • Criando a sua rede bridge
      • docker network connect
      • docker network disconnect
    • Como funciona a rede bridge por dentro
    • Rede Host na prática
    • Rede none da prática
    • Como adicionar domínios no seu container
  • Aplicação 100% no Docker
    • Introdução
    • Criação da Imagem e Envio para o Docker Hub
    • Criação do Docker Network
    • Container do PostgreSQL
    • Container da Aplicação Web
    • Atualização da aplicação
  • Docker Compose
    • Introdução
      • docker compose
    • A evolução do docker compose
    • Criação básica de um Docker Compose
      • docker compose attach
      • docker compose build
      • docker compose config
      • docker compose cp
      • docker compose create
      • docker compose down
      • docker compose events
      • docker compose exec
      • docker compose images
      • docker compose kill
      • docker compose logs
      • docker compose ls
      • docker compose pause
      • docker compose port
      • docker compose ps
      • docker compose pull
      • docker compose push
      • docker compose restart
      • docker compose rm
      • docker compose run
      • docker compose scale
      • docker compose start
      • docker compose stats
      • docker compose stop
      • docker compose top
      • docker compose unpause
      • docker compose up
      • docker compose version
      • docker compose wait
      • docker compose watch
    • Variáveis de Ambiente
    • Volume Bind Mount
    • Docker Volume
    • Docker Network - Bridge
    • Docker Network - Host Driver e Add Host
    • Ordenando a execução dos containers
    • Compose com build de imagem
    • Como Parametrizar o Compose com Variáveis de Ambiente
    • Múltiplos Composes
    • Extends
    • Merge
    • Include
    • Profiles
    • Comandos importantes do Docker Compose
  • Troubleshooting
    • Introdução
    • Docker Info
    • Docker Events
    • Docker Logs
    • Docker Inspect
    • Docker Top
    • Docker Stats
    • Docker Exec
  • Resiliência e Gerenciamento de Recursos
    • Introdução
    • Docker Restart
      • Introdução
      • on-failure
      • unless-stopped
      • always
      • Docker Compose
    • Healthcheck
      • Introdução
      • Linha de Comando
      • Docker Compose
      • Direto na Imagem
    • Gerenciamento de Recurso
      • CPU
        • Como Gerenciar CPU
        • Prática
      • Memória
        • Como Gerenciar Memória
        • Prática
      • Docker Compose
  • Fazendo um ambiente mais seguro
    • Introdução
    • Docker Scout
      • Introdução
      • Verificação Simples de Imagem
      • Como adicionar um repositório
      • Primeira melhoria na imagem
  • BUSCA RÁPIDA
    • Referências
    • Comandos
      • docker commit
      • docker compose
      • docker container
      • docker image
      • docker network
      • docker volume
    • Dockerfile
Powered by GitBook
On this page
  1. Algumas boas práticas para construção de imagem

Otimizar sempre a sua imagem

PreviousUsar imagens confiáveisNextUso inteligente das camadas

Last updated 9 months ago

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:

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

  2. Evite Cache de Instalação:

    • Ao instalar pacotes, evite armazenar dados em cache no sistema.

    • .

  3. 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:

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

  2. Segurança:

    • Imagens base versionadas são revisadas e testadas pela comunidade e pelos mantenedores.

  3. Estabilidade:

    • Versões estáveis e bem testadas são menos propensas a causar problemas inesperados em seus contêineres.

  4. Controle de Mudanças:

Em resumo, usar imagens base versionadas promove consistência, segurança e confiabilidade em seus projetos Docker.

$ docker image ls
REPOSITORY                                TAG       IMAGE ID       CREATED        SIZE
marcelodpbarbieri/conversao-temperatura   latest    4c32eaa602c1   11 hours ago   381MB
marcelodpbarbieri/conversao-temperatura   v1        4c32eaa602c1   11 hours ago   381MB
$ docker build -t marcelodpbarbieri/conversao-temperatura:v2 .
[+] Building 37.0s (10/10) FINISHED                                     docker:default
 => [internal] load build definition from Dockerfile                              0.0s
 => => transferring dockerfile: 270B                                              0.0s
 => [internal] load metadata for docker.io/library/node:20.17.0                   2.7s
 => [auth] library/node:pull token for registry-1.docker.io                       0.0s
 => [internal] load .dockerignore                                                 0.0s
 => => transferring context: 54B                                                  0.0s
 => [1/4] FROM docker.io/library/node:20.17.0@sha256:a4d1de4c7339eabcf78a90137d  29.9s
 => => resolve docker.io/library/node:20.17.0@sha256:a4d1de4c7339eabcf78a90137df  0.0s
 => => sha256:a4d1de4c7339eabcf78a90137dfd551b798829e3ef3e399e00 6.41kB / 6.41kB  0.0s
 => => sha256:b6988fc9c25377658fe17d93809e00f4441db912b393cfa9ca 2.49kB / 2.49kB  0.0s
 => => sha256:903681d87777d28dc56866a07a2774c3fd5bf65fd734b24c 49.55MB / 49.55MB  2.7s
 => => sha256:3cbbe86a28c2f6b3c3e0e8c6dcfba369e1ea656cf8daf69b 24.05MB / 24.05MB  2.2s
 => => sha256:6ed93aa58a52c9abc1ee472f1ac74b73d3adcccc2c307444 64.14MB / 64.14MB  4.3s
 => => sha256:7ff5292d4419e1e9a53b6f4d0e3831e6fd01c4a5bc233dd713 6.60kB / 6.60kB  0.0s
 => => sha256:787c78da43830be6d988d34c7ee091f98d828516ce547 211.24MB / 211.24MB  12.3s
 => => sha256:7203e46f2829052f81dbdea27bc5a403ac69f551c0277f6d9e 3.33kB / 3.33kB  3.2s
 => => extracting sha256:903681d87777d28dc56866a07a2774c3fd5bf65fd734b24c9d0ecd9  6.9s
 => => sha256:ce4d5ef2f711eb9b3aa9a80cca623ec660e3017c5a703a99 48.15MB / 48.15MB  6.0s
 => => sha256:488bbe69ac4a8a299a7af04ec27992e0a809df1a150cc7bd02 1.25MB / 1.25MB  4.6s
 => => sha256:51c5b7ece801abbfef0818ed7deb9de8cda6ce59b30503d0afb268 449B / 449B  4.9s
 => => extracting sha256:3cbbe86a28c2f6b3c3e0e8c6dcfba369e1ea656cf8daf69be789e0f  1.4s
 => => extracting sha256:6ed93aa58a52c9abc1ee472f1ac74b73d3adcccc2c30744498fd5f1  4.5s
 => => extracting sha256:787c78da43830be6d988d34c7ee091f98d828516ce5478ca10a4933  9.8s
 => => extracting sha256:7203e46f2829052f81dbdea27bc5a403ac69f551c0277f6d9eb8389  0.0s
 => => extracting sha256:ce4d5ef2f711eb9b3aa9a80cca623ec660e3017c5a703a99ffe1895  3.2s
 => => extracting sha256:488bbe69ac4a8a299a7af04ec27992e0a809df1a150cc7bd02cb744  0.0s
 => => extracting sha256:51c5b7ece801abbfef0818ed7deb9de8cda6ce59b30503d0afb2686  0.0s
 => [internal] load build context                                                 0.0s
 => => transferring context: 116.42kB                                             0.0s
 => [2/4] WORKDIR /app                                                            1.0s
 => [3/4] COPY . .                                                                0.1s
 => [4/4] RUN npm install                                                         2.9s
 => exporting to image                                                            0.3s
 => => exporting layers                                                           0.3s
 => => writing image sha256:a72a57c5376bab1f089b38c8b72450881aa10da2b3b6a13d1b23  0.0s
 => => naming to docker.io/marcelodpbarbieri/conversao-temperatura:v2             0.0s
$ docker container rm -f $(docker container ls -qa)
6b687bed62f5
$ docker container run -d -p 8080:8080 marcelodpbarbieri/conversao-temperatura:v2
0fbc2f30c8c89fd7a3073fc9b36fb4fef96977a7f25c8baf4d60ffd7e9461d4c
$ 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" ]
$ docker image ls
REPOSITORY                                TAG       IMAGE ID       CREATED         SIZE
marcelodpbarbieri/conversao-temperatura   v2        a72a57c5376b   2 minutes 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
$ docker build -t marcelodpbarbieri/conversao-temperatura:v3 .
[+] Building 10.6s (9/9) FINISHED                                              docker:default
 => [internal] load build definition from Dockerfile                                     0.0s
 => => transferring dockerfile: 280B                                                     0.0s
 => [internal] load metadata for docker.io/library/node:22.7.0-alpine3.20                2.4s
 => [internal] load .dockerignore                                                        0.0s
 => => transferring context: 54B                                                         0.0s
 => [1/4] FROM docker.io/library/node:22.7.0-alpine3.20@sha256:ed9736a13b88ba55cbc08c75  4.4s
 => => resolve docker.io/library/node:22.7.0-alpine3.20@sha256:ed9736a13b88ba55cbc08c75  0.0s
 => => sha256:d433621cbfa16b261a74722998319373dc039606f2467bb0430810596 1.39MB / 1.39MB  0.3s
 => => sha256:e27403de326fffb9807b586a4842d6a9548fc3b33b0ba936775e9c4a6809c 448B / 448B  0.3s
 => => sha256:ed9736a13b88ba55cbc08c75c9edac8ae7f72840482e40324670b2993 6.41kB / 6.41kB  0.0s
 => => sha256:3dbc5d17cf89e1d8ae6f4a8a562f8a5b5df52b4c7060bfb359de86de6 1.72kB / 1.72kB  0.0s
 => => sha256:d5b2c58d02546cb936e436e4b27d896b7b3be359e836755a1a86f1696 6.38kB / 6.38kB  0.0s
 => => sha256:d2e28128a0eb47dce2606af084fb8860d17c44334b95da7a836e007 48.37MB / 48.37MB  1.9s
 => => extracting sha256:d2e28128a0eb47dce2606af084fb8860d17c44334b95da7a836e007d34c5a7  2.1s
 => => extracting sha256:d433621cbfa16b261a74722998319373dc039606f2467bb0430810596fef0a  0.1s
 => => extracting sha256:e27403de326fffb9807b586a4842d6a9548fc3b33b0ba936775e9c4a6809c9  0.0s
 => [internal] load build context                                                        0.0s
 => => transferring context: 661B                                                        0.0s
 => [2/4] WORKDIR /app                                                                   0.2s
 => [3/4] COPY . .                                                                       0.1s
 => [4/4] RUN npm install                                                                3.2s
 => exporting to image                                                                   0.3s
 => => exporting layers                                                                  0.3s
 => => writing image sha256:4d73acfa0aa59f89b14d416ea7bac37f72ee7899b9738102a5428d3b3bb  0.0s
 => => naming to docker.io/marcelodpbarbieri/conversao-temperatura:v3                    0.0s
$ docker image ls
REPOSITORY                                TAG       IMAGE ID       CREATED         SIZE
marcelodpbarbieri/conversao-temperatura   v3        4d73acfa0aa5   6 seconds ago   180MB
marcelodpbarbieri/conversao-temperatura   v2        a72a57c5376b   3 minutes 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
$ docker container rm -f $(docker container ls -qa)
$ docker container run -d -p 8080:8080 marcelodpbarbieri/conversao-temperatura:v3
6f04b9d65f755ff9e3b75edbd8a8a528eed62984bb09b238c725412c6e3d2a3e

.

O Alpine é significativamente mais leve
Isso economiza espaço nas imagens baseadas em Alpine em torno de 1 MB
1
Isso reduz o tamanho da imagem final
Isso evita inconsistências e problemas relacionados a diferenças nas dependências e configurações do sistema
Versões mais recentes podem incluir correções de segurança e atualizações importantes
Evita surpresas ao atualizar ou implantar novos contêineres
Se você precisar fazer alterações na imagem base, é mais fácil rastrear e gerenciar essas mudanças quando você está usando uma versão específica
Node.js — Executar a JavaScript em Toda Parte
Logo
node - Official Image | Docker Hub
Logo
index | Alpine Linux
Logo
https://hub.docker.com/layers/library/node/22.7.0-alpine3.20/images/sha256-3dbc5d17cf89e1d8ae6f4a8a562f8a5b5df52b4c7060bfb359de86de6a3ecc3c?context=explore
Logo