Apache mod_proxy配置问题:访问172.17.0.2/app1出现连接拒绝
首先,咱们得先理清你遇到的核心问题:你访问172.17.0.2/app1时,请求根本没到达Apache服务器,而是直接发给了Tomcat容器的80端口,但Tomcat只监听8080端口,所以才会出现"Connection Refused"错误。
为什么会这样?
你混淆了两个Docker容器的独立身份:
- Tomcat容器的IP是
172.17.0.2,它仅在8080端口提供Web服务; - Apache是另一个完全独立的Docker容器,有自己专属的IP地址。你之前访问
localhost/app1正常,是因为宿主机把80端口映射到了Apache容器的80端口,请求先抵达Apache,再被代理到Tomcat。
而你把Apache虚拟主机的ServerName设为172.17.0.2(Tomcat的IP),这是无效的——ServerName是Apache用来识别自身的主机名/IP,只有当请求发送到Apache的IP/端口时,这个配置才会生效。但你直接访问Tomcat的IP:80,请求根本没到Apache,自然不会触发代理规则。
怎么解决?
方案1:访问Apache容器的IP而非Tomcat的
首先找到Apache容器的IP地址:
docker inspect <你的Apache容器名称或ID> | grep "IPAddress"
假设Apache的IP是172.17.0.3,那么访问172.17.0.3/app1,请求就会到达Apache,再被代理到Tomcat的172.17.0.2:8080/app1,就能正常加载页面了。
方案2:用Docker容器名代替IP(更稳定)
Docker容器重启后IP可能会变动,推荐用自定义网络+容器名来实现代理,避免IP变动的问题:
- 创建一个自定义Docker网络:
docker network create app-network - 重新启动Tomcat容器,加入这个网络:
docker run -d --name tomcat-app --network app-network tomcat - 重新启动Apache容器,加入同一个网络,并映射宿主机80端口到容器80端口:
docker run -d --name apache-proxy --network app-network -p 80:80 httpd - 修改Apache的虚拟主机配置,用容器名
tomcat-app代替固定IP:<VirtualHost *:80> ProxyPreserveHost On ServerName apache-proxy # 或者你给Apache设置的域名/IP ProxyPass /app1 http://tomcat-app:8080/app1 ProxyPassReverse /app1 http://tomcat-app:8080/app1 </VirtualHost>
这样不管容器IP怎么变化,Apache都能通过容器名找到Tomcat,访问localhost/app1或Apache容器的IP/app1都能正常工作。
额外说明
如果你确实想通过Tomcat的IP访问/app1,那你需要在Tomcat容器内也部署Apache?这显然没必要——正确的架构是所有外部请求先到达Apache代理,再由Apache转发到对应的后端服务(比如Tomcat),而不是直接访问后端容器的IP。
内容的提问来源于stack exchange,提问作者Kapil

