17 min de leitura · Guia técnico
Configurar um ambiente Docker de desenvolvimento no VPS significa instalar Docker e Docker Compose em um servidor remoto, declarar aplicação, banco de dados e serviços auxiliares em um arquivo compose, e controlar portas, volumes e redes para isolar cada componente sem expor serviços internos na internet.
- Acesse o servidor por SSH e atualize os pacotes do sistema.
- Instale Docker, Docker Compose e valide o serviço.
- Crie a estrutura do projeto com arquivos de aplicação e compose.
- Configure redes, volumes e variáveis de ambiente para isolar serviços.
- Suba os containers, teste logs, portas e persistência dos dados.
- Aplique firewall e evite expor banco de dados ou cache na internet.
Pré-requisitos para criar ambiente Docker de desenvolvimento no VPS
- Acesso SSH ao servidor com usuário administrativo. Se você ainda não acessou o servidor, veja Acessando servidores VPS Linux da AviraHost.
- Servidor com Debian 12, Ubuntu 24.04 LTS, AlmaLinux 9 ou Rocky Linux 9. Os comandos abaixo usam Debian 12 como base; em sistemas baseados em RHEL como AlmaLinux 9 e Rocky Linux 9, substitua
aptpordnfe o pacote principal pordocker-cevia repositório oficial do Docker. - Permissão para instalar pacotes e gerenciar serviços do sistema.
- Domínio ou subdomínio opcional, caso queira testar acesso externo por nome.
- Noções básicas de terminal, portas TCP, variáveis de ambiente e arquivos YAML.
- Espaço em disco suficiente para imagens, volumes e logs dos containers.
Instalar Docker no Debian 12 para ambiente de desenvolvimento
Docker no Debian 12 permite transformar um VPS em um laboratório remoto com serviços reproduzíveis, sem misturar dependências diretamente no sistema operacional. Em vez de instalar banco de dados, runtime da aplicação e cache no host, você mantém cada componente em um container separado. Isso facilita testes, rollback de configuração e padronização entre pessoas da equipe.
Antes de instalar, atualize os pacotes. Ao rodar este comando, você verá a lista de repositórios sendo consultada e, se houver atualizações disponíveis, o gerenciador preparará a instalação.
sudo apt update
sudo apt upgrade -yOutput esperado:
Hit:1 http://deb.debian.org/debian bookworm InRelease
Reading package lists... Done
Building dependency tree... Done
0 upgraded ou pacotes atualizados com sucessoAgora instale os pacotes necessários para baixar repositórios HTTPS, validar chaves e executar o Docker. Em ambientes recém-criados, essa etapa evita falhas comuns de instalação por dependências ausentes.
sudo apt install -y ca-certificates curl gnupgOutput esperado:
ca-certificates is already the newest version
curl is installed
gnupg is installedInstale o Docker pelo gerenciador de pacotes disponível no sistema. Depois, habilite o serviço para iniciar junto com o servidor.
sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start dockerOutput esperado:
Created symlink for docker.service
docker.service started successfullyValide a instalação consultando a versão e o estado do serviço. Se o Docker estiver ativo, você já pode criar o ambiente de desenvolvimento com Docker Compose no VPS.
docker --version
docker compose version
sudo systemctl status dockerOutput esperado:
Docker version exibida no terminal
Docker Compose version exibida no terminal
Active: active (running)Criar projeto com Docker Compose no VPS
Docker Compose no VPS é a forma mais prática de declarar aplicação, banco de dados e dependências em um único arquivo. Para um ambiente de desenvolvimento remoto, isso reduz comandos manuais e deixa claro quais portas, volumes e variáveis estão em uso. O exemplo abaixo cria uma aplicação web simples com Nginx e MariaDB, usando rede privada entre os serviços.
Crie um diretório para o projeto. Evite misturar arquivos de diferentes aplicações no mesmo caminho, principalmente quando houver volumes persistentes.
mkdir -p ~/dev-docker/app
cd ~/dev-dockerOutput esperado:
O diretório dev-docker é criado
O terminal entra no caminho do projetoCrie um arquivo HTML simples para testar o container web. Esse arquivo representa sua aplicação durante a primeira validação do ambiente.
cat > app/index.html << EOF
<p>Ambiente de desenvolvimento com Docker funcionando</p>
EOFOutput esperado:
Arquivo app/index.html criado sem mensagens de erroAgora crie o arquivo compose. Ele define dois serviços: um servidor web baseado em Nginx e um banco MariaDB. O banco não terá porta publicada para a internet; ele ficará acessível apenas pela rede interna do Docker.
cat > compose.yml << EOF
services:
web:
image: nginx:stable
container_name: dev_web
ports:
- "8080:80"
volumes:
- ./app:/usr/share/nginx/html:ro
networks:
- devnet
depends_on:
- db
db:
image: mariadb:latest
container_name: dev_db
environment:
MARIADB_ROOT_PASSWORD: senha_forte_de_teste
MARIADB_DATABASE: app_dev
MARIADB_USER: app_user
MARIADB_PASSWORD: senha_app_de_teste
volumes:
- db_data:/var/lib/mysql
networks:
- devnet
volumes:
db_data:
networks:
devnet:
driver: bridge
EOFOutput esperado:
Arquivo compose.yml criado no diretório do projetoAtenção: use senhas fortes mesmo em desenvolvimento, principalmente se o VPS tiver acesso externo. Não publique a porta do banco de dados sem necessidade; no exemplo, apenas o serviço web usa porta pública.
Subir containers e testar o ambiente Docker de desenvolvimento
ambiente de desenvolvimento com Docker deve ser validado em três pontos: containers ativos, logs sem erro crítico e porta respondendo no IP do servidor. Ao executar o compose pela primeira vez, o Docker baixa as imagens necessárias e cria rede, volume e containers conforme o arquivo YAML.
docker compose up -dOutput esperado:
Network dev-docker_devnet Created
Volume dev-docker_db_data Created
Container dev_db Started
Container dev_web StartedListe os containers em execução. O serviço web deve aparecer com a porta 8080 apontando para a porta 80 interna do container. O banco deve aparecer ativo, mas sem porta pública mapeada.
docker psOutput esperado:
CONTAINER ID IMAGE NAMES STATUS PORTS
... nginx:stable dev_web Up 0.0.0.0:8080->80/tcp
... mariadb:latest dev_db Up 3306/tcpTeste a aplicação pelo próprio servidor. Se o retorno exibir o texto criado no arquivo HTML, o volume do Nginx está funcionando corretamente.
curl http://localhost:8080Output esperado:
<p>Ambiente de desenvolvimento com Docker funcionando</p>Se você quiser acessar pelo navegador, use o IP fixo do VPS seguido da porta 8080. Caso tenha configurado domínio, valide também os registros DNS. Para entender diferenças entre hospedagem tradicional e servidor com mais controle, o artigo Comparativo: Hospedagem de sites vs. VPS: qual é a melhor opção? ajuda a contextualizar a escolha.
curl http://IP_DO_SERVIDOR:8080Output esperado:
Resposta HTTP do container web, se firewall e rota permitirem o acessoConfigurar rede Docker para isolar serviços no VPS
rede Docker para isolar serviços é essencial quando o ambiente tem banco, cache, filas ou painéis internos. A regra prática é publicar somente o que precisa ser acessado de fora. Serviços internos devem conversar pela rede privada do Docker, usando o nome do serviço como hostname, sem exposição direta no IP público.
No compose criado acima, o container web acessa o banco pelo hostname db, porque ambos estão na mesma rede devnet. Para conferir a rede criada, use:
docker network lsOutput esperado:
NETWORK ID NAME DRIVER
... dev-docker_devnet bridge
... bridge bridgeVocê também pode inspecionar a rede para confirmar quais containers estão conectados. Esse diagnóstico é útil quando a aplicação informa erro de conexão com banco, mas o container do banco está ativo.
docker network inspect dev-docker_devnetOutput esperado:
Lista de containers conectados à rede dev-docker_devnet
Entradas para dev_web e dev_dbPara testar conectividade entre containers, execute um comando dentro do container web. Como imagens minimalistas podem não trazer ferramentas de diagnóstico, o teste mais confiável é verificar logs e variáveis da aplicação. Em projetos reais, configure a aplicação para usar host db, porta interna do banco e credenciais do compose.
docker logs dev_db --tail 30Output esperado:
Mensagens indicando inicialização do MariaDB
Servidor pronto para conexões internasAtenção: não altere o compose removendo volumes sem saber o impacto. Volumes guardam dados persistentes; apagar volume de banco pode remover dados do ambiente de desenvolvimento.
Persistência, logs e rotina de trabalho com containers
volumes Docker no VPS mantêm dados mesmo quando containers são recriados. Isso é importante para bancos de dados, uploads de teste e arquivos gerados pela aplicação. No exemplo, o volume db_data preserva os dados do MariaDB, enquanto o código do site fica mapeado no diretório app.
Veja os volumes existentes:
docker volume lsOutput esperado:
DRIVER VOLUME NAME
local dev-docker_db_dataDurante o desenvolvimento, a rotina mais comum é alterar arquivos, reiniciar containers específicos e acompanhar logs. Para ver logs do web server:
docker logs dev_web --tail 50Output esperado:
Linhas de acesso HTTP
Mensagens de inicialização do NginxPara reiniciar apenas o container web após uma alteração de configuração:
docker compose restart webOutput esperado:
Container dev_web Restarting
Container dev_web StartedAtenção: o comando abaixo para parar o ambiente não remove volumes por padrão, mas deixa a aplicação indisponível enquanto os containers estiverem parados.
docker compose downOutput esperado:
Container dev_web Removed
Container dev_db Removed
Network dev-docker_devnet RemovedPara subir novamente:
docker compose up -dOutput esperado:
Container dev_db Started
Container dev_web StartedEvite usar comandos de remoção de volume como rotina. Eles são úteis para reiniciar um laboratório do zero, mas podem apagar bancos e arquivos persistentes.
Segurança básica para Docker de desenvolvimento remoto
Docker remoto para desenvolvimento exige mais cuidado do que Docker local, porque portas publicadas podem ficar acessíveis na internet. Em um VPS, revise o firewall antes de expor serviços. Publique apenas a porta da aplicação que precisa ser testada externamente e mantenha banco de dados, cache e filas sem mapeamento público. Sempre acesse o servidor via SSH key para reduzir a superfície de ataque.
Se o firewall UFW estiver disponível no seu sistema, libere apenas SSH e a porta de teste da aplicação. Ajuste as portas conforme seu cenário.
sudo ufw allow OpenSSH
sudo ufw allow 8080/tcp
sudo ufw enable
sudo ufw statusOutput esperado:
Status: active
OpenSSH ALLOW
8080/tcp ALLOWAtenção: ao ativar firewall em servidor remoto, confirme que a porta SSH está liberada antes de encerrar sua sessão. Caso contrário, você pode perder o acesso administrativo ao VPS.
Outra prática importante é separar ambientes por diretório, rede e nomes de containers. Se você tiver desenvolvimento e produção no mesmo servidor, nunca reutilize o mesmo volume de banco para os dois. Também mantenha variáveis de ambiente diferentes e registre quais portas pertencem a cada aplicação. Para uma base mais ampla de preparação do servidor, consulte Configurando um Servidor Linux para Hospedagem de Sites.
Problemas comuns e como resolver
Sintoma: docker compose up falha ao baixar imagens
Causa: o servidor pode estar sem conectividade externa, DNS funcional ou pacotes básicos atualizados. Solução: teste conexão com curl, rode apt update novamente e confirme se o VPS resolve nomes de domínio antes de repetir o comando.
curl https://www.avirahost.com.br
sudo apt updateOutput esperado:
Resposta HTTP ou HTML do site
Lista de repositórios carregada sem erro de resoluçãoSintoma: site não abre pelo IP do VPS na porta 8080
Causa: o container pode estar parado, a porta pode não estar publicada ou o firewall pode estar bloqueando o acesso externo. Solução: verifique docker ps, confirme o mapeamento 8080:80 e revise as regras de firewall.
docker ps
sudo ufw statusOutput esperado:
dev_web em execução com 0.0.0.0:8080->80/tcp
Regra 8080/tcp liberada, se UFW estiver ativoSintoma: aplicação não conecta ao banco de dados
Causa: a aplicação pode estar usando localhost em vez do nome do serviço Docker, ou as credenciais podem estar diferentes das variáveis do compose. Solução: use host db, porta interna do banco e confira logs do container dev_db.
docker logs dev_db --tail 50
docker network inspect dev-docker_devnetOutput esperado:
Banco inicializado sem erro crítico
dev_web e dev_db conectados à mesma redeSintoma: dados desaparecem após recriar containers
Causa: o serviço pode estar sem volume persistente ou o volume pode ter sido removido manualmente. Solução: confirme a seção volumes do compose e evite comandos que removam volumes quando houver dados importantes.
docker volume ls
docker compose configOutput esperado:
Volume db_data listado
Configuração final do compose exibindo o volume do bancoPerguntas frequentes sobre ambiente Docker de desenvolvimento no VPS
Docker é uma boa opção para ambiente de desenvolvimento no VPS?
Docker é uma boa opção quando você precisa isolar dependências, padronizar serviços e reproduzir o mesmo ambiente entre desenvolvimento e produção. Em um VPS, ele permite executar aplicação, banco de dados e serviços auxiliares em containers separados, com portas e volumes controlados.
Qual a diferença entre usar Docker local e Docker no VPS?
No Docker local, os containers rodam na sua máquina de trabalho e dependem da rede e dos recursos do computador. No Docker no VPS, o ambiente fica em um servidor remoto, mais próximo do cenário real de hospedagem, permitindo testes de acesso externo, DNS, portas e persistência com mais previsibilidade.
Preciso usar Docker Compose para criar um ambiente de desenvolvimento?
Docker Compose não é obrigatório, mas facilita muito quando a aplicação depende de mais de um serviço, como web, banco de dados e cache. Com um arquivo compose, você sobe, para e recria todos os containers de forma consistente, evitando comandos manuais repetitivos.
Como evitar que um ambiente Docker de desenvolvimento fique exposto na internet?
Restrinja portas públicas, use firewall e publique apenas os serviços que realmente precisam ser acessados externamente. Para bancos de dados, cache e serviços internos, prefira redes Docker privadas e evite mapear portas diretamente para o IP público do servidor.
Posso hospedar o ambiente de desenvolvimento e produção no mesmo VPS?
É possível, mas exige cuidado com portas, nomes de containers, volumes, consumo de recursos e regras de firewall. Para reduzir risco, mantenha redes separadas, variáveis de ambiente distintas e backups antes de qualquer alteração que possa afetar dados persistentes.
Conclusão
- Use Docker Compose para declarar aplicação, banco, rede e volumes em um único arquivo versionável.
- Publique somente as portas necessárias e mantenha serviços internos acessíveis apenas pela rede Docker privada.
- Antes de remover containers, revisar volumes ou alterar firewall, confira logs, backups e impacto no acesso SSH.
Leia também
- Guia Docker + Portainer no mesmo servidor: conflitos e soluções
- Comparativo: Portainer vs CLI Docker para gerenciar containers
- Checklist: como configurar Traefik como proxy reverso para Docker
Precisa de ajuda com Docker para ambiente de desenvolvimento no VPS?
Um VPS bem configurado ajuda a testar aplicações em um cenário mais próximo da hospedagem real, com controle de portas, serviços e persistência. Se você precisa de um servidor para rodar Docker, aplicações web e ambientes isolados, escolha uma infraestrutura compatível com esse fluxo de desenvolvimento.