01 Porquê usar Docker Desktop para K8s?
A opção mais integrada para Windows — sem configuração adicional
O Docker Desktop é a forma oficial e recomendada de usar Docker e Kubernetes no Windows. Inclui tudo o que precisas num único instalador: Docker Engine, Docker Compose, kubectl e um cluster Kubernetes de nó único — activado com um simples toggle.
Um toggle, um cluster
Não há configuração manual. Nas Preferências do Docker Desktop, activas o K8s e em 2-3 minutos tens um cluster completo a funcionar.
zero configuraçãokubectl automático
O Docker Desktop instala e configura o kubectl automaticamente. O contexto docker-desktop é criado no teu ~/.kube/config.
Imagens partilhadas
As imagens Docker que construes localmente estão imediatamente disponíveis no cluster K8s — sem push para registry.
sem pushIntegrado no Windows
Interface gráfica na system tray, integração com WSL 2, Windows Terminal e PowerShell. Parece nativo no Windows.
experiência nativaCompose + K8s
Podes usar Docker Compose para desenvolvimento e depois converter para manifests K8s com kompose — mesmo projecto, dois ambientes.
Extensions
O Docker Desktop tem um marketplace de extensões — Portainer, Lens, Snyk, Kubernetes Dashboard e muito mais, instaladas com 1 clique.
extensívelComparação com alternativas no Windows
| Ferramenta | Facilidade | Recursos | Multi-nó | Ideal para |
|---|---|---|---|---|
| Docker Desktop K8s | ⭐ Muito fácil | Baixo (1 nó) | ✗ | Iniciantes, desenvolvimento diário |
| minikube | Fácil | Baixo (1 nó) | ✗ (com flags) | Lab, addons avançados (Ingress) |
| kind | Médio | Muito baixo | ✓ | CI/CD local, testes multi-nó |
| k3s (WSL 2) | Médio | Muito baixo | ✓ | Produção edge, IoT |
| Rancher Desktop | Fácil | Baixo (1 nó) | ✗ | Alternativa open-source ao Docker Desktop |
02 Requisitos do Sistema
Verificar antes de instalar — evita problemas
Requisitos de hardware e software
- Windows 10 versão 22H2 (64-bit) ou Windows 11
- 8 GB de RAM (4 GB para Docker, 2 GB para K8s)
- 20 GB de espaço livre em disco
- Processador com suporte a virtualização (Intel VT-x / AMD-V)
- BIOS/UEFI com virtualização activada
- WSL 2 ou Hyper-V activado
- Windows 11 (melhor integração WSL 2)
- 16 GB de RAM (ou mais)
- SSD com 50+ GB livres
- 4+ núcleos de CPU
- WSL 2 como backend (mais rápido que Hyper-V)
- Windows Terminal instalado
Verificar se a virtualização está activa
# Verificar se a virtualização está activa no processador Get-ComputerInfo -Property HyperVRequirementVirtualizationFirmwareEnabled # Resultado esperado: HyperVRequirementVirtualizationFirmwareEnabled : True # Verificar versão do Windows Get-ComputerInfo -Property WindowsVersion, OsArchitecture # OsArchitecture deve ser: 64-bit # Verificar RAM disponível (em GB) (Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB | Round # Verificar estado do WSL wsl --status Versão Padrão: 2 Distribuição predefinida: Ubuntu # Ver espaço livre no disco C: Get-PSDrive C | Select-Object @{N="Livre_GB";E={[math]::Round($_.Free/1GB,1)}}
Activar WSL 2 (se ainda não estiver activo)
# Passo 1: Activar funcionalidade WSL dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # Passo 2: Activar funcionalidade Virtual Machine Platform dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart # Passo 3: Reiniciar o PC # Após reiniciar: # Passo 4: Definir WSL 2 como versão padrão wsl --set-default-version 2 A operação foi concluída com êxito. # Passo 5: Instalar Ubuntu (ou outra distro) wsl --install -d Ubuntu A instalar: Ubuntu Ubuntu instalado. # Verificar: WSL 2 a funcionar wsl --list --verbose NAME STATE VERSION * Ubuntu Running 2
03 Instalar o Docker Desktop
Download, instalação e primeira configuração
Descarregar o instalador
Vai a docker.com/products/docker-desktop e clica em "Download for Windows". O ficheiro chama-se Docker Desktop Installer.exe (~590 MB). Escolhe a versão AMD64 para processadores Intel/AMD (a maioria dos PCs) ou ARM64 para Surface Pro X e outros ARM.
Executar o instalador
Faz duplo clique no instalador. Na janela de configuração, deixa ambas as opções marcadas: "Use WSL 2 instead of Hyper-V" (recomendado) e "Add shortcut to desktop". Clica em OK e aguarda — pode demorar 3-5 minutos.
Reiniciar quando pedido
Após a instalação, o instalador pode pedir para reiniciar o PC. É normal — o Docker Desktop precisa de activar componentes do sistema (WSL 2 integration, Hyper-V).
Aceitar os termos de serviço
Na primeira abertura, o Docker Desktop mostra os Termos de Serviço. Lê e aceita. Não precisas de criar conta Docker para usar a versão básica — clica em "Continue without signing in" se preferires.
Verificar que está a funcionar
O ícone da baleia 🐋 aparece na system tray (barra de tarefas, canto inferior direito). Quando ficar verde/sólido, o Docker Engine está pronto. Abre o Windows Terminal ou PowerShell e testa:
docker run hello-world — deves ver a mensagem "Hello from Docker!"
# Verificar versão do Docker docker --version Docker version 27.3.1, build ce12230 # Ver informação completa do engine docker info Client: Docker Engine - Community: 27.3.1 OS/Arch: linux/amd64 Context: desktop-linux # Testar com hello-world docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world Hello from Docker! This message shows that your installation appears to be working correctly. # Verificar versão do kubectl (já instalado pelo Docker Desktop) kubectl version --client Client Version: v1.31.2
winget (incluído no Windows 11 e Windows 10 21H1+):winget install Docker.DockerDesktop
04 WSL 2 — O Motor por Baixo
Perceber como o Docker Desktop usa o WSL 2 no Windows
O WSL 2 (Windows Subsystem for Linux, versão 2) é a tecnologia da Microsoft que corre um kernel Linux real dentro do Windows — com performance quase nativa. O Docker Desktop usa o WSL 2 como backend para correr o Docker Engine e o cluster Kubernetes.
ARQUITECTURA DOCKER DESKTOP NO WINDOWS COM WSL 2 ┌─────────────────────────────────────────────────────────────────────┐ │ WINDOWS 11 / 10 │ │ │ │ ┌──────────────────────┐ ┌──────────────────────────────────┐ │ │ │ Docker Desktop GUI │ │ Windows Terminal / PowerShell │ │ │ │ (system tray) │ │ docker, kubectl, helm │ │ │ └──────────┬───────────┘ └──────────────┬───────────────────┘ │ │ │ │ │ │ ┌──────────▼───────────────────────────────▼───────────────────┐ │ │ │ WSL 2 — Kernel Linux (Hyper-V leve, separado das VMs) │ │ │ │ │ │ │ │ ┌─────────────────────────┐ ┌───────────────────────────┐ │ │ │ │ │ docker-desktop (distro)│ │ Ubuntu / Debian (distro) │ │ │ │ │ Docker Engine │ │ Acesso a docker e kubectl │ │ │ │ │ │ Kubernetes cluster │ │ via integração WSL 2 │ │ │ │ │ │ ┌────┐ ┌────┐ ┌────┐ │ └───────────────────────────┘ │ │ │ │ │ │Pod │ │Pod │ │Pod │ │ │ │ │ │ │ └────┘ └────┘ └────┘ │ ┌───────────────────────────┐ │ │ │ │ └─────────────────────────┘ │ Ficheiros Windows │ │ │ │ │ │ /mnt/c/Users/... │ │ │ │ └───────────────────────────────────────────────────────────┘ │ │ └─────────────────────────────────────────────────────────────────────┘
Configurar limites de memória do WSL 2
Por defeito, o WSL 2 pode usar até 50% da RAM do sistema. Se tiveres 8 GB, o WSL 2 (e portanto o Docker + K8s) pode usar 4 GB. Em PCs com menos RAM, pode ser vantajoso limitar:
# Ficheiro: C:\Users\TeuNome\.wslconfig # Cria este ficheiro se não existir [wsl2] # Limitar memória (recomendado: metade da RAM disponível para K8s) memory=6GB # máximo de RAM para WSL 2 (ajusta ao teu PC) processors=4 # número de vCPUs disponíveis swap=2GB # swap file para WSL 2 swapFile=C:\\Temp\\wsl-swap.vhdx # Desactivar compressão de memória (melhora performance) pageReporting=true # Usar o servidor DNS do Windows (evita problemas de resolução) dnsTunneling=true networkingMode=mirrored # WSL 2 partilha o IP do Windows (WSL 2.0+)
# Criar o ficheiro .wslconfig (ajusta os valores ao teu PC) $config = @" [wsl2] memory=6GB processors=4 swap=2GB "@ $config | Out-File -FilePath "$env:USERPROFILE\.wslconfig" -Encoding utf8 # Reiniciar o WSL 2 para aplicar (fecha o Docker Desktop primeiro!) wsl --shutdown # Abre o Docker Desktop novamente # Verificar memória actual do WSL 2 wsl -d docker-desktop -- free -h total used free Mem: 5.8Gi 1.2Gi 4.6Gi
docker e kubectl directamente dentro do Ubuntu/Debian no WSL 2 — sem instalar nada adicional. Activa em Docker Desktop → Settings → Resources → WSL Integration → activa as distros que queres.
05 Activar o Kubernetes no Docker Desktop
O toggle que muda tudo — passo a passo com imagens da interface
Com o Docker Desktop instalado e a funcionar, activar o Kubernetes é uma questão de clicar num toggle. O Docker Desktop cria um cluster de nó único com todos os componentes do Control Plane dentro do mesmo processo WSL 2.
Passo a passo — activar K8s
Abrir as Definições do Docker Desktop
Clica no ícone 🐋 da baleia na system tray → Settings (ou usa o atalho Ctrl+, com o Docker Desktop em foco). Podes também abrir o Docker Desktop e clicar no ícone de engrenagem ⚙️ no canto superior direito.
Navegar para a secção Kubernetes
No menu lateral esquerdo das Settings, clica em "Kubernetes". Esta secção está separada da secção Docker Engine — é específica do cluster K8s integrado.
Activar o toggle "Enable Kubernetes"
Clica no toggle azul ao lado de "Enable Kubernetes". O toggle fica azul (activo). Deixa as outras opções por defeito para começar.
Clicar em "Apply & Restart"
Clica no botão "Apply & Restart" no canto inferior direito. Uma janela de confirmação aparece — clica "Install". O Docker Desktop vai descarregar as imagens K8s (primeira vez: ~500 MB) e iniciar o cluster.
Aguardar a inicialização (2-5 minutos)
O ícone da baleia mostra um indicador de loading circular. Quando parar e o ícone ficar estável, o K8s está pronto. Na barra inferior do Docker Desktop aparece o estado: "Kubernetes running" com um ponto verde.
Verificar no terminal
Abre o PowerShell ou Windows Terminal e executa kubectl get nodes. Deves ver o nó docker-desktop com estado Ready.
# Ver o nó do cluster kubectl get nodes NAME STATUS ROLES AGE VERSION docker-desktop Ready control-plane 5m v1.31.2 # Ver o contexto activo (deve ser docker-desktop) kubectl config current-context docker-desktop # Ver todos os contextos disponíveis kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * docker-desktop docker-desktop docker-desktop minikube minikube minikube # Ver componentes do Control Plane a funcionar kubectl get pods -n kube-system NAME READY STATUS RESTARTS coredns-5dd5756b68-jk9xt 1/1 Running 0 coredns-5dd5756b68-lqzhr 1/1 Running 0 etcd-docker-desktop 1/1 Running 0 kube-apiserver-docker-desktop 1/1 Running 0 kube-controller-manager-docker-desktop 1/1 Running 0 kube-scheduler-docker-desktop 1/1 Running 0
Opções da secção Kubernetes
| Opção | O que faz | Recomendação |
|---|---|---|
| Enable Kubernetes | Liga/desliga o cluster K8s integrado. Quando desligado, os containers Docker continuam a funcionar normalmente. | Activa quando precisares — desactiva para poupar RAM quando não usas |
| Show system containers | Mostra os containers internos do Kubernetes (etcd, apiserver, scheduler...) na lista de containers do Docker Desktop. | Desactivado — os containers internos poluem a lista |
| Enable GPU support | Permite que os Pods acedam à GPU NVIDIA do host. Requer NVIDIA Container Toolkit. | Só activar se trabalhares com ML/CUDA no K8s |
| Reset Kubernetes Cluster | Elimina todo o estado do cluster (Pods, Deployments, Services, ConfigMaps...) e recomeça do zero. Não afecta imagens Docker locais. | Útil quando o cluster fica inconsistente ou para limpar após laboratórios |
06 kubectl no Windows
Configurar o terminal, aliases e autocompletion
O Docker Desktop instala o kubectl automaticamente em C:\Program Files\Docker\Docker\resources\bin\kubectl.exe e adiciona-o ao PATH. Podes usá-lo directamente no PowerShell, Windows Terminal ou Command Prompt.
Configurar o Windows Terminal para K8s
# Adicionar ao teu perfil PowerShell (abre com: notepad $PROFILE) # Ou executa directamente para testar primeiro: # ── Alias para kubectl ──────────────────────────────────────────────── Set-Alias -Name k -Value kubectl # ── Autocompletion do kubectl no PowerShell ─────────────────────────── kubectl completion powershell | Out-String | Invoke-Expression # ── Função para mostrar contexto no prompt ─────────────────────────── function prompt { $ctx = kubectl config current-context 2>/dev/null $ns = kubectl config view --minify -o jsonpath='{.contexts[0].context.namespace}' 2>/dev/null if (-not $ns) { $ns = "default" } Write-Host "[k8s: $ctx/$ns] " -NoNewline -ForegroundColor Cyan Write-Host "PS " -NoNewline $PWD.Path + "> " } # ── Guardar no perfil permanentemente ─────────────────────────────── $profileContent = @' Set-Alias -Name k -Value kubectl kubectl completion powershell | Out-String | Invoke-Expression '@ $profileContent >> $PROFILE
Comandos kubectl essenciais no contexto Windows
| Comando | O que faz no contexto Docker Desktop |
|---|---|
| 🔀 Gerir contextos (múltiplos clusters) | |
| kubectl config get-contexts | Lista todos os clusters: docker-desktop, minikube, GKE, AKS, etc. |
| kubectl config use-context docker-desktop | Mudar para o cluster local do Docker Desktop. Fundamental quando usas múltiplos clusters. |
| kubectl config use-context minikube | Mudar para o minikube se também o tiveres instalado. |
| kubectl config set-context --current --namespace=dev | Define o namespace padrão para o contexto actual — evita escrever -n dev em todos os comandos. |
| 🔍 Ver recursos | |
| kubectl get all | Lista Pods, Services, Deployments e ReplicaSets do namespace actual. |
| kubectl get pods -A | Lista Pods de todos os namespaces — inclui os do sistema K8s. |
| kubectl describe pod <nome> | Informação detalhada — essencial para diagnosticar Pods que não arrancam. |
| kubectl logs -f <pod> | Seguir logs em tempo real. No PowerShell, Ctrl+C para parar. |
| 🔧 Depuração específica Windows | |
| kubectl exec -it <pod> -- sh | Terminal dentro do Pod. Usa sh (em vez de bash) em imagens alpine. |
| kubectl port-forward svc/<nome> 8080:80 | Expõe um Service localmente. Abre http://localhost:8080 no browser do Windows. |
| kubectl cp <pod>:/caminho ./local | Copia ficheiros do Pod para o Windows. Útil para extrair logs ou ficheiros. |
kubectl directamente dentro do Ubuntu no WSL 2 — o Docker Desktop partilha o contexto automaticamente. Se não estiver disponível, instala com: sudo snap install kubectl --classic ou via apt. O ficheiro ~/.kube/config no WSL 2 é partilhado com o Windows.
07 Primeiro Deploy no Cluster Local
Do zero a uma aplicação web acessível em localhost
Uma das maiores vantagens do Docker Desktop K8s é que as imagens Docker locais estão imediatamente disponíveis no cluster — não precisas de fazer push para nenhum registry. Vamos deployar uma aplicação Node.js.
Construir e deployar uma imagem local
# 1. Criar uma app Node.js simples New-Item -ItemType Directory -Name minha-app Set-Location minha-app # Criar server.js @' const http = require('http') const server = http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'text/plain'}) res.end(`Olá do Kubernetes! Pod: ${process.env.HOSTNAME}\n`) }) server.listen(3000, () => console.log('Servidor na porta 3000')) '@ | Out-File -FilePath server.js -Encoding utf8 # Criar Dockerfile @' FROM node:20-alpine WORKDIR /app COPY server.js . EXPOSE 3000 CMD ["node", "server.js"] '@ | Out-File -FilePath Dockerfile -Encoding utf8 # 2. Construir imagem Docker local docker build -t minha-app:1.0 . Successfully built a1b2c3d4e5f6 Successfully tagged minha-app:1.0 # IMPORTANTE: A imagem já está disponível no K8s do Docker Desktop! # Não precisas de docker push
Manifest YAML completo — Deployment + Service
apiVersion: apps/v1 kind: Deployment metadata: name: minha-app labels: app: minha-app spec: replicas: 3 selector: matchLabels: app: minha-app template: metadata: labels: app: minha-app spec: containers: - name: app image: minha-app:1.0 imagePullPolicy: Never # CRÍTICO: usa imagem local, não faz pull ports: - containerPort: 3000 resources: requests: memory: "32Mi" cpu: "50m" limits: memory: "64Mi" cpu: "100m" --- apiVersion: v1 kind: Service metadata: name: minha-app-svc spec: type: LoadBalancer # No Docker Desktop, expõe em localhost! selector: app: minha-app ports: - port: 80 targetPort: 3000
# Aplicar o manifest kubectl apply -f minha-app.yaml deployment.apps/minha-app created service/minha-app-svc created # Verificar que os 3 Pods estão a correr kubectl get pods -w NAME READY STATUS RESTARTS AGE minha-app-7d9f5b4c8-2xk9r 0/1 ContainerCreating 0 3s minha-app-7d9f5b4c8-8mn4p 0/1 ContainerCreating 0 3s minha-app-7d9f5b4c8-kq7zt 0/1 ContainerCreating 0 3s minha-app-7d9f5b4c8-2xk9r 1/1 Running 0 8s minha-app-7d9f5b4c8-8mn4p 1/1 Running 0 9s minha-app-7d9f5b4c8-kq7zt 1/1 Running 0 10s # Ver o Service (LoadBalancer no Docker Desktop expõe em localhost) kubectl get service minha-app-svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE minha-app-svc LoadBalancer 10.100.42.137 localhost 80:32441/TCP 15s # Testar no PowerShell Invoke-WebRequest -Uri http://localhost | Select-Object -ExpandProperty Content Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-2xk9r # Executar 5 vezes — nota que o nome do Pod muda (load balancing!) 1..5 | ForEach-Object { (Invoke-WebRequest http://localhost).Content } Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-2xk9r Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-8mn4p Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-kq7zt Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-2xk9r Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-8mn4p
imagePullPolicy: Never, o K8s usa exclusivamente a imagem local. Sem esta linha, o K8s tenta descarregar minha-app:1.0 do Docker Hub e falha com ImagePullBackOff.
minikube tunnel), o Docker Desktop K8s expõe automaticamente os Services do tipo LoadBalancer em localhost. Sem configuração adicional, consegues aceder à app em http://localhost:80.
08 Kubernetes Dashboard
Interface visual para gerir o cluster sem linha de comandos
O Kubernetes Dashboard é uma interface web que permite ver e gerir todos os recursos do cluster — Pods, Deployments, Services, logs — sem precisar do kubectl. É ideal para aprendizagem e para visualizar o estado geral.
Instalar o Dashboard via kubectl
# 1. Instalar o Dashboard kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml namespace/kubernetes-dashboard created serviceaccount/kubernetes-dashboard created ...vários recursos criados... deployment.apps/kubernetes-dashboard created # 2. Criar conta de administrador para o Dashboard kubectl apply -f - <<'EOF' apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard EOF # 3. Gerar token de acesso kubectl -n kubernetes-dashboard create token admin-user eyJhbGciOiJSUzI1NiIsImtpZCI6Ii... # copia este token! # 4. Iniciar o proxy para aceder ao Dashboard kubectl proxy Starting to serve on 127.0.0.1:8001 # 5. Abrir no browser (em outro terminal ou abre o URL directamente): # http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ # Cola o token gerado no passo 3
Alternativa: Instalar via Docker Desktop Extensions
Abrir o Marketplace de Extensions
No Docker Desktop, clica em "Extensions" no menu lateral → "Browse" ou pesquisa no marketplace integrado.
Instalar "Kubernetes Visualizer" ou "Portainer"
Procura "Kubernetes" no marketplace. O Portainer é uma alternativa popular ao Dashboard oficial — instala e tem uma UI ainda mais completa e fácil de usar.
Aceder via Docker Desktop
Após instalar, a extension aparece no menu lateral do Docker Desktop — acedes com 1 clique, sem precisar de correr kubectl proxy.
09 Configurar Ingress no Docker Desktop
Rotear tráfego HTTP para múltiplos serviços em localhost
O Ingress permite expor múltiplos serviços com um único ponto de entrada — em vez de portas diferentes, usas paths ou hosts diferentes. No Docker Desktop, o Ingress Controller Nginx é instalado manualmente (não há addon como no minikube).
Instalar o Nginx Ingress Controller
# Opção 1: Instalar via manifest oficial kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.0/deploy/static/provider/cloud/deploy.yaml # Aguardar o controller estar pronto (1-2 minutos) kubectl wait --namespace ingress-nginx \ --for=condition=ready pod \ --selector=app.kubernetes.io/component=controller \ --timeout=120s pod/ingress-nginx-controller-86b4d9985-jk4x2 condition met # Opção 2: Instalar via Helm (recomendado para produção) helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx --create-namespace # Verificar — o EXTERNAL-IP deve ser localhost kubectl get service -n ingress-nginx NAME TYPE EXTERNAL-IP PORT(S) ingress-nginx-controller LoadBalancer localhost 80:32080/TCP,443:32443/TCP
Criar Ingress para múltiplos serviços
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-local annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: localhost # no Docker Desktop, localhost funciona http: paths: - path: /app pathType: Prefix backend: service: name: minha-app-svc port: number: 80 - path: /api pathType: Prefix backend: service: name: api-svc port: number: 80
kubectl apply -f ingress-local.yaml # Testar o roteamento por path Invoke-WebRequest http://localhost/app | Select-Object StatusCode, Content StatusCode Content ---------- ------- 200 Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-2xk9r # Para usar hosts personalizados (ex: app.local, api.local) # Adiciona ao C:\Windows\System32\drivers\etc\hosts (como Administrador): 127.0.0.1 app.local 127.0.0.1 api.local
10 Helm no Windows com Docker Desktop
Instalar e usar o gestor de pacotes Kubernetes no Windows
# Opção 1: via winget (recomendado — Windows 10/11) winget install Helm.Helm # Opção 2: via Chocolatey choco install kubernetes-helm # Opção 3: via Scoop scoop install helm # Verificar instalação helm version version.BuildInfo{Version:"v3.16.2", GitCommit:"13654a52..."} # Adicionar repositórios essenciais helm repo add bitnami https://charts.bitnami.com/bitnami helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update Hang tight while we grab the latest from your chart repositories... Update Complete. Happy Helming!
Instalar aplicações com Helm no Docker Desktop K8s
# ── Instalar WordPress (MySQL + Apache + WordPress) ─────────────────── helm install meu-wordpress bitnami/wordpress \ --set wordpressPassword=segredo123 \ --set service.type=LoadBalancer # Abre http://localhost no browser após 2-3 minutos # ── Instalar PostgreSQL ─────────────────────────────────────────────── helm install meu-postgres bitnami/postgresql \ --set auth.postgresPassword=segredo \ --set primary.persistence.size=1Gi # Ligar ao PostgreSQL via port-forward kubectl port-forward svc/meu-postgres-postgresql 5432:5432 # Agora liga com psql ou DBeaver em localhost:5432 # ── Instalar Redis ──────────────────────────────────────────────────── helm install meu-redis bitnami/redis --set auth.enabled=false kubectl port-forward svc/meu-redis-master 6379:6379 # ── Ver releases instaladas ─────────────────────────────────────────── helm list NAME NAMESPACE STATUS CHART APP VERSION meu-wordpress default deployed wordpress-23.1.21 6.6.2 meu-postgres default deployed postgresql-16.2.3 16.4.0 # ── Remover uma release (liberta recursos) ─────────────────────────── helm uninstall meu-wordpress
11 Docker Compose → Kubernetes
Converter ficheiros Compose em manifests K8s com Kompose
Se já tens aplicações definidas em docker-compose.yml, podes convertê-las automaticamente para manifests Kubernetes com a ferramenta Kompose. É uma forma excelente de migrar de Compose para K8s sem escrever YAML do zero.
# Instalar Kompose via winget winget install Kubernetes.Kompose # Ou via Chocolatey choco install kubernetes-kompose # Verificar kompose version 1.35.0 (HEAD) # ── Converter docker-compose.yml para manifests K8s ────────────────── kompose convert -f docker-compose.yml INFO Kubernetes file "api-deployment.yaml" created INFO Kubernetes file "api-service.yaml" created INFO Kubernetes file "db-deployment.yaml" created INFO Kubernetes file "db-service.yaml" created INFO Kubernetes file "db-persistentvolumeclaim.yaml" created # Aplicar todos os manifests gerados de uma vez kubectl apply -f . # Alternativa: converter e aplicar directamente sem gerar ficheiros kompose up -f docker-compose.yml
resources, as probes de saúde, as anotações corretas e às vezes a configuração de volumes. Usa os ficheiros como base e revisa-os antes de usar em produção.
Workflow de migração Compose → K8s
12 Resolução de Problemas
Os erros mais comuns no Windows e como resolvê-los
| Sintoma / Erro | Causa provável | Solução |
|---|---|---|
| 🔴 Docker Desktop não inicia | ||
| "WSL 2 installation is incomplete" | WSL 2 não está instalado ou actualizado | Executa wsl --update no PowerShell como admin e reinicia |
| "Hardware virtualization not enabled" | VT-x / AMD-V desactivado na BIOS | Reinicia, entra na BIOS (F2/F10/DEL) e activa Intel VT-x ou AMD-V |
| Docker Desktop trava no logo | Processo anterior não terminou correctamente | Task Manager → terminar processos Docker → reiniciar Docker Desktop |
| 🟡 Pods com problemas | ||
Pod: ImagePullBackOff |
K8s tenta descarregar imagem local do Docker Hub | Adiciona imagePullPolicy: Never para imagens locais |
Pod: CrashLoopBackOff |
Container falha repetidamente ao iniciar | kubectl logs <pod> --previous para ver o erro antes do crash |
Pod: Pending indefinidamente |
Falta de recursos (CPU/RAM) ou PVC não vinculado | kubectl describe pod <nome> → ver secção Events no final |
Pod: OOMKilled |
Container ultrapassou o limite de memória (limits.memory) |
Aumenta o limits.memory no Deployment ou reduz o consumo da app |
| 🔵 Rede e acesso | ||
Service LoadBalancer com EXTERNAL-IP: <pending> |
Sem suporte a LoadBalancer (só acontece fora do Docker Desktop) | No Docker Desktop isto não deve acontecer. Se sim, usa kubectl port-forward |
| Não consegue aceder ao serviço em localhost | Firewall do Windows a bloquear | Windows Defender Firewall → Permitir Docker Desktop. Ou usa kubectl port-forward |
| kubectl: "Unable to connect to the server" | Cluster K8s não está a correr ou contexto errado | Verifica ícone Docker Desktop (verde?) → kubectl config use-context docker-desktop |
| ⚙️ Performance e recursos | ||
| PC fica lento com Docker Desktop + K8s | WSL 2 a consumir demasiada RAM | Cria .wslconfig com memory=4GB · Desactiva K8s quando não usas |
| Disco a encher rapidamente | Imagens e volumes a acumular | docker system prune -a · Docker Desktop → Settings → Resources → Disk |
Comandos de diagnóstico rápido
# ── Verificar tudo de uma vez ───────────────────────────────────────── docker info # estado do Docker Engine kubectl cluster-info # endpoint do Control Plane kubectl get nodes # estado do nó kubectl get pods -A # todos os Pods (sistema + apps) kubectl top nodes # CPU e RAM do nó # ── Diagnóstico de Pod específico ──────────────────────────────────── kubectl describe pod <nome-do-pod> # eventos e condições kubectl logs <nome-do-pod> --previous # logs da execução anterior kubectl exec -it <nome-do-pod> -- sh # terminal dentro do Pod # ── Verificar recursos disponíveis ─────────────────────────────────── kubectl describe node docker-desktop # Procura a secção "Allocated resources" — vê o que está consumido # ── Limpar tudo e recomeçar ─────────────────────────────────────────── # (Docker Desktop → Settings → Kubernetes → Reset Kubernetes Cluster) # ou via CLI: kubectl delete all --all # elimina apps mas mantém K8s # ── Ver consumo de memória do WSL 2 ────────────────────────────────── Get-Process -Name "*wsl*", "*docker*" | Select-Object Name, @{N="RAM_MB";E={[math]::Round($_.WorkingSet/1MB,0)}} | Sort-Object RAM_MB -Descending
13 Boas Práticas no Windows
Tirar o máximo partido do Docker Desktop K8s no Windows
Guardar código em WSL 2, não no Windows
Os ficheiros em /home/user/projecto (WSL 2) são muito mais rápidos do que em /mnt/c/Users/ (Windows). Para projectos K8s, trabalha sempre dentro do WSL 2.
Configurar .wslconfig
Limita a RAM do WSL 2 com .wslconfig para evitar que o Docker + K8s consuma toda a memória do PC. Com 16 GB, define memory=8GB.
Usar namespaces por projecto
Cria um namespace por projecto: kubectl create namespace loja. Usa -n loja nos comandos ou define como padrão no contexto.
Scripts de setup repetíveis
Cria scripts PowerShell que instalam tudo de raiz: setup.ps1 que aplica todos os manifests, instala Helm charts e configura Ingress. Partilha com a equipa.
imagePullPolicy: Never para imagens locais
Sempre que uses imagens locais (build local com docker build), adiciona imagePullPolicy: Never — poupa tempo e evita erros ImagePullBackOff.
Usar Skaffold para hot-reload
O Skaffold (skaffold.dev) monitoriza alterações no código, faz build da imagem e atualiza o Deployment automaticamente — como hot-reload mas para K8s.
Não expor portas desnecessárias
Em desenvolvimento, usa kubectl port-forward em vez de Services LoadBalancer para cada app. Mais seguro e evita conflitos de portas entre projectos.
Nunca usar o cluster local em produção
O Docker Desktop K8s é de nó único, sem alta disponibilidade, sem backup automático. É apenas para desenvolvimento. Para produção, usa GKE, AKS, EKS ou k3s em VPS.
Instalar k9s — TUI para K8s
O k9s é uma interface de terminal interactiva para K8s. winget install k9s — substitui vários comandos kubectl com uma interface navegável no terminal.
Windows Terminal + Temas
Instala o Windows Terminal da Microsoft Store e configura um perfil para WSL 2 Ubuntu. Muito mais prático do que o PowerShell ou CMD para trabalhar com K8s.
Stack de ferramentas recomendada para Windows + K8s
| Ferramenta | Propósito | Instalar |
|---|---|---|
| Docker Desktop | Docker Engine + K8s integrado | winget install Docker.DockerDesktop |
| Windows Terminal | Terminal moderno com tabs e suporte WSL 2 | winget install Microsoft.WindowsTerminal |
| kubectl | CLI do Kubernetes (já incluído no Docker Desktop) | Incluído no Docker Desktop |
| Helm | Gestor de pacotes K8s | winget install Helm.Helm |
| k9s | TUI interactiva para K8s — navegar recursos, logs, exec | winget install k9s |
| Lens | IDE desktop para Kubernetes (GUI completa) | k8slens.dev ou winget install Mirantis.Lens |
| Kompose | Converter docker-compose.yml → manifests K8s | winget install Kubernetes.Kompose |
| Skaffold | Hot-reload automático de imagens no K8s durante desenvolvimento | winget install Google.Skaffold |
| VS Code + extensão Kubernetes | Editar YAML com validação, ver recursos no painel lateral | Extensão "Kubernetes" da Microsoft no VS Code |
winget install Docker.DockerDesktop Helm.Helm k9s Mirantis.Lens Kubernetes.Kompose Google.Skaffold Microsoft.WindowsTerminal