Pular para conteúdo

Containers e Docker

TLDR: um container empacota uma aplicação com só as dependências que ela precisa, compartilhando o kernel do sistema host, o que o torna muito mais leve que uma máquina virtual. Docker Compose orquestra vários containers a partir de um arquivo de configuração.

Container vs. máquina virtual

Um container inclui um sistema mínimo junto com as ferramentas e bibliotecas que uma aplicação precisa pra rodar, mas compartilha o kernel do sistema operacional host. Uma máquina virtual (VM) carrega um sistema operacional completo próprio, incluindo o kernel, o que a torna mais pesada e mais lenta pra iniciar.

flowchart LR
    subgraph "Máquina virtual"
        VM_OS["SO completo"] --- VM_APP["Aplicação"]
    end
    subgraph "Container"
        C_APP["Aplicação + libs necessárias"]
    end
    HOST["Kernel do host (compartilhado)"]
    C_APP -.-> HOST

Docker Compose

Docker Compose orquestra múltiplos containers a partir de um único arquivo de configuração, útil quando uma aplicação precisa de vários serviços coordenados (a própria aplicação, um banco de dados, uma fila).

Dois mecanismos que aparecem em qualquer configuração de Compose:

  • Bind mount: mapeia um diretório do host diretamente pra dentro do container. Qualquer alteração de um lado aparece do outro lado, imediatamente, sem reconstruir o container. É o que permite editar código no host e ver o efeito rodando dentro do container.
  • Port forwarding: redireciona tráfego de rede de uma porta do host pra uma porta do container, permitindo acessar um serviço rodando dentro do container por uma porta local da máquina.
  • Named volume: persiste dado entre reinicializações do container. Sem ele, um banco de dados rodando em container seria zerado toda vez que o container reiniciasse.

Pra ir além

A documentação oficial do Docker cobre os conceitos de imagem, container e Compose com exemplo prático. Pra entender exatamente por que containers são mais leves, o artigo Namespaces e cgroups do kernel Linux explica o mecanismo por trás do isolamento sem precisar de um kernel próprio por container.