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:
- Instale Docker e Docker Compose no servidor
- Crie uma rede Docker compartilhada para o proxy reverso
- Suba o Nginx Proxy Manager como container de entrada
- Configure cada site em seu próprio
docker-compose.ymlconectado à rede compartilhada - Aponte os DNS dos domínios para o IP do servidor
- 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 --versionpara 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).
- Atualize os pacotes e instale dependências:
apt update && apt install -y ca-certificates curl gnupg lsb-release
- 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
- 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
- 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.
- Acesse a interface do NPM em
http://IP_DO_SERVIDOR:81 - Vá em Proxy Hosts → Add Proxy Host
- No campo Domain Names, insira o domínio (ex.:
site1.com.brewww.site1.com.br) - Em Forward Hostname / IP, insira o nome do container:
wp_site1 - Em Forward Port, insira a porta interna da aplicação (ex.:
9000para PHP-FPM ou80para Nginx interno) - Ative Block Common Exploits e Websockets Support se necessário
- Na aba SSL, selecione Request a new SSL Certificate, marque Force SSL e HTTP/2 Support
- 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-networkapenas para o container que precisa ser alcançado pelo NPM. - Monitore os containers regularmente com
docker statse configure o Docker para iniciar automaticamente com o sistema viasystemctl enable docker, garantindo que os sites voltem após reinicializações.
Leia também
- Checklist de Segurança para Servidor Linux em Produção 2026
- Guia para Configurar Limite de Taxa (Rate Limiting) no Nginx em VPS Linux e Servidor Dedicado
- Checklist para Segurança de VPS Linux: Guia Completo de Proteção
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