Ao usar o Docker, começamos com uma imagem de base. Arrancamos, criamos alterações e essas alterações são guardadas em camadas formando outra imagem.
Então eventualmente eu tenho uma imagem para a minha instância PostgreSQL e uma imagem para a minha aplicação web, cujas alterações continuam a persistir.
O que é um contentor?
Um exemplo de uma imagem é chamado de recipiente. Você tem uma imagem, que é um conjunto de camadas, como você descreve. Se você iniciar esta imagem, você tem um container rodando desta imagem. Você pode ter muitos contentores em funcionamento da mesma imagem.
Você pode ver todas as suas imagens com "imagens docker" enquanto que você pode ver os seus contentores em funcionamento com "docker ps" (e você pode ver todos os contentores com "docker ps -a").
Então, uma instância em execução de uma imagem é um recipiente.
Do meu artigo sobre Automating Docker Deployments:
Na Dockerland, há imagens e há containers. Os dois estão intimamente relacionados, mas são distintos. Para mim, ao perceber esta dicotomia, esclareceu imensamente o Docker.
Uma imagem é um arquivo inerte, imutável, que's é essencialmente um instantâneo de um recipiente. As imagens são criadas com o comando build, e elas'irão produzir um container quando iniciadas com run. As imagens são armazenadas em um registro Docker, como registry.hub.docker.com. Como elas podem se tornar bastante grandes, as imagens são projetadas para serem compostas de 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 notar:___
-t' flag do comando
docker build', ou do docker tag' -ingindo uma imagem existente. Você'está livre para marcar imagens utilizando uma nomenclatura que faça sentido para você, mas saiba que o docker irá utilizar a tag como local de registro em um
docker pushou
docker pull`.[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Para ubuntu
acima, REGISTRYHOST é inferido como registry.hub.docker.com
. Então se você pretende armazenar sua imagem chamada my-application
em um registro em docker.example.com
, você deve etiquetar essa imagem como docker.example.com/my-application
.latest
não é mágica, ela'é simplesmente a tag padrão quando você não't especifica uma tag.<none>
TAG e REPOSITORY. It'é fácil de esquecê-las.Mais informações sobre imagens estão disponíveis em Documentação do Docker e glossário.
Para usar uma metáfora de programação, se uma imagem é uma classe, então um container é uma instância de uma classe - um objeto em tempo de execução. Os contentores são esperançosamente o porquê de você're usar Docker; eles're encapsulamentos leves e portáteis de um ambiente no qual executar aplicações.
Veja os contentores de funcionamento local 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 I'estou executando uma versão em doca do registro da doca, para que eu tenha um lugar privado para armazenar minhas imagens. Mais uma vez, algumas coisas para anotar:
docker ps
só sai contentores em execução. Você pode ver todos os containers (running ou stopped) com o docker ps -a
.--nome
.Uma das minhas primeiras frustrações com o Docker foi a acrescentação constante de imagens não marcadas e de contentores parados. Em algumas ocasiões, esse acúmulo resultou no máximo de discos rígidos tornando meu laptop mais lento ou parando meu pipeline de construção automática. Fale sobre " contêineres em todo lugar"!
Podemos remover todas as imagens não marcadas combinando docker rmi
com a recente consulta dangling=true
:
imagens docker -q --filter "dangling=true" | xargs docker rmi`
Docker won'não ser capaz de remover imagens que estão por trás de recipientes existentes, então você pode ter que remover recipientes parados com docker rm
primeiro:
docker rm `docker ps --no-trunc -aq`
Estes são pontos de dor conhecidos com Docker e podem ser abordados em lançamentos futuros. No entanto, com um claro entendimento das imagens e dos recipientes, estas situações podem ser evitadas com um par de práticas:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.Embora seja mais simples pensar num contentor como uma imagem em execução, isto é't quite preciso.
Uma imagem é realmente um modelo que pode ser transformado em um recipiente. Para transformar uma imagem em um container, o motor Docker pega a imagem, adiciona um sistema de arquivos de leitura-escrita no topo e inicia várias configurações, incluindo portas de rede, nome do container, ID e limites de recursos. Um container em execução tem um processo em execução, mas um container também pode ser parado (ou exited na terminologia do Docker's). Um container encerrado é não o mesmo que uma imagem, pois ele pode ser reiniciado e manterá suas configurações e quaisquer alterações no sistema de arquivos.