Docker容器网络异常:Tomcat容器无法解析H2容器主机名
我运行着两个Docker容器,分别部署Tomcat和H2数据库。使用docker compose build结合以下compose.yml构建容器:
services: tomcat: build: tomcat ports: - "8080:8080" networks: - my-network h2: build: h2 ports: - "8082:8082" - "9092:9092" networks: - my-network networks: my-network: driver: bridge
Tomcat容器的Dockerfile如下:
FROM tomcat:10.1.28-jre21 COPY my-app.war /usr/local/tomcat/webapps/my-app.war COPY h2-2.3.232.jar /usr/local/tomcat/lib/h2.jar CMD ["catalina.sh", "run"]
H2容器的Dockerfile如下:
FROM openjdk:21 COPY h2-2.3.232.jar /usr/local/h2.jar COPY startup.sh /usr/bin/startup.sh WORKDIR / ENTRYPOINT ["/usr/bin/startup.sh"]
H2数据库通过startup.sh启动,脚本内容:
#!/bin/bash cd /usr/local java -cp h2.jar org.h2.tools.Server -tcpAllowOthers -webAllowOthers
执行docker network inspect docker_my-network显示两个容器均已连接至该网络,且Tomcat和H2数据库在浏览器中均可正常访问。在H2容器内执行curl http://tomcat:8080可正常访问,但在Tomcat容器内执行curl http://h2:8082却返回“Host h2 not found”,请问遗漏了什么配置?
确认Tomcat容器的网络归属
执行docker inspect <tomcat容器ID或名称>,查看Networks字段是否包含my-network。如果未包含,说明容器未正确加入网络,需在compose.yml所在目录重新执行docker compose up -d,确保容器启动时关联指定网络。测试Tomcat容器内的DNS解析
进入Tomcat容器后,执行nslookup h2或dig h2:- 若解析失败,检查容器内的
/etc/resolv.conf,正常情况下应包含Docker内置DNS服务器(通常为127.0.0.11)。若DNS配置异常,可尝试重启Tomcat容器,或在compose.yml的tomcat服务中添加DNS配置:tomcat: # 原有配置 dns: - 127.0.0.11 - 8.8.8.8
- 若解析失败,检查容器内的
验证H2容器的运行状态
执行docker logs <h2容器ID或名称>,确认H2服务已正常启动(日志中应包含TCP server running at tcp://0.0.0.0:9092和Web server running at http://0.0.0.0:8082类信息)。若H2未正常启动,需在H2的Dockerfile中添加RUN chmod +x /usr/bin/startup.sh,确保启动脚本拥有执行权限。直接用IP测试连通性
通过docker inspect <h2容器ID>获取H2容器的IP地址,在Tomcat容器内执行curl http://<h2-ip>:8082:- 若能访问,说明问题出在DNS解析,需重点排查Tomcat容器的DNS配置;
- 若仍无法访问,需检查是否有自定义网络策略或容器内防火墙规则限制了连通(默认容器无防火墙,若有自定义配置需调整)。
内容的提问来源于stack exchange,提问作者vencint

