私は Windows マシン上の Ubuntu VM で Docker を使用して Apache Tomcat と Apache HTTP を実行しています。HTTP サーバー (ポート 80 で実行) を Tomcat (ポート 8080 で実行) へのリクエストをリバース プロキシするように構成しました。
/etc/ホスト:
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 ディレクトリにアクセスしようとすると、DNS ルックアップに失敗したことを示す 502 応答が返されます。
<!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 にプロキシできないようです。ブラウザから直接 localapp.com:8080/api にアクセスすると Tomcat アプリケーションは動作します。したがって、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
ネットワークのデフォルト設定で 2 つのコンテナーを作成したので、考慮すべき点がいくつかあります。
- デフォルトでは、IP アドレスを使用してのみ通信できます。
- 名前解決が必要な場合は、コンテナを作成するときにオプションを使用し
--link
、各方向にリンクを作成する必要があります。 /etc/hosts
コンテナーはデフォルトで、ホストのファイルとそのファイルの設定を使用します/etc/resolv.conf
が、ループバック アドレスへの参照などの一部の構成は削除されます。- 考えられる解決策の 1 つは、DNS サーバーを実行する 3 番目の Docker コンテナーを追加し、
--dns
両方のコンテナーにオプションを追加することです。ただし、これでは必要以上に多くのソフトウェアが導入されることになります。
/etc/hosts
ホスト上のファイルにコンテナの DNS 名と IP アドレスを入力し、DNS 名ではなく IP アドレスで他のコンテナを参照したり、ALIAS のみで参照してコマンドを使用したりすることができます--link
。
参照: -コンテナDNSの設定 -Dockerコンテナネットワーク