Do meu artigo em Automatizando implantações do Docker :
Imagens do Docker vs. contêineres
Em Dockerland, existem imagens e existem contêineres . Os dois estão intimamente relacionados, mas distintos. Para mim, compreender essa dicotomia esclareceu Docker imensamente.
O que é uma imagem?
Uma imagem é um arquivo inerte e imutável que é essencialmente um instantâneo de um contêiner. As imagens são criadas com o comando build e produzem um contêiner quando iniciado com run . As imagens são armazenadas em um registro do Docker, como o registry.hub.docker.com . Como elas podem se tornar muito grandes, as imagens são projetadas para serem compostas por camadas de outras imagens, permitindo que uma quantidade mínima de dados seja enviada ao transferir imagens pela rede.
As imagens locais podem ser listadas executando docker images
:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 13.10 5e019ab7bf6d 2 months ago 180 MB
ubuntu 14.04 99ec81b80c55 2 months ago 266 MB
ubuntu latest 99ec81b80c55 2 months ago 266 MB
ubuntu trusty 99ec81b80c55 2 months ago 266 MB
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
Algumas coisas a serem observadas:
- ID de IMAGEM são os primeiros 12 caracteres do identificador verdadeiro de uma imagem. Você pode criar várias tags de uma determinada imagem, mas seus IDs serão todos iguais (como acima).
- O TAMANHO VIRTUAL é virtual porque está somando os tamanhos de todas as camadas subjacentes distintas. Isso significa que a soma de todos os valores nessa coluna é provavelmente muito maior que o espaço em disco usado por todas essas imagens.
- O valor na coluna REPOSITORY vem do
-t
sinalizador do docker build
comando ou da docker tag
imagem existente. Você pode marcar imagens usando uma nomenclatura que faça sentido para você, mas saiba que a janela de encaixe usará a tag como o local do registro em um docker push
ou docker pull
.
- A forma completa de uma tag é
[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Por ubuntu
acima, REGISTRYHOST é inferida a ser registry.hub.docker.com
. Portanto, se você planeja armazenar sua imagem chamada my-application
em um registro em docker.example.com
, deve marcar essa imagem docker.example.com/my-application
.
- A coluna TAG é apenas a parte [: TAG] da tag completa . Esta é uma terminologia infeliz.
- A
latest
tag não é mágica, é simplesmente a tag padrão quando você não especifica uma tag.
- Você pode ter imagens não marcadas apenas identificáveis por seus IDs de IMAGEM. Estes receberão o
<none>
TAG e o REPOSITÓRIO. É fácil esquecê-los.
Mais informações sobre imagens estão disponíveis na documentação e no glossário do Docker .
O que é um contêiner?
Para usar uma metáfora de programação, se uma imagem é uma classe, um contêiner é uma instância de uma classe - um objeto de tempo de execução. Esperamos que os contêineres estejam usando o Docker; são encapsulações leves e portáteis de um ambiente no qual os aplicativos são executados.
Visualize contêineres locais em execução com docker ps
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2ff1af05450 samalba/docker-registry:latest /bin/sh -c 'exec doc 4 months ago Up 12 weeks 0.0.0.0:5000->5000/tcp docker-registry
Aqui, estou executando uma versão dockerizada do registro da docker, para que eu tenha um local privado para armazenar minhas imagens. Novamente, algumas coisas a serem observadas:
- Assim como o ID da IMAGEM, o ID do CONTAINER é o identificador verdadeiro do contêiner. Ele tem a mesma forma, mas identifica um tipo diferente de objeto.
docker ps
apenas gera contêineres em execução . Você pode ver todos os contêineres (em execução ou parados ) com docker ps -a
.
- NAMES pode ser usado para identificar um contêiner iniciado por meio do
--name
sinalizador.
Como evitar o acúmulo de imagens e contêineres
Uma das minhas primeiras frustrações com o Docker foi o aparente acúmulo constante de imagens não identificadas e os contêineres parados . Em algumas ocasiões, esse acúmulo resultou em um número máximo de discos rígidos, diminuindo a velocidade do meu laptop ou interrompendo meu pipeline de construção automatizado. Fale sobre "recipientes em todos os lugares"!
Podemos remover todas as imagens não marcadas combinando docker rmi
com a dangling=true
consulta recente :
docker images -q --filter "dangling=true" | xargs docker rmi
O Docker não poderá remover as imagens que estão atrás dos contêineres existentes; portanto, talvez seja necessário remover os contêineres parados docker rm
primeiro:
docker rm `docker ps --no-trunc -aq`
Esses são pontos problemáticos conhecidos com o Docker e podem ser abordados em versões futuras. No entanto, com um entendimento claro de imagens e contêineres, essas situações podem ser evitadas com algumas práticas:
- Remova sempre um recipiente parado e inútil
docker rm [CONTAINER_ID]
.
- Sempre remova a imagem atrás de um recipiente parado e inútil
docker rmi [IMAGE_ID]
.