Docker para Desenvolvedores: Imagens, Contêineres e Compose
Você provavelmente já ouviu falar sobre Docker e contêineres, mas talvez não tenha certeza de como eles se encaixam no seu fluxo de trabalho diário de desenvolvimento. Ou talvez você já tenha experimentado o Docker, mas os conceitos de imagens, contêineres e Compose pareçam confusos. Este guia vai te mostrar o essencial com exemplos práticos, para que você possa começar a usar o Docker de forma eficaz em seus projetos.
O que são imagens e contêineres Docker?
Pense em uma imagem Docker como um projeto para sua aplicação. Ela contém tudo o que é necessário para executar seu código: o sistema operacional, runtime, bibliotecas e os arquivos da sua aplicação. As imagens são imutáveis e construídas a partir de um Dockerfile.
Um contêiner é uma instância em execução de uma imagem. Quando você inicia um contêiner, o Docker cria um ambiente isolado a partir da imagem. Você pode executar vários contêineres da mesma imagem, cada um com seu próprio estado.
Principais diferenças
| Imagem | Contêiner |
|---|---|
| Modelo somente leitura | Instância executável |
| Construída a partir do Dockerfile | Criada a partir da imagem |
| Armazenada em registro | Executada no host |
| Imutável | Efêmera (pode ser parada, iniciada, excluída) |
Construindo sua primeira imagem Docker
Vamos criar uma aplicação Node.js simples e containerizá-la. Comece com um Dockerfile na raiz do seu projeto:
# Use um runtime Node.js oficial como imagem pai
FROM node:18-alpine
# Defina o diretório de trabalho
WORKDIR /app
# Copie package.json e package-lock.json
COPY package*.json ./
# Instale as dependências
RUN npm ci --only=production
# Copie o restante do código da aplicação
COPY . .
# Exponha a porta em que a aplicação é executada
EXPOSE 3000
# Defina o comando para executar a aplicação
CMD ["node", "server.js"]
Construa a imagem com:
docker build -t my-node-app .
Execute um contêiner a partir da imagem:
docker run -p 3000:3000 -d my-node-app
Sua aplicação agora está acessível em http://localhost:3000.
Gerenciando contêineres
Aqui estão os comandos essenciais para gerenciar contêineres:
docker ps– lista os contêineres em execuçãodocker ps -a– lista todos os contêineres (incluindo os parados)docker stop <container_id>– para um contêiner em execuçãodocker rm <container_id>– remove um contêiner paradodocker logs <container_id>– visualiza os logs do contêinerdocker exec -it <container_id> sh– abre um shell dentro de um contêiner em execução
Simplificando aplicações multi-contêiner com Docker Compose
Aplicações reais geralmente precisam de vários serviços: um servidor web, um banco de dados, um cache, etc. Gerenciar isso com comandos docker run individuais é tedioso. O Docker Compose permite definir e executar aplicações multi-contêiner usando um arquivo YAML.
Crie um docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Inicie todos os serviços com:
docker compose up -d
Pare e remova-os com:
docker compose down
Boas práticas para desenvolvimento
- Use .dockerignore para excluir arquivos desnecessários (node_modules, .git) do contexto de build.
- Aproveite o cache de camadas: ordene as instruções do Dockerfile para que as dependências sejam instaladas antes de copiar o código-fonte.
- Use builds multi-stage para manter as imagens de produção pequenas.
- Armazene dados em volumes para bancos de dados e outros serviços com estado.
- Use o Compose para desenvolvimento local para replicar ambientes semelhantes à produção.
FAQ
Qual é a diferença entre uma imagem e um contêiner?
Uma imagem é um modelo somente leitura que define a aplicação e suas dependências. Um contêiner é uma instância em execução de uma imagem, com uma camada gravável por cima.
Posso usar o Docker Compose em produção?
O Docker Compose é projetado principalmente para desenvolvimento e testes. Para produção, considere ferramentas de orquestração como Kubernetes ou Docker Swarm.
Como faço para persistir dados no Docker?
Use volumes ou bind mounts. Os volumes são gerenciados pelo Docker e são a forma preferida de persistir dados gerados por contêineres.
Pronto para containerizar sua aplicação? Se você precisar converter documentação ou guias para PDF para sua equipe, experimente nosso conversor de Word para PDF para compartilhar documentos refinados.