Proxy Apache HTTPD passa falha de DNS local

Proxy Apache HTTPD passa falha de DNS local

Estou executando um Apache Tomcat e Apache HTTP usando Docker em uma VM Ubuntu em minha máquina Windows. Configurei meu servidor HTTP (em execução na porta 80) para reverter solicitações de proxy para o Tomcat (em execução na porta 8080).

/etc/hosts:

127.0.0.1 localapp.com localhost

HTTP /conf/httpd.conf

<IfModule mod_proxy.c>

    ProxyRequests Off

    ProxyPass /app/api/ http://localapp.com:8080/api/

    ProxyPassReverse /app/api/ http://localapp.com:8080/api/

</IfModule>

HTTP /conf/extra/httpd-vhosts.conf

<VirtualHost *:80> 
    DocumentRoot "/usr/local/apache2/htdocs/app" 
    ServerName localapp.com
    <Directory "/usr/local/apache2/htdocs/app"> 
            Require all granted 
    </Directory>
</VirtualHost> 

<VirtualHost *:80> 
    DocumentRoot "/usr/local/apache2/htdocs" 
    ServerName localhost 
    <Directory "/usr/local/apache2/htdocs"> 
            Require all granted 
    </Directory> 
</VirtualHost>

Quando executo o aplicativo HTTP ou tento acessar o diretório localapp.com/api, recebo uma resposta 502 informando que a pesquisa de DNS falhou.

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>502 Proxy Error</title>
</head><body>
<h1>Proxy Error</h1>
<p>The proxy server received an invalid
response from an upstream server.<br />
The proxy server could not handle the request <em><a href="/api">GET&nbsp;/api</a></em>.<p>
Reason: <strong>DNS lookup failure for: localapp.com</strong></p></p>
</body></html>

Parece que o Apache HTTP, por qualquer motivo, não consegue fazer proxy para localapp.com. O aplicativo Tomcat funcionará se eu acessar localapp.com:8080/api diretamente do navegador, então parece apenas um problema do servidor HTTP Apache não resolver o DNS corretamente.

Para referência, meu nsswitch.conf é:

passwd:         compat
group:          compat
shadow:         compat
gshadow:        files

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Responder1

Como você criou os dois contêineres com configurações padrão para rede, há algumas coisas a serem levadas em consideração.

  • Por padrão, eles só podem se comunicar usando endereços IP.
  • Se quiser resolução de nomes, você deve usar a --linkopção na hora de criar os containers e precisa criar um link em cada direção.
  • Os contêineres usam como padrão as configurações do /etc/hostsarquivo do host, bem como de seu /etc/resolv.confarquivo, mas eliminam algumas configurações, como referências ao endereço de loopback.
  • Uma solução possível é adicionar um terceiro contêiner docker executando um servidor DNS e adicionar a --dnsopção a ambos os contêineres. Mas isso seria introduzir mais software do que o necessário.

Você pode preencher o /etc/hostsarquivo no host com os nomes DNS e endereços IP dos contêineres, referenciar o outro contêiner por meio do endereço IP em vez do nome DNS ou referenciá-los apenas por ALIAS e usar o --linkcomando.

Veja também: -Configurando o DNS do contêiner -Rede de contêineres Docker

informação relacionada