1. Instalar o Docker (Ubuntu/Debian/AlmaLinux)
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now docker
docker run --rm hello-world # teste
Para usar sem sudo: sudo usermod -aG docker $USER e faça login de novo.
2. Portainer (interface web)
docker volume create portainer_data
docker run -d --name portainer --restart=always \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
Abra https://IP-DA-VPS:9443 (aceite o certificado autoassinado) e crie o usuário admin nos primeiros 5 minutos, senão o Portainer bloqueia e você precisa reiniciá-lo.
Segurança: não deixe a 9443 aberta para o mundo. Libere só para o seu IP (sudo ufw allow from SEU-IP to any port 9443) ou acesse pela rede privada do Tailscale. Melhor ainda: coloque atrás do Nginx com um domínio e certificado (guia).
3. Conceitos que evitam dor de cabeça
- Volume: onde os dados vivem. Container pode ser recriado à vontade; volume não. Sempre defina volumes para bancos e uploads.
- Portas:
-p 8080:80expõe a porta 80 do container na 8080 da VPS, para a internet. Use-p 127.0.0.1:8080:80quando só o Nginx local deve acessar. - Docker ignora o ufw para portas publicadas. Publique apenas o necessário (detalhes).
--restart=always: sobe junto com a VPS.
4. Docker Compose (projetos com mais de um container)
Crie uma pasta por projeto com um docker-compose.yml:
services:
app:
image: nginx:alpine
ports: ["127.0.0.1:8080:80"]
volumes: ["./site:/usr/share/nginx/html:ro"]
restart: unless-stopped
docker compose up -d
docker compose logs -f
docker compose pull && docker compose up -d # atualizar
No Portainer, a mesma coisa em Stacks → Add stack colando o YAML. Exemplos prontos: n8n, WordPress, Evolution API.
5. Manutenção
docker ps -a # containers
docker stats # CPU/RAM por container
docker system df # espaço usado
docker system prune # limpa o que não está em uso
Imagens antigas acumulam gigabytes; se o disco encher, veja Disco cheio. Inclua /var/lib/docker/volumes no seu backup automático.