Mongo db - 来自 Docker 中另一个容器的连接异常
Mongo db - connection exception from another container in Docker
在 Jenkins 中,我试图在 docker 容器中 运行 我的后端服务,它依赖于 Mongo 数据库。
目前我是这样的:
stage('Backend clone and build') {
steps { git ([url : 'https://github...', branch : 'develop', credentialsId : '***'])
sh 'docker pull mongo'
sh 'docker run -d -p 27017:27017 --name mongodb mongo'
sh 'docker build -t myimage2 .'
sh 'docker run myimage2'
}
}
在我 运行 构建之后,我有这个异常:
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-4.1.2.jar!/:na]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:143) ~[mongodb-driver-core-4.1.2.jar!/:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:188) ~[mongodb-driver-core-4.1.2.jar!/:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:144) ~[mongodb-driver-core-4.1.2.jar!/:na]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
我尝试 link 容器与 mongodb 容器作为:sh 'docker run --link mongodb:27017 myimage2'
,但没有成功。
我还想通过 mongodb://localhost:27017
定义主机,但 docker 不接受此命令。我没有找到任何解决方案来消除该异常。
如果我更深入地研究那个异常,我还发现了这个:
Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused (Connection refused)}}]; nested exception is com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect.
所以由于某种原因它无法连接到 localhost:27017,其中 mongodb 应该是 运行ning。
为了帮助可能遇到同样问题的其他人,您有 2 个选项可以正确设置:
创建一个docker网络,并启动这个网络上的所有容器,使容器之间可以相互发现,默认是bridge网络类型。在这种情况下,容器与主机网络接口隔离,无法通过 "localhost"
.
访问
如果您希望容器 运行 在主机网络上并可通过主机网络接口 localhost
或主机 IP 访问,请按 docker 在此处的官方文档中建议:https://docs.docker.com/network/host/
在 Jenkins 中,我试图在 docker 容器中 运行 我的后端服务,它依赖于 Mongo 数据库。
目前我是这样的:
stage('Backend clone and build') {
steps { git ([url : 'https://github...', branch : 'develop', credentialsId : '***'])
sh 'docker pull mongo'
sh 'docker run -d -p 27017:27017 --name mongodb mongo'
sh 'docker build -t myimage2 .'
sh 'docker run myimage2'
}
}
在我 运行 构建之后,我有这个异常:
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-4.1.2.jar!/:na]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:143) ~[mongodb-driver-core-4.1.2.jar!/:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:188) ~[mongodb-driver-core-4.1.2.jar!/:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:144) ~[mongodb-driver-core-4.1.2.jar!/:na]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
我尝试 link 容器与 mongodb 容器作为:sh 'docker run --link mongodb:27017 myimage2'
,但没有成功。
我还想通过 mongodb://localhost:27017
定义主机,但 docker 不接受此命令。我没有找到任何解决方案来消除该异常。
如果我更深入地研究那个异常,我还发现了这个:
Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused (Connection refused)}}]; nested exception is com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect.
所以由于某种原因它无法连接到 localhost:27017,其中 mongodb 应该是 运行ning。
为了帮助可能遇到同样问题的其他人,您有 2 个选项可以正确设置:
创建一个docker网络,并启动这个网络上的所有容器,使容器之间可以相互发现,默认是bridge网络类型。在这种情况下,容器与主机网络接口隔离,无法通过
访问"localhost"
.如果您希望容器 运行 在主机网络上并可通过主机网络接口
localhost
或主机 IP 访问,请按 docker 在此处的官方文档中建议:https://docs.docker.com/network/host/