gpt4 book ai didi

java - 无法从docker内部访问mongo

转载 作者:可可西里 更新时间:2023-11-01 10:02:33 24 4
gpt4 key购买 nike

我正在尝试访问 mongo来自 docker container 的内部当我尝试创建 connection 时发生错误.

new MongoClient(host, port)正在工作。

mongo也在 docker container 中运行我可以用 robomongo 连接到它并在其 docker container 之外运行该应用程序可以连接做mongo

我得到以下异常

No server chosen by WritableServerSelector from cluster description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, serverDescriptions=[ServerDescription{address=172.17.0.1:27017, type=UNKNOWN, state=CONNECTING}]}


2017-05-25T21:11:32.277 INFO 5 --- [72.17.0.1:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server 172.17.0.1:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.connection.SocketStream.open(SocketStream.java:63)
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115)
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:113)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.SocketTimeoutException: connect timed out
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 com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:57)
at com.mongodb.connection.SocketStream.open(SocketStream.java:58)
... 3 common frames omitted

docker-compose.yml

mongo:
image: library/mongo:3.4.4
ports:
- "27017:27017"
- "28017:28017"
- "28018:28018"
volumes:
- ./data/mongo:/data/db

dronedelivery:
image: paulcurcean/dronedelivery:latest
ports:
- "8080:8080"

用于无人机交付的 Dockerfile

ADD dronedelivery-0-SNAPSHOT.jar /
ADD start.sh / # java -jar dronedelivery-0-SNAPSHOT.jar
CMD ["sh", "/start.sh"]

docker ps/docker-compose ps

image                 ports
dronedelivery 0.0.0.0:8080 -> 8080/tcp
mongo 0.0.0.0:27017 -> 27017/tcp, 0.0.0.0:28017-28018 -> 28017-28018/tcp

我正在连接到 mongo通过new MongoClient(host, port)

最佳答案

我认为您遇到的问题是由于您引用的主机不正确。

我创建了一个工作 POC here 以创建两个容器,一个 SpringBoot 应用程序容器和一个 Mongo 容器。信息和说明在 README.md 中。

有多个点可能会导致您的应用出现故障:

  • 您可能需要确保您的应用程序应在 Mongo 正常运行后运行
  • 您的容器默认连接到默认的 bridge 网络,这是一个独立于主机网络(您的实际主网络)的网络。 bridge 网络连接到您的主要主机网络。因此,需要根据用于连接容器的网络(即 bridge 网络)从另一个容器引用一个容器。
  • docker-compose.yml - services.mymongo 中有端口 12345:27017 意味着可以从中引用 Mongo 数据库另一个容器 mymongo:27017 但来自主机 localhost:12345。从另一个容器 localhost:27017 使用是不正确的,因为 mymongo 是一个主机,而 myapp 是另一个主机。从 myapp 调用 localhost 并不意味着 mymongo 主机。
  • 为了查询您的 Mongo 实例的健康状况,您可以使用 mongod --rest 启用 REST api。因此 command: ["mongod", "--rest"]docker-compose.yml 中。这在启动应用程序容器时使用,以了解 Mongo 实例是否已启动并正在运行。

示例 docker-compose.yml:

version: '3'

services:
myapp:
build: ./myapp/docker
environment:
- SERVER_PORT=8080
- MONGODB_URI=mongodb://mymongo:27017/mydb
- MONGODB_STATUS_HOST=mymongo
- MONGODB_STATUS_PORT=28017
ports:
- 8888:8080
mymongo:
image: mongo:3.4
volumes:
- ./_data:/data/db
ports:
- 12345:27017
- 23456:28017
command: ["mongod", "--rest"]

请注意,Mongo 配置在端口 27017 上,因此 REST 接口(interface)将在 27017 + 1000 = 28017 上可用。

示例应用 Dockerfile

以下是创建连接Mongo实例的应用镜像的Dockerfile:

FROM openjdk:8-jdk-alpine
RUN apk update && apk upgrade && apk add netcat-openbsd
RUN mkdir -p /usr/local/myapp
ADD ./myapp.jar /usr/local/myapp/
ADD run.sh run.sh
RUN chmod +x run.sh
CMD ./run.sh

然后使用以下 run.sh 脚本启动应用程序:

#!/bin/sh

echo "********************************************************"
echo "Wait for mongodb to be available"
echo "********************************************************"

while ! nc -z $MONGODB_STATUS_HOST $MONGODB_STATUS_PORT; do
printf 'mongodb is still not available. Retrying...\n'
sleep 3
done

echo "********************************************************"
echo "Starting myapp"
echo "********************************************************"

java -Dserver.port=$SERVER_PORT \
-Dspring.data.mongodb.uri=$MONGODB_URI \
-jar /usr/local/myapp/myapp.jar

请注意,它首先通过查询其 REST 接口(interface)等待 Mongo 实例启动,然后它使用 OpenJdk 8 JRE 从其 .jar 文件启动应用程序。

关于java - 无法从docker内部访问mongo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44189994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com