Я запускаю Apache Tomcat и Apache HTTP с использованием Docker в виртуальной машине Ubuntu на моей машине Windows. Я настроил свой HTTP-сервер (работающий на порту 80) для обратного прокси-запроса к Tomcat (работающий на порту 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>
Когда я запускаю HTTP-приложение или пытаюсь обратиться к каталогу localapp.com/api, я получаю ответ 502 о том, что поиск 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>
Похоже, что Apache HTTP по какой-то причине не может проксировать себя на localapp.com. Приложение Tomcat будет работать, если я зайду на localapp.com:8080/api напрямую из браузера, так что, похоже, проблема в том, что сервер Apache HTTP не разрешает DNS правильно.
Для справки, мой 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
решение1
Поскольку вы создали два контейнера с настройками сети по умолчанию, необходимо учесть некоторые моменты.
- По умолчанию они могут общаться только с использованием IP-адресов.
- Если вам необходимо разрешение имен, вам следует использовать эту
--link
опцию при создании контейнеров, а также вам необходимо создать ссылку в каждом направлении. - Контейнеры по умолчанию используют настройки из файла хоста
/etc/hosts
, а также из своего/etc/resolv.conf
файла, но удаляют некоторые конфигурации, такие как ссылки на адрес обратной связи. - Одним из возможных решений является добавление третьего контейнера Docker, на котором запущен DNS-сервер, и добавление опции
--dns
в оба контейнера. Но это приведет к внедрению большего количества программного обеспечения, чем необходимо.
Вы можете заполнить /etc/hosts
файл на хосте DNS-именами и IP-адресами контейнеров, ссылаться на другой контейнер по IP-адресу вместо DNS-имени или ссылаться на них только по ПСЕВДОНИМУ и использовать команду --link
.
Смотрите также: -Настройка DNS контейнера -Сетевое взаимодействие контейнеров Docker