Docker e Containerização: Conceitos Básicos e Uso
Docker empacota aplicações em contêineres para implantação consistente e portátil. Este guia cobre os fundamentos do Docker, escrita de Dockerfile e gerenciamento de contêineres.
Atualizado em:O que é Docker?
Docker é uma plataforma que empacota aplicações e suas dependências em contêineres. Contêineres são ambientes de execução leves e isolados.
VM vs Container: Máquinas virtuais executam um sistema operacional completo (GBs). Contêineres compartilham o kernel do SO host e ocupam MBs.
Consistência: Resolve o problema de 'funciona na minha máquina'. Os ambientes de desenvolvimento, teste e produção usam o mesmo contêiner.
Portabilidade: Contêineres funcionam em qualquer plataforma compatível com Docker (Linux, Windows, Mac, cloud).
Conceitos Fundamentais do Docker
Image: Modelo para um contêiner. Armazenada como camadas somente leitura. Construída a partir de um Dockerfile.
Container: Instância em execução de uma imagem. Cada contêiner executa como um processo isolado.
Dockerfile: Arquivo de texto que define como construir uma imagem. Contém instruções como FROM, RUN, COPY, CMD.
Registry: Repositório que armazena e distribui imagens. Docker Hub é o registry público mais popular.
Volume: Armazenamento usado para persistir dados do contêiner. Os dados são preservados mesmo se o contêiner for removido.
Escrita de Dockerfile
FROM node:18-alpine: Use Node.js 18 (Alpine Linux) como imagem base. Alpine é uma imagem base de tamanho pequeno.
WORKDIR /app: Defina o diretório de trabalho como /app. Todos os comandos subsequentes executam neste diretório.
COPY package*.json ./: Copie package.json e package-lock.json. Instale dependências com RUN npm install.
COPY . .: Copie todo o código fonte. Crie o build de produção com RUN npm run build.
EXPOSE 3000: Especifique que o contêiner escuta na porta 3000. Defina o comando a executar quando o contêiner iniciar com CMD ["npm", "start"].
Comandos Básicos do Docker
docker build -t myapp:1.0 .: Construa a imagem a partir do Dockerfile. Etiquete a imagem com nome:versão usando -t.
docker run -p 3000:3000 myapp:1.0: Execute o contêiner. Mapeie a porta do host para a porta do contêiner com -p.
docker ps: Liste os contêineres em execução. docker ps -a: Liste todos os contêineres (incluindo os parados).
docker stop <container_id>: Pare o contêiner. docker rm <container_id>: Remova o contêiner.
docker images: Liste as imagens locais. docker rmi <image_id>: Remova a imagem.
Docker Compose
Docker Compose é uma ferramenta para definir e gerenciar aplicações multi-contêiner. Configurado com arquivo docker-compose.yml.
Serviços: Cada serviço é um contêiner. Defina serviços como web (frontend), api (backend), db (banco de dados).
Volumes: Defina volumes para persistência de dados. networks: Crie networks para comunicação entre serviços.
docker compose up: Inicie todos os serviços. docker compose down: Pare e remova todos os serviços.
docker compose up -d: Execute em modo detached (segundo plano). docker compose logs -f: Acompanhe os logs.
Melhores Práticas
Imagens pequenas: Use imagens base Alpine ou distroless. Remova dependências de build da imagem final com multi-stage build.
Layer caching: COPY dependências (que mudam raramente) primeiro, código (que muda frequentemente) depois. Isso otimiza o build cache.
.dockerignore: Ignore arquivos desnecessários (node_modules, .git, logs). Isso reduz o build context.
Segurança: Use usuário non-root em vez de root. Crie usuário com RUN adduser --disabled-password appuser.
Health check: Use a instrução HEALTHCHECK para realizar verificação de saúde do contêiner. Docker reinicia automaticamente contêineres unhealthy.