Estoy ejecutando Apache Tomcat y Apache HTTP usando Docker en una máquina virtual Ubuntu en mi máquina con Windows. He configurado mi servidor HTTP (que se ejecuta en el puerto 80) para revertir las solicitudes de proxy al Tomcat (que se ejecuta en el puerto 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>
Cuando ejecuto la aplicación HTTP o intento acceder al directorio localapp.com/api, obtengo una respuesta 502 de que falló la búsqueda de DNS.
<!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 /api</a></em>.<p>
Reason: <strong>DNS lookup failure for: localapp.com</strong></p></p>
</body></html>
Parece que Apache HTTP, por alguna razón, no puede conectarse a localapp.com. La aplicación Tomcat funcionará si presiono localapp.com:8080/api directamente desde el navegador, por lo que parece solo un problema de que el servidor HTTP Apache no resuelve el DNS correctamente.
Como referencia, mi nsswitch.conf es:
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
Respuesta1
Como ha creado los dos contenedores con la configuración predeterminada para la red, hay algunas cosas que debe tener en cuenta.
- De forma predeterminada, solo pueden comunicarse mediante direcciones IP.
- Si desea resolución de nombres, debe usar la
--link
opción al crear los contenedores y debe crear un enlace en cada dirección. - Los contenedores utilizan de forma predeterminada la configuración del
/etc/hosts
archivo del host, así como su/etc/resolv.conf
archivo, pero eliminan algunas configuraciones, como las referencias a la dirección de bucle invertido. - Una posible solución es agregar un tercer contenedor acoplable que ejecute un servidor DNS y agregar la
--dns
opción a ambos contenedores. Pero esto sería introducir más software del necesario.
Puede completar el /etc/hosts
archivo en el host con los nombres DNS y las direcciones IP de los contenedores, hacer referencia al otro contenedor mediante la dirección IP en lugar del nombre DNS, o hacer referencia a ellos solo mediante ALIAS y usar el --link
comando.
Ver también: -Configurar DNS del contenedor -Redes de contenedores Docker