Bluemix Docker 容器部署结果 "No route to host"
Bluemix Docker Container deployment results in "No route to host"
我们正在使用此命令部署 docker-映像:
cf ic run -p 8080 -m 512 -e SPRING_PROFILES_ACTIVE=test -e logging.config=classpath:logback-docker-test.xml --name <container-name> registry.eu-gb.bluemix.net/<repository_name>/<container-name>:latest
在该容器中,我们正在启动一个 Java8 Spring-Boot 应用程序,该应用程序使用连接池提供程序。连接池提供程序连接到可在标准端口上访问的现有 PostgreSQL 数据库。我们不使用任何域名连接到 PostgreSQL 数据库。我们只使用 IP 地址和标准的 postgresql 端口。
部署在使用标准 Docker 容器守护程序的机器上运行,并且也在 Amazon WebServices (AWS) 上运行,没有任何问题,并且使用相同的部署机制。
但是,如果我们将映像部署到 Bluemix-Container-Service,我们会在启动 spring-boot 应用程序时收到以下错误:
Caused by: java.net.NoRouteToHostException: No route to host
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.postgresql.core.PGStream.<init>(PGStream.java:61)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:129)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:65)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:146)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:35)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:47)
at org.postgresql.jdbc42.AbstractJdbc42Connection.<init>(AbstractJdbc42Connection.java:21)
at org.postgresql.jdbc42.Jdbc42Connection.<init>(Jdbc42Connection.java:28)
at org.postgresql.Driver.makeConnection(Driver.java:415)
at org.postgresql.Driver.access0(Driver.java:47)
at org.postgresql.Driver$ConnectThread.run(Driver.java:325)
... 1 more
我们不知道为什么会发生这种情况,因为如果我们在另一台 Bluemix-Docker-Machine 上使用所需端口远程登录到 PostgreSQL 数据库服务器,一切都很好。
这很烦人,因为我们目前无法在 Bluemix 上使用此 Docker-Image,并且目前正在阻碍我们计划的推出。
你能帮助我们详细说明可能出了什么问题以及如何解决这个问题吗?
任何帮助将不胜感激。
此致,
基督教徒
这个错误是在容器启动的时候出现的吗?
如果是这样,Bluemix 上的 Docker/IBM 容器需要大约 30 到 60 秒的网络状态:在此阶段,容器无法连接到网络。
这应该真的很可能是您收到错误的根本原因:如果 Java SpringBoot 应用程序在容器仍处于网络阶段时尝试连接到 PostgreSQL 数据库,它将失败并出现此错误。
当容器完成联网阶段时,您应该在容器上启动您的应用程序 运行(例如,通过 bash 脚本检查 PostgreSQL 服务器的可用性,或者简单地配置您的 springboot 来管理此异常)
官方 bluemix 支持提示等待 120 秒,然后再启动需要网络访问的 Java 应用程序。建议的方式是:
CMD ["/bin/sh", "-c", "sleep 120; exec java $JVM_ARGS -cp /app org.springframework.boot.loader.JarLauncher --spring.main.show_banner=false"]
这样我们就可以访问网络了,一切都很好。
我们正在使用此命令部署 docker-映像:
cf ic run -p 8080 -m 512 -e SPRING_PROFILES_ACTIVE=test -e logging.config=classpath:logback-docker-test.xml --name <container-name> registry.eu-gb.bluemix.net/<repository_name>/<container-name>:latest
在该容器中,我们正在启动一个 Java8 Spring-Boot 应用程序,该应用程序使用连接池提供程序。连接池提供程序连接到可在标准端口上访问的现有 PostgreSQL 数据库。我们不使用任何域名连接到 PostgreSQL 数据库。我们只使用 IP 地址和标准的 postgresql 端口。
部署在使用标准 Docker 容器守护程序的机器上运行,并且也在 Amazon WebServices (AWS) 上运行,没有任何问题,并且使用相同的部署机制。
但是,如果我们将映像部署到 Bluemix-Container-Service,我们会在启动 spring-boot 应用程序时收到以下错误:
Caused by: java.net.NoRouteToHostException: No route to host
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.postgresql.core.PGStream.<init>(PGStream.java:61)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:129)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:65)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:146)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:35)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:47)
at org.postgresql.jdbc42.AbstractJdbc42Connection.<init>(AbstractJdbc42Connection.java:21)
at org.postgresql.jdbc42.Jdbc42Connection.<init>(Jdbc42Connection.java:28)
at org.postgresql.Driver.makeConnection(Driver.java:415)
at org.postgresql.Driver.access0(Driver.java:47)
at org.postgresql.Driver$ConnectThread.run(Driver.java:325)
... 1 more
我们不知道为什么会发生这种情况,因为如果我们在另一台 Bluemix-Docker-Machine 上使用所需端口远程登录到 PostgreSQL 数据库服务器,一切都很好。
这很烦人,因为我们目前无法在 Bluemix 上使用此 Docker-Image,并且目前正在阻碍我们计划的推出。
你能帮助我们详细说明可能出了什么问题以及如何解决这个问题吗?
任何帮助将不胜感激。
此致,
基督教徒
这个错误是在容器启动的时候出现的吗? 如果是这样,Bluemix 上的 Docker/IBM 容器需要大约 30 到 60 秒的网络状态:在此阶段,容器无法连接到网络。 这应该真的很可能是您收到错误的根本原因:如果 Java SpringBoot 应用程序在容器仍处于网络阶段时尝试连接到 PostgreSQL 数据库,它将失败并出现此错误。 当容器完成联网阶段时,您应该在容器上启动您的应用程序 运行(例如,通过 bash 脚本检查 PostgreSQL 服务器的可用性,或者简单地配置您的 springboot 来管理此异常)
官方 bluemix 支持提示等待 120 秒,然后再启动需要网络访问的 Java 应用程序。建议的方式是:
CMD ["/bin/sh", "-c", "sleep 120; exec java $JVM_ARGS -cp /app org.springframework.boot.loader.JarLauncher --spring.main.show_banner=false"]
这样我们就可以访问网络了,一切都很好。