Compreender o processo que o Docker usa para armazenar dados por meio de imagens e contêineres ajudará você a projetar melhor seus aplicativos do Docker. As imagens do Docker são como modelos, enquanto os contêineres do Docker são as instâncias de execução criadas a partir desses modelos. Docker usa uma abordagem em camadas para armazenar imagens e recipientes.
Imagens e camadas
Uma imagem do docker é criada a partir de várias camadas. Se tomarmos um exemplo de Dockerfile, todas as instruções são convertidas em uma camada. Aqui está um Dockerfile simples:
Cada linha no Dockerfile acima criará uma camada. A declaração de From procurará o nó: 6.9.2 imagem no registro local. Se não o encontrar lá, será baixá -lo no Hub do Docker. Em seguida, o Docker criará a primeira camada. A próxima declaração de cópia adiciona o servidor.arquivo js para a imagem como segunda camada. A última camada executa um nó.Aplicação JS. Todas essas camadas estão empilhadas umas sobre as outras. Cada camada adicional é adicionada como uma diferença da camada antes dela.
Recipientes e camadas
Recipientes são criados a partir de imagens. Quando um recipiente é criado a partir de uma imagem, uma fina camada de leitura/gravação é colocada em cima da imagem (observe que as camadas de imagem são imutáveis, as camadas de contêiner não são). Quaisquer alterações feitas no contêiner são colocadas nesta camada de leitura/gravação durante a vida útil do contêiner. Quando um recipiente é excluído, a camada de leitura/gravação fina associada é removida. Isso significa que vários contêineres podem compartilhar a mesma imagem. Cada camada de contêiner manterá seus próprios dados com segurança em cima da imagem do Docker.
Imagens e recipientes
Vamos tentar um exemplo simples. Você pode usar o comando Docker Images para encontrar todas as imagens:
ID da imagem da tag repositório Tamanho criado |
E o comando PS Docker para encontrar contêineres:
Comando de imagem de identificação de contêiner nomes de portas de status criados |
Esta é uma instalação fresca do Docker. Portanto, não há imagem ou recipiente presente. Você pode executar o Docker Run -Node: 6.9.2 comando para iniciar um contêiner.
Incapaz de encontrar a imagem 'Nó: 6.9.2 'localmente |
6.9.2: puxando da biblioteca/nó |
75A822CD7888: Pull completo |
57DE64C72267: Puxe completo |
4306BE1E8943: Puxe completo |
871436AB7225: Puxe completo |
0110C26A367A: Pull completo |
1F04FE713F1B: Pull completo |
AC7C0B5FB553: Pull completo |
Digest: SHA256: 2E95BE60FAF429D6C97D928C762CB36F1940F4456CE4BD33FBDC34DE94A5E043 |
STATUS: Baixada Imagem mais recente para o nó: 6.9.2 |
Agora, se verificarmos novamente as imagens do Docker, encontramos:
ID da imagem da tag repositório Tamanho criado |
Nó 6.9.2 faaadb4aaf9b 11 meses atrás 655 MB |
E se verificarmos o contêiner, encontramos:
Comando de imagem de identificação de contêiner nomes de portas de status criados |
8C48C7E03BC7 Nó: 6.9.2 "nó" 20 segundos atrás de 18 segundos reverent_jackson |
Se iniciarmos outro contêiner da mesma imagem usando o comando:
E verifique novamente, vemos:
ID da imagem da tag repositório Tamanho criado |
Nó 6.9.2 faaadb4aaf9b 11 meses atrás 655 MB |
E
Comando de imagem de identificação de contêiner nomes de portas de status criados |
96E6DB955276 Nó: 6.9.2 "nó" 24 segundos atrás, 23 segundos cocky_dijkstra |
8C48C7E03BC7 Nó: 6.9.2 "nó" 4 minutos atrás, 4 minutos reverent_jackson |
Os dois contêineres com ID de contêiner 96E6DB955276 e 8C48C7E03BC7 estão funcionando na parte superior da imagem do Docker com o ID da imagem FAAADB4AAF9B. As finas camadas de leitura/gravação dos recipientes do docker estão residindo em cima da camada da imagem do docker.
Dicas:
Você pode remover os contêineres do Docker com o comando Docker RM [ID do contêiner] e remover imagens do Docker com o comando Docker RMI [ID da imagem].
O nó da imagem: 6.9.2 Download do Docker Hub também é criado combinando várias camadas. Você pode verificar as camadas de imagens usando o histórico do Docker [ID da imagem].
$ Docker History Faaadb4aaf9b |
Imagem criada por tamanho |
faaadb4aaf9b 11 meses atrás /bin /sh -c #(nop) cmd ["nó"] 0b |
11 meses atrás/bin/sh -c Curl -slo "https: // nodejs.org/d 42.5 MB |
11 meses atrás /bin /sh -c #(nop) Env node_version = 6.9.2 0b |
11 meses atrás /bin /sh -c #(NOP) Env npm_config_loglevel 0b |
11 meses atrás /bin /sh -c set -ex && para chave em 955 108kb |
11 meses atrás /bin /sh -c Groupadd -Gid 1000 Node && u 335kb |
11 meses atrás /bin /sh -c apt-get update && apt-get insta 323mb |
Conclusão
Uma maneira popular de explicar imagens e contêineres é comparar uma imagem com uma classe e um contêiner com a instância dessa classe. A abordagem em camadas de imagens e recipientes do docker ajuda a manter o tamanho de imagens e recipientes pequenos.
Referências:
- https: // docs.Docker.com/mecanismo/userguida/storagedriver/imagens eContainers/
- Docker Image vs Container
- https: // Stackoverflow.com/questões/23735149/docker-image-vs-container