Como instalar o Docker em uma VPS Ubuntu
Quase todo serviço auto-hospedado moderno é distribuído como imagem Docker. Em vez de instalar dependências uma a uma e torcer para nenhuma versão conflitar, você sobe um contêiner com tudo dentro e remove sem deixar rastro quando não quiser mais.
Este guia deixa a VPS pronta para os demais tutoriais: Docker Engine, plugin Compose, firewall configurado e uma limpeza automática para o disco não encher de imagens antigas.
Antes de começar
- VPS com Ubuntu 22.04 ou 24.04 e acesso root por SSH.
- Qualquer plano serve para o Docker em si — o que pesa é o serviço que você vai subir depois.
Atualize o sistema
Primeiro acesso numa VPS nova: atualize tudo antes de instalar qualquer coisa.
apt update && apt upgrade -y
apt install -y curl ca-certificates gnupg
Instale o Docker Engine
O script oficial da Docker detecta a distribuição e instala o Engine com o plugin Compose já incluído. É o caminho recomendado pela própria Docker para servidores.
curl -fsSL https://get.docker.com | sh
docker --version
docker compose version
systemctl is-enabled docker
Os três comandos precisam responder. O último deve dizer enabled — é o que garante que o Docker volte sozinho depois de um reinício da VPS.
Cuidado com tutoriais que mandam usar docker-compose com hífen. Aquela versão está descontinuada; a atual é o subcomando docker compose, sem hífen.
Crie um usuário sem root para o dia a dia
Trabalhar direto como root é conveniente e arriscado. Crie um usuário comum, coloque-o no grupo docker e passe a usar esse acesso — quem estiver no grupo docker executa contêineres sem precisar de sudo a cada comando.
adduser --gecos '' deploy
usermod -aG sudo,docker deploy
# copia sua chave SSH para o novo usuário
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy/
Abra uma segunda conexão SSH como deploy e confirme que entra antes de fechar a sessão como root. Se a chave não tiver sido copiada certo, você fica de fora do servidor.
Feche o firewall
Contêineres publicam portas, e é fácil deixar um banco de dados exposto para a internet sem perceber. Deixe passar só o necessário.
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
ufw status numbered
O Docker escreve regras direto no iptables e, em alguns casos, contorna o ufw. Por isso, nos guias deste site os bancos nunca publicam porta para fora: eles conversam com a aplicação pela rede interna do Compose, e só o proxy fica exposto.
Evite que o disco encha
Cada atualização de imagem deixa a anterior ocupando espaço. Numa VPS de 20 GB isso enche o disco em poucos meses. Uma limpeza semanal resolve.
# veja o quanto está ocupado hoje
docker system df
# limpeza semanal: remove imagens, redes e cache sem uso
(crontab -l 2>/dev/null; echo '0 4 * * 0 /usr/bin/docker system prune -af --volumes=false') | crontab -
Repare no --volumes=false: sem ele, o comando apagaria também os volumes órfãos — e é neles que moram os seus bancos de dados.
Faça um teste
Um contêiner descartável confirma que tudo está no lugar.
docker run --rm hello-world
# e um teste de Compose
mkdir -p /tmp/teste && cd /tmp/teste
cat > docker-compose.yml <<'EOF'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
EOF
docker compose up -d
curl -s localhost:8080 | head -5
docker compose down
Se o curl devolveu o HTML de boas-vindas do nginx, a VPS está pronta.
Se algo não funcionar
permission denied ao rodar docker sem sudo
O grupo só passa a valer numa sessão nova. Saia e entre de novo no SSH, ou rode newgrp docker para aplicar na hora.
O disco encheu e os contêineres pararam
Veja o que está ocupando espaço e limpe o que não é volume:
df -h /
docker system df
docker system prune -af --volumes=false
Memória reservada de verdade, sem overselling, e rota nacional a partir de nós no Brasil.
Perguntas frequentes
Docker consome muita memória por si só?
O daemon em si ocupa algo em torno de 50 a 100 MB. O que consome memória é o que você roda dentro dele — um PostgreSQL, um Node. Na prática o Docker não é o gargalo.
Posso rodar vários serviços diferentes na mesma VPS?
Sim, e é justamente a vantagem. Cada serviço fica isolado no seu contêiner, com as próprias dependências, e um proxy reverso na frente distribui por domínio. O limite é memória e CPU, não conflito de versões.
Qual a diferença entre imagem, contêiner e volume?
A imagem é o molde, somente leitura. O contêiner é uma execução daquele molde — descartável. O volume é onde ficam os dados que precisam sobreviver quando o contêiner é recriado, como o diretório do banco. Atualizar um serviço significa trocar a imagem e recriar o contêiner, mantendo o volume.
Continue por aqui
Como instalar o n8n em uma VPS com Docker e HTTPS
Sobe o n8n com banco PostgreSQL e certificado automático, em uma VPS Ubuntu com acesso root.
Como proteger uma VPS Ubuntu: o básico que evita 99% dos ataques
Chave SSH, firewall, fail2ban e atualizações automáticas — a base que separa um servidor invadido de um servidor em paz.
Como instalar o Portainer para gerenciar contêineres pelo navegador
Painel web para ver logs, reiniciar contêineres e acompanhar consumo sem depender da linha de comando.