Docker, Docker Compose, Docker Swarm e Kubernetes: guia completo para Windows e Linux

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

TecnologiaEscopoPrincipal finalidade
DockerContainerCriar e executar aplicações isoladas
Docker ComposeAplicaçãoExecutar múltiplos containers
Docker SwarmCluster DockerOrquestrar serviços Docker
KubernetesClusterGerenciar 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.

Referências oficiais

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *