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

Checklist: como hospedar múltiplos sites com Docker e Nginx

16 min de leitura  ·  Guia técnico

Hospedar múltiplos sites com Docker e Nginx significa rodar cada aplicação em um container isolado e usar um proxy reverso Nginx (ou Nginx Proxy Manager) para direcionar o tráfego de cada domínio ao container correto. Para configurar o ambiente completo, siga estes passos:

  1. Instale Docker e Docker Compose no servidor
  2. Crie uma rede Docker compartilhada para o proxy reverso
  3. Suba o Nginx Proxy Manager como container de entrada
  4. Configure cada site em seu próprio docker-compose.yml conectado à rede compartilhada
  5. Aponte os DNS dos domínios para o IP do servidor
  6. Emita certificados SSL via interface do Nginx Proxy Manager

Pré-requisitos para hospedar múltiplos sites com Docker e Nginx

Antes de iniciar, certifique-se de que o ambiente atende aos seguintes requisitos:

  • Sistema operacional: Debian 12, Ubuntu 22.04 LTS ou Ubuntu 24.04 LTS com acesso root ou sudo
  • Docker: versão 24.x ou superior (docker --version para verificar)
  • Docker Compose: plugin v2 integrado ao Docker CLI (docker compose version)
  • RAM mínima: 2 GB para 3 a 5 sites; 4 GB ou mais para ambientes maiores
  • Portas 80 e 443 abertas no firewall do servidor (UFW ou nftables)
  • Domínios com DNS apontando para o IP público do servidor antes de emitir SSL
  • Acesso SSH ao servidor — veja como acessar servidores VPS Linux da AviraHost

Instalando Docker e Docker Compose no Debian 12

O primeiro passo para hospedar múltiplos sites com containers é garantir que o Docker Engine esteja instalado corretamente. Os comandos abaixo instalam a versão oficial do repositório Docker no Debian 12 (Bookworm).

  1. Atualize os pacotes e instale dependências:
apt update && apt install -y ca-certificates curl gnupg lsb-release
  1. Adicione a chave GPG e o repositório oficial do Docker:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. Instale o Docker Engine e o plugin Compose:
apt update && apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. Verifique a instalação:
docker --version && docker compose version
Docker version 24.0.7, build afdd53b
Docker Compose version v2.23.3

Com o Docker funcionando, o próximo passo é criar a infraestrutura de rede que permitirá ao proxy reverso se comunicar com todos os containers de sites.

Criando a rede Docker compartilhada para o proxy reverso

A rede Docker compartilhada é o elemento central da arquitetura de múltiplos sites: ela permite que o Nginx Proxy Manager alcance cada container de aplicação sem expor as portas internas diretamente ao mundo externo.

Crie a rede com escopo externo para que diferentes arquivos docker-compose.yml possam referenciá-la:

docker network create proxy-network
a3f7c2d1e8b94f6a0c5d2e1f3b7a9c4d8e2f1a0b3c5d7e9f1a2b4c6d8e0f2a4

Confirme que a rede foi criada:

docker network ls | grep proxy-network
a3f7c2d1e8b9   proxy-network   bridge    local

Essa rede será declarada como external: true em todos os arquivos Compose do projeto, garantindo que o proxy reverso e os containers de sites compartilhem o mesmo plano de rede sem precisar estar no mesmo arquivo de configuração.

Subindo o Nginx Proxy Manager como container de entrada

O Nginx Proxy Manager (NPM) é a peça central para rotear requisições entre múltiplos domínios e containers. Ele oferece interface web para gerenciar hosts, SSL e redirecionamentos sem editar arquivos de configuração manualmente.

Crie o diretório do projeto e o arquivo Compose:

mkdir -p /opt/nginx-proxy-manager && cd /opt/nginx-proxy-manager
cat > docker-compose.yml << 'EOF'
services:
  npm:
    image: jc21/nginx-proxy-manager:latest
    container_name: nginx-proxy-manager
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "81:81"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - proxy-network

networks:
  proxy-network:
    external: true
EOF

Suba o container:

docker compose up -d
[+] Running 1/1
 ✔ Container nginx-proxy-manager  Started

Acesse a interface web em http://IP_DO_SERVIDOR:81. As credenciais padrão são [email protected] / changeme — troque imediatamente após o primeiro login.

Atenção: a porta 81 é a interface administrativa do NPM. Após configurar o ambiente, considere restringir o acesso a essa porta via firewall para IPs confiáveis.

Configurando cada site em container isolado com Docker Compose

Com o proxy reverso ativo, cada site recebe seu próprio arquivo docker-compose.yml em um diretório separado. Esse isolamento de containers garante que uma falha em um site não afete os demais.

Exemplo para um site WordPress (site1.com.br):

mkdir -p /opt/sites/site1 && cd /opt/sites/site1
cat > docker-compose.yml << 'EOF'
services:
  db_site1:
    image: mariadb:11.4
    container_name: db_site1
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: senha_root_forte
      MYSQL_DATABASE: site1_db
      MYSQL_USER: site1_user
      MYSQL_PASSWORD: senha_site1_forte
    volumes:
      - db_site1_data:/var/lib/mysql
    networks:
      - site1-internal

  wp_site1:
    image: wordpress:6.5-php8.3-fpm-alpine
    container_name: wp_site1
    restart: unless-stopped
    depends_on:
      - db_site1
    environment:
      WORDPRESS_DB_HOST: db_site1:3306
      WORDPRESS_DB_NAME: site1_db
      WORDPRESS_DB_USER: site1_user
      WORDPRESS_DB_PASSWORD: senha_site1_forte
    volumes:
      - wp_site1_data:/var/www/html
    networks:
      - site1-internal
      - proxy-network

volumes:
  db_site1_data:
  wp_site1_data:

networks:
  site1-internal:
    driver: bridge
  proxy-network:
    external: true
EOF

Suba o site:

docker compose up -d
[+] Running 3/3
 ✔ Network site1-internal  Created
 ✔ Container db_site1      Started
 ✔ Container wp_site1      Started

Repita o processo para cada site adicional, alterando os nomes dos containers, volumes, redes internas e credenciais. O container da aplicação (wp_site1) deve estar conectado tanto à rede interna (para comunicar com o banco) quanto à proxy-network (para ser alcançado pelo NPM).

Para entender melhor a diferença entre hospedar em containers versus hospedagem compartilhada, consulte o comparativo entre hospedagem de sites e VPS.

Configurando Proxy Hosts e SSL no Nginx Proxy Manager

Com os containers de sites rodando e conectados à proxy-network, o próximo passo é configurar o roteamento por domínio e emitir certificados SSL automaticamente via Let's Encrypt.

  1. Acesse a interface do NPM em http://IP_DO_SERVIDOR:81
  2. Vá em Proxy HostsAdd Proxy Host
  3. No campo Domain Names, insira o domínio (ex.: site1.com.br e www.site1.com.br)
  4. Em Forward Hostname / IP, insira o nome do container: wp_site1
  5. Em Forward Port, insira a porta interna da aplicação (ex.: 9000 para PHP-FPM ou 80 para Nginx interno)
  6. Ative Block Common Exploits e Websockets Support se necessário
  7. Na aba SSL, selecione Request a new SSL Certificate, marque Force SSL e HTTP/2 Support
  8. Clique em Save — o NPM emitirá o certificado Let's Encrypt automaticamente

Repita para cada domínio adicional. O NPM gerencia a renovação automática dos certificados, eliminando a necessidade de configurar o Certbot manualmente.

Atenção: o DNS do domínio deve estar apontando para o IP do servidor antes de solicitar o certificado SSL. Caso contrário, a validação do Let's Encrypt falhará.

Isolamento de redes Docker entre sites diferentes

O isolamento de containers é um aspecto crítico de segurança quando múltiplos clientes ou projetos compartilham o mesmo servidor. Por padrão, containers na mesma rede bridge podem se comunicar livremente.

A arquitetura recomendada usa duas redes por site:

  • Rede interna do site (ex.: site1-internal): conecta apenas a aplicação e o banco de dados daquele site. Nenhum outro container externo tem acesso.
  • proxy-network: conecta apenas o container da aplicação (não o banco) ao Nginx Proxy Manager.

Com essa configuração, o container db_site1 nunca aparece na proxy-network e não pode ser acessado pelo NPM nem por containers de outros sites. Verifique o isolamento inspecionando as redes:

docker network inspect site1-internal --format '{{range .Containers}}{{.Name}} {{end}}'
db_site1 wp_site1
docker network inspect proxy-network --format '{{range .Containers}}{{.Name}} {{end}}'
nginx-proxy-manager wp_site1 wp_site2

O banco de dados aparece apenas na rede interna, confirmando o isolamento correto.

Definindo limites de recursos por container

Em um servidor com múltiplos sites, um container sem limites pode consumir toda a RAM ou CPU disponível, derrubando os demais. Defina limites de memória e CPU diretamente no docker-compose.yml de cada site:

services:
  wp_site1:
    image: wordpress:6.5-php8.3-fpm-alpine
    container_name: wp_site1
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: "0.50"
          memory: 512M
        reservations:
          memory: 256M
    networks:
      - site1-internal
      - proxy-network

Após aplicar as alterações, recrie o container:

docker compose up -d --force-recreate wp_site1

Verifique os limites aplicados:

docker inspect wp_site1 | grep -A5 "Memory"
"Memory": 536870912,
"MemoryReservation": 268435456,
"NanoCpus": 500000000,

Com limites definidos, um VPS com 2 GB de RAM consegue rodar 3 a 5 sites WordPress de forma estável, desde que cada container tenha no máximo 512 MB reservados.

Problemas comuns e como resolver

Sintoma: Nginx Proxy Manager retorna "502 Bad Gateway"

Causa: o NPM não consegue alcançar o container da aplicação. Isso ocorre quando o container do site não está conectado à proxy-network ou quando o nome do container foi digitado incorretamente no campo Forward Hostname.
Solução: verifique se o container está na rede correta com docker network inspect proxy-network. Confirme que o nome do container no NPM corresponde exatamente ao valor de container_name no Compose. Se necessário, reconecte o container: docker network connect proxy-network wp_site1.

Sintoma: certificado SSL não é emitido — erro "Domain not found"

Causa: o DNS do domínio ainda não propagou ou aponta para um IP incorreto. O Let's Encrypt valida o domínio via HTTP antes de emitir o certificado.
Solução: confirme a resolução DNS com dig site1.com.br +short — o resultado deve ser o IP público do servidor. Aguarde a propagação completa (pode levar até 24 horas dependendo do TTL configurado) e tente novamente. Certifique-se de que a porta 80 está acessível externamente.

Sintoma: container do banco de dados reinicia em loop

Causa: variáveis de ambiente incorretas ou volume com dados corrompidos de uma instalação anterior.
Solução: verifique os logs com docker logs db_site1 --tail 50. Se o problema for volume corrompido, atenção: o comando abaixo apaga os dados do banco — faça backup antes:

docker compose down -v && docker compose up -d

A flag -v remove os volumes associados. Use apenas se tiver certeza de que os dados podem ser recriados ou já foram salvos.

Sintoma: sites diferentes interferem no desempenho um do outro

Causa: containers sem limites de CPU e memória definidos. Um site com pico de tráfego pode consumir todos os recursos do host.
Solução: adicione a seção deploy.resources.limits no Compose de cada site conforme demonstrado na seção anterior. Monitore o consumo em tempo real com docker stats para identificar qual container está sobrecarregado.

Sintoma: porta 81 do NPM inacessível após reinicialização

Causa: o container do NPM não está configurado para reiniciar automaticamente, ou o Docker não inicia com o sistema.
Solução: verifique se o Docker está habilitado no systemd e se o container tem restart: unless-stopped:

systemctl enable docker
docker inspect nginx-proxy-manager | grep RestartPolicy

Perguntas frequentes sobre hospedar múltiplos sites com Docker

É possível hospedar múltiplos sites em um único servidor com Docker?

Sim. Usando Docker Compose e um proxy reverso como o Nginx Proxy Manager, você pode rodar dezenas de sites em containers isolados em um único servidor, cada um com seu próprio domínio e certificado SSL. O proxy reverso recebe todas as requisições na porta 80 e 443 e as encaminha para o container correto com base no domínio.

Qual a diferença entre Nginx Proxy Manager e Traefik para múltiplos sites?

O Nginx Proxy Manager oferece uma interface web gráfica para gerenciar hosts, SSL e redirecionamentos sem editar arquivos de configuração manualmente, sendo ideal para quem prefere uma abordagem visual. O Traefik é mais adequado para ambientes DevOps com configuração via labels no Docker Compose, mas exige mais familiaridade com YAML e roteamento dinâmico. Para a maioria dos casos de hospedagem de múltiplos sites em VPS, o NPM é a escolha mais prática.

Como o SSL funciona com múltiplos sites em Docker?

O Nginx Proxy Manager integra o Certbot internamente e emite certificados Let's Encrypt automaticamente para cada domínio configurado como Proxy Host. Basta apontar o DNS do domínio para o IP do servidor e ativar a opção SSL na interface do NPM — o certificado é emitido e renovado sem intervenção manual. Cada domínio recebe seu próprio certificado independente.

Os containers Docker ficam isolados entre si quando hospedam sites diferentes?

Por padrão, containers na mesma rede Docker bridge podem se comunicar. Para isolar sites completamente, crie redes Docker separadas para cada aplicação e conecte apenas o proxy reverso a todas elas. Assim, o container do site A não consegue acessar diretamente o banco de dados do site B, aumentando significativamente a segurança do ambiente.

Quanto de RAM é necessário para hospedar múltiplos sites com Docker?

Depende das aplicações, mas um VPS com 2 GB de RAM consegue rodar confortavelmente 3 a 5 sites WordPress em containers separados com Nginx Proxy Manager, desde que cada container tenha limites de memória definidos no Docker Compose. Para mais sites ou aplicações pesadas como Node.js ou Java, recomenda-se 4 GB ou mais. Use docker stats regularmente para monitorar o consumo real.

Conclusão

Hospedar múltiplos sites com Docker e Nginx Proxy Manager é uma abordagem robusta, escalável e segura para consolidar vários projetos em um único servidor sem abrir mão do isolamento entre eles. Os pontos essenciais para manter o ambiente saudável:

  • Defina limites de CPU e memória em todos os containers para evitar que um site monopolize os recursos do servidor e afete os demais.
  • Use redes Docker separadas por site — uma rede interna para isolar o banco de dados da aplicação e a proxy-network apenas para o container que precisa ser alcançado pelo NPM.
  • Monitore os containers regularmente com docker stats e configure o Docker para iniciar automaticamente com o sistema via systemctl enable docker, garantindo que os sites voltem após reinicializações.

Leia também

Precisa de ajuda com Docker e hospedagem de múltiplos sites?

Um VPS com recursos adequados é a base para rodar containers com estabilidade. A AviraHost oferece servidores VPS Linux com suporte a Docker, acesso root completo e infraestrutura otimizada para ambientes de produção — sem limitações artificiais de software.

Conheça os planos de VPS da AviraHost e comece a hospedar seus sites com Docker hoje

  • 0 Os usuários acharam isso útil
  • Docker, Nginx, containers, proxy-reverso, AviraHost, VPS, SSL
Esta resposta foi útil?

Artigos Relacionados

Como Configurar Firewall em Servidor VPS Linux: Guia Prático com UFW

Como Configurar Firewall em Servidor VPS Linux: Guia Prático com UFWO firewall é essencial para...

Como Configurar e Usar o Fail2Ban para Proteger seu Servidor VPS Linux

O que é o Fail2Ban? Fail2Ban é uma ferramenta de segurança que monitora logs de serviços (como...

Como Instalar e Configurar o Firewall CSF no VPS Linux para Segurança Avançada

Introdução O CSF (ConfigServer Security & Firewall) é uma solução robusta de firewall para...

Guia Prático para Ativar e Gerenciar o ModSecurity no Apache em VPS Linux e Servidores Dedicados

Introdução O ModSecurity é um firewall de aplicação web (WAF) essencial para proteger servidores...

Checklist Completo para Configurar e Testar o Firewall UFW em VPS Linux e Servidores Dedicados

Introdução O UFW (Uncomplicated Firewall) é uma ferramenta simples e eficiente para gerenciar...