java - 连接到另一个本地主机 URL 时,Dockerized tomcat webapp 抛出 404 异常
问题描述
我有一个在 docker 容器中的 tomcat 8.5 中运行的应用程序。Java 版本是 jdk 8。应用程序使用的属性文件指向另一个正在运行的服务。在这种情况下,我的主机上运行了该服务,并且该属性设置为指向我的本地主机:
my.external.service.url=http://localhost:8080/my-api-service
当我的 tomcat 应用程序也在主机上运行时,这可以正常工作。但是当我的应用程序在 docker 容器中运行时,当它尝试调用此服务时出现 404 错误。
我尝试切换 URL 以指向我的机器名称:
my.external.service.url=http://my.pc.url.com:8080/my-api-service
但是在这种情况下,即使如果 tomcat 应用程序在主机而不是 docker 容器上运行它仍然可以工作,我会得到一个不同的错误:
java.net.UnknownHostException: my.pc.url.com: No address associated with hostname
如何配置容器以便我可以让它工作?
解决方案
查看您收到的特定错误No address associated with the hostname
- 这意味着它无法将主机名解析为 IP。因此,您可以找到本地主机 IP,然后将参数传递给 docker run 命令以将该主机添加到容器查找中。例如:-add-host="my.pc.url.com:X.X.X.X"
Docker 网络是一个潜在的复杂事物。基本上,如果您运行两个单独的容器,它们将不会“看到”彼此。您可以让它们都暴露主机上的端口,然后以这种方式“连接”,但您最好使用 docker 的网络功能来确保容器相互通信。
对于像您这样的简单示例 - 比如说只有两个运行您想相互交谈的 tomcat 的容器 - 您最好通过 docker-compose 运行它们,以便它们在同一个网络中。
如果您想探索,互联网上有许多资源可以解释 docker 网络的更多细节。
推荐阅读
- nginx - NGINX 动态路径返回 404
- excel - 添加新列时,VBA-Excel 按字母顺序重新排列列
- javascript - 滚动时制表符列表项消失;virtualDomBuffer 问题?
- python-3.x - 如何使用 itertools 继续使用列表中的值直到矩阵的对角线已满
- java - 带有 Spring 安全性的 Swagger-ui
- javascript - 带有img的div上的单击事件,单击img时不会触发文本
- java - 如何在基本时钟代码中在 java 上创建“setTime”方法
- python - 排序的熊猫数据框根据格式返回不同的值
- javascript - javascript找到深度嵌套的对象
- reactjs - 无法在 reactjs 中使用 webpack 4 在 body 上加载背景图片