O que e Docker?

Uma plataforma que empacota aplicações em containers isolados e portáteis.

Docker e uma plataforma open source que resolve um dos problemas mais clássicos do desenvolvimento de software: na minha máquina funciona. Ele empacota uma aplicação com todas as suas dependências, código, runtime, bibliotecas, variáveis de ambiente, em um container isolado. Esse container roda de forma idêntica em qualquer ambiente: notebook do desenvolvedor, servidor de staging, produção na nuvem. Lancado em 2013, o Docker popularizou a containerização e mudou como aplicações são desenvolvidas, distribuídas e operadas. Hoje e parte fundamental do ecossistema DevOps e base para tecnologias como Kubernetes, que orquestra containers em escala.

Container vs Máquina Virtual

Containers compartilham o kernel do host e são muito mais leves do que VMs completas.

Maquinas virtuais emulam hardware completo e rodam um sistema operacional inteiro dentro do host. Uma VM com Ubuntu pode ter 20GB de disco e levar minutos para iniciar. Um container Docker para a mesma aplicação pode ter 200MB e iniciar em segundos. A diferença e que containers compartilham o kernel do sistema operacional host. Cada container tem seu próprio sistema de arquivos, processos e rede, mas usa o mesmo kernel Linux do host. Isso torna containers muito mais eficientes em uso de recursos. E possível rodar dezenas de containers em um servidor onde caberia apenas alguns VMs. Containers não substituem VMs para todos os casos, VMs oferecem isolamento mais forte, mas para a maioria das aplicações web, containers são superiores.

O que e um Dockerfile

Um arquivo de instruções que define como construir uma image Docker passo a passo.

Um Dockerfile e um arquivo de texto com instruções para construir uma Docker image. Cada instrução cria uma camada na image. As instruções mais comuns são: FROM define a image base (ex: FROM node:20-alpine), RUN executa comandos durante o build (ex: RUN npm install), COPY cópia arquivos do host para a image, WORKDIR define o diretorio de trabalho, EXPOSE documenta qual porta o container usa, CMD define o comando padrão ao iniciar o container. O Dockerfile e o contrato de build da aplicação, qualquer pessoa com o Dockerfile pode construir a image idêntica. Isso elimina diferências de ambiente e torna o build reproduzível em qualquer máquina.

Images e camadas

Uma Docker image e um conjunto de camadas imutáveis empilhadas sobre uma base.

Uma Docker image e construída em camadas. Cada instrução no Dockerfile cria uma nova camada sobre a anterior. Camadas são imutáveis e armazenadas em cache. Se nenhuma instrução mudou até o passo 5, o Docker reutiliza as camadas do build anterior e só reconstroi a partir da mudanca. Isso acelera drasticamente o tempo de build em desenvolvimento. A ordem das instruções no Dockerfile importa, colocar as instruções que mudam menos frequentemente no inicio (como instalação de dependências) e as que mudam mais no final (como copiar o código da aplicação) maximiza o aproveitamento do cache. Images bem organizadas constroem em segundos em vez de minutos.

Docker Hub e registries

O repositório central onde images públicas e privadas são armazenadas e distribuídas.

O Docker Hub e o registry público oficial do Docker. Ele armazena milhares de images oficiais: node, python, nginx, postgres, redis, mongodb. Para usar uma image, basta fazer docker pull nginx ou referenciar no FROM do Dockerfile. Além do Docker Hub, empresas usam registries privados: GitHub Container Registry (ghcr.io), Amazon ECR, Google Artifact Registry, Azure Container Registry. Um registry privado armazena as images da empresa sem expor o código publicamente. O workflow padrão e: desenvolver localmente, buildar a image, fazer push para o registry, e o servidor de produção faz pull do registry para deployar a nova versão.

Docker Compose

Definir e rodar aplicações multi-container com um único arquivo YAML.

Docker Compose e uma ferramenta para definir e rodar aplicações que precisam de múltiplos containers. Um arquivo docker-compose.yml descreve todos os serviços da aplicação: backend, banco de dados, cache, worker. Com um único docker-compose up, todos os containers sobem na ordem correta com a rede e volumes configurados. Isso e especialmente util em desenvolvimento: qualquer membro do time roda docker-compose up e tem o ambiente completo funcionando sem configurar banco de dados localmente. O Compose também define volumes para persistência de dados, variáveis de ambiente por serviço, health checks e dependências entre serviços. Em produção, Docker Compose e usado para ambientes menores; Kubernetes e usado para escala maior.

Volumes e persistência de dados

Containers são efemeros, dados que precisam persistir devem usar volumes.

Por padrão, quando um container e removido, todos os dados dentro dele são perdidos. Para dados que precisam persistir, banco de dados, uploads de arquivos, logs, Docker usa volumes. Um volume e um diretorio gerenciado pelo Docker, fora do filesystem do container, que sobrevive ao ciclo de vida do container. No docker-compose.yml, um volume e declarado e montado no container. Quando o container e recriado (ex: novo deploy), o volume ja existente e remontado com os dados intactos. Bind mounts são outra opção, montam um diretorio do host diretamente no container, util em desenvolvimento para ver mudancas de código sem rebuild.

Rede entre containers

Containers na mesma rede Docker se comunicam pelo nome do serviço como hostname.

O Docker cria redes virtuais para isolar containers. Containers no mesmo docker-compose podem se comunicar usando o nome do serviço como hostname. Por exemplo, o serviço backend pode conectar ao banco usando postgres://database:5432 se o serviço de banco se chama database no Compose. Isso elimina IPs hardcoded e torna a configuração portável. Docker tem tres tipos de rede principais: bridge (padrão para containers no mesmo host), host (container usa a rede do host diretamente) e overlay (para containers em hosts diferentes, usado com Docker Swarm). Para expor um serviço ao mundo externo, a porta do container e mapeada para uma porta do host: ports: "8080:80" mapeia a porta 80 do container para 8080 no host.

Docker no mundo real

Como equipes usam Docker no dia a dia de desenvolvimento e produção.

Em desenvolvimento, Docker elimina o precisa instalar versão X do Node problema. O docker-compose.yml define versões exatas de cada dependência. Novos membros do time rodam docker-compose up e estão prontos em minutos. Em CI/CD, pipelines buildام a image Docker, rodam testes dentro do container e fazem push para o registry. Em produção, o servidor faz pull da imagem buildada pelo CI e inicia o container. Esse fluxo garante que o exato mesmo artefato que passou nos testes e o que vai para produção. Empresas como Spotify, Netflix e Airbnb usam Docker em grande escala para deployar centenas de serviços com consistência e velocidade.

Resumo final

Docker e a base do desenvolvimento moderno de software, entender e indispensável.

Docker resolveu um problema fundamental: garantir que software rode de forma idêntica em qualquer ambiente. Com Dockerfiles declarativos, images versionadas e Docker Compose para orquestrar múltiplos serviços, ele se tornou ferramenta indispensável no ecossistema de desenvolvimento moderno. Containers são mais leves que VMs, iniciam em segundos e podem ser criados e destruidos com frequência. O Docker Hub e os registries privados viabilizam a distribuição de images entre ambientes. Para quem quer trabalhar em backend, DevOps ou qualquer area de infraestrutura, dominar Docker não e opcional, e prerequisito.

Tutoriais em Video

Conceitos-chave

Container

Pacote isolado com código runtime bibliotecas e configurações, roda de forma idêntica em qualquer ambiente

Docker Image

Template imutável para criar containers, construída a partir de Dockerfile

Dockerfile

Arquivo de instruções para construir uma image, FROM RUN COPY CMD EXPOSE

Docker Hub

Registry público de images Docker

Docker Compose

Ferramenta para definir e rodar multi-containers com um único arquivo YAML

Container vs VM

Container compartilha o kernel do host, muito mais leve que uma VM completa

Docker no Instagram

@bytebytego

Reels, Docker

@bytebytego

Docker no Facebook

Docker no X (Twitter)

@mjovanovictech

Software architecture patterns explained

Ver post completo no X →
@mjovanovictech

System design best practices

Ver post completo no X →
@mjovanovictech

Domain events and distributed systems

Ver post completo no X →
@mjovanovictech

Building resilient distributed systems

Ver post completo no X →
@mjovanovictech

Microservices vs monolith decisions

Ver post completo no X →
@mjovanovictech

Software design fundamentals

Ver post completo no X →

O que devs dizem

Gabriel N. ★★★★★

Antes do Docker, onboarding de um dev novo levava um dia inteiro configurando ambiente. Depois de Dockerizar tudo, leva 15 minutos. docker-compose up e o ambiente esta rodando. Essa mudanca sozinha justificou todo o investimento em aprender Docker.

Leticia S. ★★★★★

Multi-stage builds reduziram nossa image de produção de 1.2GB para 180MB. O impacto no tempo de deploy foi enorme, pull 6x mais rápido, startup dos containers muito mais rápido. Vale muito aprender essa técnica.

Diego R. ★★★★☆

O maior beneficio não foi a padronização de ambiente, foi poder testar localmente com a mesma versão do banco que roda em produção. Acabaram os bugs que só apareciam em staging por causa de diferença de versão do Postgres.