
Docker, Docker Compose, Docker Swarm e Kubernetes: guia completo para Windows e Linux
Docker, Docker Compose, Docker Swarm e Kubernetes fazem parte de um dos ecossistemas mais importantes da computação moderna. Eles permitem empacotar aplicações, reproduzir ambientes, executar serviços isolados, automatizar implantações e administrar aplicações distribuídas.
O que é um container?
Um container é um ambiente isolado no qual uma aplicação pode ser executada com suas dependências. Containers normalmente são mais leves que máquinas virtuais porque não precisam carregar um sistema operacional completo para cada aplicação.
┌──────────────────────────────────────┐
│ COMPUTADOR │
│ ┌────────────┐ ┌────────────┐ │
│ │ Container │ │ Container │ │
│ │ Nginx │ │ PostgreSQL │ │
│ └────────────┘ └────────────┘ │
│ Docker Engine │
└──────────────────────────────────────┘
Docker
Docker é uma plataforma para desenvolver, distribuir e executar aplicações utilizando containers.
Docker CLI → Docker API → Docker Daemon
├── Images
├── Containers
├── Networks
└── Volumes
Imagens
Uma imagem Docker é um modelo somente leitura utilizado para criar containers.
docker search nginx
docker pull nginx
docker images
docker run nginx
Containers
docker run -d --name meu-nginx -p 8080:80 nginx
docker ps
docker logs meu-nginx
docker stop meu-nginx
docker start meu-nginx
docker rm meu-nginx
Depois do comando, acesse http://localhost:8080.
Dockerfile
Para criar uma imagem própria:
FROM nginx:alpine
COPY ./site /usr/share/nginx/html
docker build -t meu-site:1.0 .
docker run -d -p 8080:80 meu-site:1.0
Registry
Um registry armazena imagens para distribuição.
docker login
docker push usuario/minha-aplicacao:1.0
docker pull usuario/minha-aplicacao:1.0
Volumes
Para dados persistentes, utilize volumes:
docker volume create dados-postgres
docker volume ls
docker run -v dados-postgres:/var/lib/postgresql/data postgres
Redes
docker network create minha-rede
docker run -d --name banco --network minha-rede postgres
docker run -d --name api --network minha-rede minha-api
Docker Compose
Docker Compose permite definir e executar aplicações compostas por múltiplos containers utilizando YAML.
Crie compose.yaml:
services:
web:
image: nginx:alpine
ports:
- "8080:80"
redis:
image: redis:alpine
docker compose up -d
docker compose ps
docker compose logs
docker compose down
API + PostgreSQL
services:
api:
build: ./api
ports:
- "8000:8000"
environment:
DATABASE_URL: postgresql://app:senha@db:5432/app
depends_on:
- db
db:
image: postgres:17
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD: senha
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Dentro da rede criada pelo Compose, db é o nome do serviço e pode ser utilizado como hostname.
Docker Swarm
O Docker Swarm Mode é o mecanismo integrado ao Docker Engine para administrar um cluster de Docker Engines. Managers participam do controle do cluster e Workers executam tarefas.
docker swarm init
docker node ls
Nos demais nós, utilize o comando docker swarm join mostrado pelo manager.
docker service create --name web --publish 8080:80 --replicas 3 nginx
docker service ls
docker service ps web
docker service scale web=5
Kubernetes
Kubernetes, ou K8s, é uma plataforma open source para gerenciar workloads e serviços containerizados. Seu modelo é declarativo: você descreve o estado desejado e o Kubernetes trabalha para mantê-lo.
Control Plane
┌───────────────────────────┐
│ API Server │
│ etcd │
│ scheduler │
│ controller-manager │
└─────────────┬─────────────┘
│
┌───────────┼───────────┐
Node Node Node
│ │ │
Pods Pods Pods
Pod
Pod é a menor unidade implantável do Kubernetes e pode conter um ou mais containers.
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
kubectl apply -f deployment.yaml
kubectl get deployments
kubectl get pods
Service
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
kubectl apply -f service.yaml
kubectl get services
kubectl
kubectl get nodes
kubectl get pods
kubectl get services
kubectl describe pod NOME
kubectl logs NOME
kubectl apply -f arquivo.yaml
kubectl delete -f arquivo.yaml
Comparação
| Tecnologia | Escopo | Principal finalidade |
|---|---|---|
| Docker | Container | Criar e executar aplicações isoladas |
| Docker Compose | Aplicação | Executar múltiplos containers |
| Docker Swarm | Cluster Docker | Orquestrar serviços Docker |
| Kubernetes | Cluster | Gerenciar workloads containerizados |
Tutorial: Docker no Windows
Uma maneira simples de começar no Windows é utilizar Docker Desktop com WSL 2.
WSL 2
wsl --install
wsl --update
wsl --version
Docker Desktop
Instale o Docker Desktop e utilize a integração com WSL 2 quando disponível.
docker version
docker run hello-world
Primeiro container
docker run -d --name nginx -p 8080:80 nginx
docker ps
docker stop nginx
docker rm nginx
Acesse http://localhost:8080.
Compose no Windows
mkdir docker-demo
cd docker-demo
docker compose up -d
docker compose ps
docker compose down
Kubernetes no Windows
Para aprendizado, opções práticas incluem Kubernetes integrado ao Docker Desktop, Minikube e kind.
kubectl version --client
kubectl get nodes
minikube start
minikube status
Tutorial: Docker no Linux
No Linux podemos instalar diretamente o Docker Engine. O exemplo abaixo utiliza Ubuntu.
Remover versões conflitantes
sudo apt remove docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc
Configurar repositório
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo apt update
Em uma instalação oficial pelo repositório Docker, configure o arquivo de repositório seguindo a documentação da sua versão do Ubuntu.
Instalar Docker Engine
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl status docker
sudo systemctl start docker
sudo docker run hello-world
Executar sem sudo
sudo usermod -aG docker $USER
Depois encerre a sessão e entre novamente. O grupo docker concede privilégios elevados sobre o daemon Docker e deve ser usado conscientemente em servidores compartilhados.
Compose no Linux
docker compose version
docker compose up -d
docker compose ps
docker compose down
Docker Swarm no Linux
docker swarm init
docker node ls
docker service create --name web --publish 8080:80 --replicas 3 nginx
docker service ls
docker service ps web
Kubernetes no Linux
Para aprendizado, Minikube é uma opção simples e kind é outra alternativa para clusters locais.
minikube start
kubectl get nodes
kind create cluster
kubectl get nodes
Deploy Kubernetes completo
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
kubectl apply -f app.yaml
kubectl get pods
kubectl get service
kubectl scale deployment web --replicas=5
kubectl rollout status deployment/web
kubectl rollout history deployment/web
kubectl rollout undo deployment/web
No Minikube, uma forma simples de acesso é minikube service web. Outra opção é kubectl port-forward service/web 8080:80.
Docker não é Kubernetes
Docker é principalmente uma plataforma de containers. Kubernetes é uma plataforma de gerenciamento de workloads containerizados em clusters. Kubernetes não depende exclusivamente do Docker Engine como runtime; ele utiliza um runtime de containers compatível.
Quando utilizar cada tecnologia?
- Docker: containers individuais, imagens, testes e padronização de ambientes.
- Docker Compose: aplicações locais ou ambientes relativamente simples com vários serviços.
- Docker Swarm: clusters Docker com gerenciamento integrado de serviços e réplicas.
- Kubernetes: clusters com múltiplos serviços e nós, escalabilidade, deployments, alta disponibilidade, service discovery, configuração declarativa e ambientes cloud-native.
Boas práticas
- Não coloque senhas diretamente nas imagens.
- Use imagens pequenas quando apropriado.
- Use tags explícitas quando previsibilidade for importante.
- Evite processos desnecessariamente executados como root.
- Mantenha Dockerfiles, compose.yaml e manifests Kubernetes no Git.
- Faça backup dos dados persistentes.
- Monitore logs, recursos e saúde dos serviços em produção.
Comandos essenciais
Docker
docker version
docker info
docker images
docker ps
docker ps -a
docker pull nginx
docker run nginx
docker logs <container>
docker exec -it <container> sh
docker build -t minha-imagem .
docker volume ls
docker network ls
Compose
docker compose up
docker compose up -d
docker compose down
docker compose ps
docker compose logs
docker compose restart
docker compose build
docker compose up -d --build
Swarm
docker swarm init
docker swarm join
docker node ls
docker service create
docker service ls
docker service ps
docker service logs
docker service scale
docker service update
docker service rm
Kubernetes
kubectl cluster-info
kubectl get nodes
kubectl get pods
kubectl get deployments
kubectl get services
kubectl describe pod <nome>
kubectl logs <nome>
kubectl exec -it <nome> -- sh
kubectl apply -f arquivo.yaml
kubectl delete -f arquivo.yaml
kubectl scale deployment <nome> --replicas=3
kubectl rollout status deployment/<nome>
kubectl rollout undo deployment/<nome>
Conclusão
Docker mudou a forma como aplicações podem ser empacotadas e executadas com containers. Docker Compose organiza aplicações multi-container. Docker Swarm adiciona gerenciamento de clusters Docker. Kubernetes oferece uma plataforma declarativa de orquestração para workloads containerizados.
Uma sequência prática de aprendizado é Docker → Dockerfile → Volumes e Networks → Docker Compose → Docker Swarm → Kubernetes → Deployments e Services → Storage, Secrets e ConfigMaps → Observabilidade e segurança.
