1

O que é Docker? Imagens, contêineres e a diferença para VMs

Se você já viu um projeto funcionar na sua máquina e falhar na do colega ou no servidor, provavelmente esbarrou em diferenças de ambiente. Neste resumo, vou explicar como Docker ajuda a empacotar o programa com o que ele precisa para rodar, e como distinguir imagem, contêiner e Registry.

O problema que o Docker resolve

Versões diferentes de Python, bibliotecas ausentes, configurações e caminhos distintos são causas comuns de um programa se comportar de um jeito em cada máquina. Resolver isso com uma lista manual de instalação costuma dar margem para alguém pular uma etapa.

Com Docker, você reúne a aplicação e o ambiente de execução em uma imagem. Assim, quem tiver Docker pode iniciar esse pacote com o mesmo comando. Por exemplo, este comando inicia o nginx em segundo plano e publica a porta 80 do contêiner na porta 8080 da máquina:

docker run -d -p 8080:80 nginx:1.30

A ideia é que o mesmo servidor web seja iniciado em Windows, macOS ou Linux com esse comando, desde que o Docker esteja disponível.

Imagem, contêiner e Registry

Uma imagem é um modelo somente leitura que contém o programa, bibliotecas e configurações. O contêiner é uma instância dessa imagem em execução. Uma analogia útil: imagem é como um disco de instalação; contêiner é o programa instalado e rodando.

Você pode iniciar vários contêineres a partir da mesma imagem. Cada um ganha sua própria camada gravável, processo e rede. Alterações feitas dentro de um contêiner não mudam a imagem original. Se apagar o contêiner, a imagem ainda pode ser usada para iniciar outro, mas os dados da camada gravável daquele contêiner desaparecem. Para dados que precisam sobreviver, como os de um banco, use um Volume.

O terceiro conceito é o Registry: um servidor que armazena e compartilha imagens. O Docker Hub é o mais usado. Quando você executa docker run nginx sem especificar outro endereço, o Docker procura a imagem lá. Também existem Registries do GitHub e de provedores de nuvem; equipes podem publicar suas próprias imagens nesses serviços.

Camadas ajudam a reutilizar imagens

Imagens são compostas de camadas. Uma imagem de um site Node.js, por exemplo, pode ter uma camada do sistema base, outra com o ambiente Node.js, uma com pacotes instalados e a camada do código da aplicação.

Imagens diferentes conseguem compartilhar camadas inferiores. Se várias usam Debian como base, essa camada é armazenada e baixada uma vez, em vez de ser duplicada para cada imagem. Isso ajuda a entender por que a ordem das instruções em um Dockerfile faz diferença: mudanças em partes mais altas podem aproveitar as camadas que continuam iguais.

O caminho do comando até o contêiner

Ao digitar docker no terminal, você usa a Docker CLI, o cliente de linha de comando. Ela não executa contêineres diretamente: envia solicitações ao Docker Engine, serviço em segundo plano que baixa imagens e cria e gerencia contêineres, redes e Volumes. Para obter ou enviar imagens, o Engine conversa com um Registry.

CLI e Engine são componentes separados. Isso permite usar o comando no notebook para controlar o Engine de um servidor remoto. Ao consultar docker version, as informações aparecem como Client e Server, correspondendo a esses lados da comunicação.

No Windows e no macOS, o Engine precisa de um ambiente Linux. O Docker Desktop prepara uma máquina virtual Linux leve e instala ferramentas como CLI e Compose. No Linux, você pode instalar o Docker Engine diretamente.

Contêineres e máquinas virtuais

Uma máquina virtual simula um computador inteiro e inclui um sistema operacional completo. Um contêiner compartilha o kernel do sistema operacional do host e isola o que o programa precisa, como sistema de arquivos, processos e rede.

Na prática, contêineres costumam iniciar em menos de um segundo e ocupam de alguns MB a centenas de MB. VMs normalmente levam de dezenas de segundos a minutos para iniciar e podem ocupar vários GB. Como compartilham o kernel, contêineres Linux precisam de um kernel Linux; uma VM pode executar outro sistema operacional, como Windows em um host Linux.

Isso não torna contêineres substitutos de VMs. Os dois aparecem juntos com frequência: serviços de nuvem podem executar contêineres dentro de máquinas virtuais. A escolha depende do isolamento e do ambiente que você precisa.

Resumo

  • Docker empacota programa e ambiente para reduzir diferenças entre máquinas.
  • Imagem é o modelo; contêiner é uma instância em execução; Registry guarda imagens.
  • A CLI envia solicitações ao Engine, que gerencia contêineres e troca imagens com o Registry.
  • Contêineres são leves e rápidos, mas compartilham o kernel do host; VMs incluem um sistema operacional completo.

O capítulo completo, com todos os comandos e saídas, está na fonte deste post.

Carregando publicação patrocinada...