Poupe até 53% em Servidores VPS, escolha agora. Oferta limitada.

Docker para ambiente de desenvolvimento no VPS

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.

  1. Acesse o servidor por SSH e atualize os pacotes do sistema.
  2. Instale Docker, Docker Compose e valide o serviço.
  3. Crie a estrutura do projeto com arquivos de aplicação e compose.
  4. Configure redes, volumes e variáveis de ambiente para isolar serviços.
  5. Suba os containers, teste logs, portas e persistência dos dados.
  6. 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 apt por dnf e o pacote principal por docker-ce via 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 -y
Output esperado:
Hit:1 http://deb.debian.org/debian bookworm InRelease
Reading package lists... Done
Building dependency tree... Done
0 upgraded ou pacotes atualizados com sucesso

Agora 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 gnupg
Output esperado:
ca-certificates is already the newest version
curl is installed
gnupg is installed

Instale 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 docker
Output esperado:
Created symlink for docker.service
docker.service started successfully

Valide 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 docker
Output 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-docker
Output esperado:
O diretório dev-docker é criado
O terminal entra no caminho do projeto

Crie 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>
EOF
Output esperado:
Arquivo app/index.html criado sem mensagens de erro

Agora 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
EOF
Output esperado:
Arquivo compose.yml criado no diretório do projeto

Atençã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 -d
Output esperado:
Network dev-docker_devnet Created
Volume dev-docker_db_data Created
Container dev_db Started
Container dev_web Started

Liste 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 ps
Output 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/tcp

Teste 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:8080
Output 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:8080
Output esperado:
Resposta HTTP do container web, se firewall e rota permitirem o acesso

Configurar 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 ls
Output esperado:
NETWORK ID     NAME                 DRIVER
...            dev-docker_devnet    bridge
...            bridge               bridge

Você 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_devnet
Output esperado:
Lista de containers conectados à rede dev-docker_devnet
Entradas para dev_web e dev_db

Para 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 30
Output esperado:
Mensagens indicando inicialização do MariaDB
Servidor pronto para conexões internas

Atençã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 ls
Output esperado:
DRIVER    VOLUME NAME
local     dev-docker_db_data

Durante 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 50
Output esperado:
Linhas de acesso HTTP
Mensagens de inicialização do Nginx

Para reiniciar apenas o container web após uma alteração de configuração:

docker compose restart web
Output esperado:
Container dev_web Restarting
Container dev_web Started

Atençã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 down
Output esperado:
Container dev_web Removed
Container dev_db Removed
Network dev-docker_devnet Removed

Para subir novamente:

docker compose up -d
Output esperado:
Container dev_db Started
Container dev_web Started

Evite 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 status
Output esperado:
Status: active
OpenSSH ALLOW
8080/tcp ALLOW

Atençã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 update
Output esperado:
Resposta HTTP ou HTML do site
Lista de repositórios carregada sem erro de resolução

Sintoma: 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 status
Output esperado:
dev_web em execução com 0.0.0.0:8080->80/tcp
Regra 8080/tcp liberada, se UFW estiver ativo

Sintoma: 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_devnet
Output esperado:
Banco inicializado sem erro crítico
dev_web e dev_db conectados à mesma rede

Sintoma: 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 config
Output esperado:
Volume db_data listado
Configuração final do compose exibindo o volume do banco

Perguntas 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

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.

Conheça os planos de Servidor VPS da AviraHost

  • 0 Os usuários acharam isso útil
  • docker, containers, desenvolvimento, ambiente-dev, linux, deploy, AviraHost
Esta resposta foi útil?

Artigos Relacionados

Otimizar cache Redis para aplicações PHP no Ubuntu 22.04

Para otimizar o cache Redis para aplicações PHP no Ubuntu 22.04, instale e configure o Redis,...

Configurar Alertas Automáticos com Zabbix no Ubuntu

Para configurar alertas automáticos com Zabbix no Ubuntu, instale o Zabbix Server, configure...

Otimizar MySQL: como reduzir uso de memória e acelerar consultas

Otimizar MySQL é o processo de ajustar configurações e consultas para reduzir o consumo de...

Entenda o que é Swap no Linux: como funciona e quando usar

Swap no Linux é um espaço em disco usado como extensão da memória RAM quando esta se esgota. O...

Guia Definitivo: Configurar Nginx como Proxy Reverso

Para configurar o Nginx como proxy reverso, instale o Nginx, crie um arquivo de configuração de...