O documento discute camadas em containers Docker. Camadas são arquivos gerados por comandos no Dockerfile como FROM, RUN, COPY e ADD, e formam imagens Docker. Durante o build, um container intermediário é usado para cada camada antes de ser removido, enquanto a camada é armazenada. A camada atual é gravável enquanto as anteriores são somente leitura. O tamanho da imagem é a soma das camadas base e pendentes.
2. Roberto Alves
Lead Software Engineer at Altran
$ short bio
● Desenvolvedor desde os 14 anos
● Palestrante
● Entusiasta Open Source
● Colunista no iMasters
● AWS Community Builder
3. O que são camadas (layers)?
Em essência, são arquivos geradas a partir
da execução de algum comando (Dockerfile).
Uma imagem Docker consiste em
várias camadas.
4. O que são camadas (layers)?
Apenas os comandos FROM, RUN,
COPY e ADD criam camada.
Os demais comandos criam
camadas intermediárias que não
influenciam o tamanho da imagem final.
8. Camada vs Container?
No fase do Build é executado um container
intermediário.
Quando a fase atual do Build é concluída, o
container intermediário é removido.
9. Camada vs Container?
Além disso, uma Camada é apenas de leitura.
Existe uma diferença entre a camada anterior
e a atual.
N topo das camadas, está a camada gravável,
chamada de camada de container (atual).
17. E quanto ao tamanho?
Nossos imagens Docker são armazenadas em
/var/lib/docker/overlay2
18. E quanto ao tamanho?
Entretanto, a nossa imagem base usa apenas
987MB
Nosso arquivo JAR contém 17,4MB
Temos três imagens então 2 pendentes e uma
imagem definitiva
19. E quanto ao tamanho?
987MB + 3 * 17,4MB = 1.040MB
Vamos dar uma olhada em um exemplo. Usaremos um aplicativo Spring Boot MVC onde o build do Maven cria uma imagem Docker.
Esse exemplo está disponível no Github. Usamos a branch ”feature/dockerbenchsecurity”, que é uma versão mais segura da branch master/main.
Para ficar mais breve foi removido as fases do Pull na imagem openjdk:10-jdk
Podemos notar que camadas são criadas e a maioria é removida
O curioso é que a mensagem diz que o container intermediário é removido ao invés de camada intermediária
E como mencionado anteriormente, apenas os comandos específicos criaram uma nova camada
Agora que já temos um container criado podemos dar uma olhada em nossas imagens Docker
Com o ID da nossa imagem criada – mykubernetesplanet, podemos ver o histórico da imagem gerada.
Podemos confirmar o que falamos há pouco, os container intermediários possuem 0B, exatamente como esperado.
Apenas os comandos RUN e COPY do nosso Dockerfile influenciaram no tamanho da nossa imagem
As camadas da nossa imagem base (openjdk) está listada como ausente – o que significa que foram construídos em um sistema diferente e não estão disponível localmente.
Agora que sabemos que temos camadas localmente armazenadas da imagem gerada, podemos nos perguntar o que acontece por debaixo dos panos quando recriamos o Docker sem alterações?
De início podemos notar que as camadas são idênticas à nossa build anterior.
Até mesmo os IDs da camada são os mesmos (no log, notamos que as camadas são retiradas do cache)
Na etapa 7, uma nova camada é criada com um novo ID
Devido o arquivo JAR, o Docker interpreta isso como um novo arquivo e, portanto, uma nova camada é criada
Na etapa 8, uma nova camada também é criada, porque ela é construída sobre a nova camada.
A nossa imagem recebeu um novo ID devido ao BUILD recente
O repositório e a tag de nosso antigo ID de imagem são removidos e ficam <none> -> isso é chamado de imagem pendente
A imagem recém-criada possui duas camadas superiores as quais são novas, refletindo exatamente o log do build do container
Se realizarmos uma alteração no código fonte da aplicação, teria o mesmo efeito sobre a construção da imagem
Temos uma imagem pendente
Mas o que isso realmente significa para o armazenamento?
Primeiro, precisamos saber onde os dados de nossas imagens estão armazenados
Assim podemos dar uma olhada na nossa imagem Docker
A diferença se deve à existência de imagens intermediárias
Eles podem ser revelados da seguinte forma
Primeiro passo é listar as suas imagens para sabermos se temos realmente imagens desnecessárias
docker rmi + o id do container
ou docker image prune
Agora que as imagens pendentes foram removidos, podemos consultar o armazenamento no diretório overlay2 novamente
Nós nos livramos de 33 MB (somando as imagens pendentes e as imagens intermediárias)
Parece que não é muito, mas quando trabalhamos com Docker diariamente, isso pode crescer significativamente com o tempo