Lance um VPS Docker autohospedado em minutos
Contêineres autohospedados em um servidor que é seu. Contrate um VPS Docker, cole um bloco de instalação do repositório oficial do Docker e, poucos minutos depois, rode o seu primeiro docker compose up.
O que dá para fazer com um VPS Docker autohospedado
Um servidor e quantos contêineres couberem nele. A aplicação, o banco de dados, a fila e o proxy reverso rodam lado a lado — cada um no seu contêiner, com as suas próprias dependências.
Suba a stack inteira a partir de um arquivo
Use imagens prontas em vez de configurar servidores
Publique atualizações sem perder dados
Rode uma arquitetura de microsserviços em um servidor
Sobreviva a reinicializações sem intervenção manual
Rode o Docker sem privilégios de root
Escolha um plano de hospedagem VPS Docker
O próprio Docker Engine ocupa pouco, então dimensione o plano pelo que roda dentro dos contêineres. Recomendamos começar com um VPS Start, com 2 núcleos de CPU e 2 GB de RAM. Para uma pilha típica do Compose com banco de dados e proxy reverso, escolha um VPS Medium com 4 GB de RAM.
Incremente os recursos do seu servidor VPS
Confira como você pode alterar a configuração do seu VPS. Você pode adquirir espaço em disco adicional, aumentar o desempenho da CPU, adicionar RAM e aproveitar serviços adicionais sem precisar mudar para um novo plano.
Como instalar o Docker em um VPS
Saia de um VPS Ubuntu limpo e chegue a uma stack Docker rodando atrás de HTTPS em cinco passos.
Step 01 — Contrate o VPS e conecte-se
Escolha um VPS Ubuntu em um local próximo dos seus usuários ou das APIs externas que os contêineres consomem e conecte-se por SSH. Os comandos abaixo rodam em um shell root.
ssh root@your-server-ipSe o login direto como root estiver desativado, conecte-se com a sua conta comum e execute sudo -i.
Step 02 — Instale o Docker Engine e o Compose
Instale o Docker Engine e o plugin Compose a partir do repositório apt oficial do Docker:
apt updateapt install ca-certificates curlinstall -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg \ -o /etc/apt/keyrings/docker.ascchmod a+r /etc/apt/keyrings/docker.asc tee /etc/apt/sources.list.d/docker.sources <<EOFTypes: debURIs: https://download.docker.com/linux/ubuntuSuites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")Components: stableArchitectures: $(dpkg --print-architecture)Signed-By: /etc/apt/keyrings/docker.ascEOF apt updateapt install docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-pluginsystemctl enable --now dockerdocker run --rm hello-worldStep 03 — Aponte o seu domínio para o VPS
Crie um registro A apontando o domínio da aplicação para o VPS Docker. O Caddy precisa que o domínio resolva corretamente antes de emitir o certificado HTTPS.
Type: AName: appValue: your-server-ipLibere o tráfego TCP de entrada nas portas 80 e 443 no firewall do servidor e no painel do seu provedor.
Step 04 — Descreva a stack Docker
Crie o diretório do projeto:
mkdir -p /opt/docker-appcd /opt/docker-appCrie o .env e substitua o valor de exemplo por uma senha longa e segura para URL:
POSTGRES_PASSWORD=replace-with-a-long-random-stringCrie o Caddyfile:
app.yourdomain.com { reverse_proxy app:8080}Crie o compose.yaml. Substitua your-org/your-app:1.4.2 pela imagem e versão usadas pela sua aplicação. O nome antigo docker-compose.yml continua funcionando.
services: app: image: your-org/your-app:1.4.2 restart: unless-stopped environment: DATABASE_URL: postgres://app:${POSTGRES_PASSWORD}@db:5432/app depends_on: db: condition: service_healthy db: image: postgres:16 restart: unless-stopped environment: POSTGRES_DB: app POSTGRES_USER: app POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - db-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U app -d app"] interval: 5s timeout: 5s retries: 10 caddy: image: caddy:2 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy-data:/data - caddy-config:/config volumes: db-data: caddy-data: caddy-config:Somente o Caddy publica portas no host. A aplicação e o banco de dados seguem acessíveis apenas dentro da rede privada do Compose.
Step 05 — Suba a stack
Proteja o arquivo de ambiente, suba os contêineres e confira o status:
chmod 600 .envdocker compose up -ddocker compose psO Caddy obtém e renova o certificado HTTPS automaticamente e redireciona as requisições HTTP para HTTPS. Os volumes nomeados preservam os dados do banco e os certificados do Caddy quando os contêineres são recriados.
Problemas comuns
- A aplicação sobe antes de o banco estar pronto — o depends_on simples garante a ordem de inicialização, não a prontidão. Dê um health check ao banco e dependa dele com condition: service_healthy, como acima.
- As portas publicadas ignoram o ufw — o Docker roteia o tráfego dos contêineres na tabela nat, antes das cadeias que o ufw usa, então uma porta publicada responde mesmo quando o ufw diz que está fechada. Publique apenas o proxy; apontar para 127.0.0.1 também publica a porta, só que limitada à interface de loopback.
- Os pulls começam a falhar no meio do deploy — o Docker Hub permite 100 pulls a cada 6 horas por endereço IPv4 ou sub-rede IPv6 /64 sem autenticação, e 200 a cada 6 horas em uma conta Personal gratuita. Rode docker login no servidor antes de um deploy que baixa muitas imagens.
- Os dados sumiram depois que o contêiner foi recriado — dados guardados na camada gravável do contêiner desaparecem quando ele é removido. Mantenha dados persistentes em um volume nomeado ou bind mount.