Docker: guia completo para iniciantes (2025)
Conceitos, comandos essenciais, Dockerfile e Docker Compose em um só lugar.

O Docker permite empacotar aplicações e suas dependências em containers portáteis. Isso garante consistência entre desenvolvimento, testes e produção. Este guia reúne o essencial para você começar bem.

1. O que é Docker?

Docker é uma plataforma de containerização. Em vez de uma máquina virtual completa, o container compartilha o kernel do sistema, ficando leve e rápido.

  • Portabilidade: funciona igual em qualquer ambiente.
  • Consistência: mesmo stack em dev, QA e produção.
  • Isolamento: apps não conflitam entre si.
  • Eficiência: menor uso de recursos que VMs.

2. Conceitos fundamentais

  • Imagem: template somente leitura com app e dependências.
  • Container: instância em execução da imagem.
  • Dockerfile: receita para construir imagens.

3. Instalação do Docker

Windows e macOS: use o Docker Desktop no site oficial.

Linux (Ubuntu/Debian):

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce
docker --version

4. Comandos essenciais

Imagens:

docker pull nginx
docker images
docker rmi nginx

Containers:

docker run -d -p 8080:80 nginx
docker ps
docker ps -a
docker stop <container_id>
docker rm <container_id>
docker exec -it <container_id> sh

5. Primeiro projeto com Docker (Node.js)

Estrutura:

mkdir meu-primeiro-docker
cd meu-primeiro-docker

package.json:

{
  "name": "meu-primeiro-docker",
  "version": "1.0.0",
  "scripts": { "start": "node server.js" },
  "dependencies": { "express": "^4.18.0" }
}

server.js:

const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;

app.get("/", (req, res) => {
  res.send("<h1>Minha primeira aplicação Docker!</h1>");
});

app.listen(PORT, () => console.log("Rodando na porta " + PORT));

Dockerfile:

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

Build e run:

docker build -t minha-app .
docker run -d -p 3000:3000 --name meu-container minha-app
curl http://localhost:3000

.dockerignore:

node_modules
npm-debug.log
.git
.DS_Store

6. Docker Compose

Para múltiplos serviços, use um docker-compose.yml:

version: "3.8"
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    depends_on:
      - db
  db:
    image: postgres:13
    environment:
      POSTGRES_DB: meuapp
      POSTGRES_USER: usuario
      POSTGRES_PASSWORD: senha
    volumes:
      - postgres_data:/var/lib/postgresql/data
volumes:
  postgres_data:

Executar:

docker compose up -d
docker compose down

7. Boas práticas

  • Prefira imagens oficiais.
  • Use .dockerignore para reduzir a imagem.
  • Combine camadas quando possível.
  • Use multi-stage builds em projetos grandes.
  • Evite rodar como root.
  • Defina healthchecks.

Próximos passos

Depois do básico, explore otimização de imagens, CI/CD com Docker e orquestração com Docker Swarm ou Kubernetes.