我试图从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
搬运工-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)
答案 0 :(得分:2)
我认为您遇到的问题是由于您错误地引用了主机。
我创建了一个工作POC here,以便创建两个容器,一个SpringBoot应用程序容器和一个Mongo容器。信息和说明位于README.md
。
有多个问题可能会导致您的应用出现故障:
bridge
网络,该网络是与主机网络(您的实际主网络)不同的网络。 bridge
网络已连接到主要主机网络。因此,需要针对用于连接容器的网络(即bridge
网络)来引用从另一个容器引用一个容器。docker-compose.yml
- services.mymongo
中使用端口12345:27017
意味着Mongo数据库可以从另一个容器引用为mymongo:27017
,但是来自localhost:12345
之类的主机。从另一个容器localhost:27017
使用是不正确的,因为mymongo
是一个主机而myapp
是另一个主机。从localhost
致电myapp
并不意味着mymongo
主持人。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接口将在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接口等待Mongo实例启动,之后它使用OpenJdk 8 JRE从其.jar
文件启动应用程序。
答案 1 :(得分:1)
您可以改用docker-compose。
首先,安装docker-compose。
我假设您正在为您的应用程序使用Dockerfile。
在里面创建一个带有 docker-compose.yml 的目录。
version: '2'
services:
mongo:
image: mongo:latest
restart: always
app:
build: ./app
restart: always
volumes:
- ./_client/:/var/www/html/
links:
- mongo
ports:
- "80:80"
现在,在./app中将当前的Docker文件放到应用程序中。
在_client /文件夹中放置您的应用程序(您可以根据需要更正内部路径/ var / www / html)。这两个文件夹与docker-compose.yml文件处于同一级别。
最后,使用docker-compose运行all:
docker-compose -f /path/to/your/docker-compose.yml build
此命令将从Dockerfile构建映像
docker-compose -f /path/to/your/docker-compose.yml up
此命令将创建并运行所有已定义的容器。
要从应用容器内部访问您的mongodb容器,可以使用“mongo”作为主机名(在“services:”中定义的同名)。在主机上,您可以使用docker容器IP,但需要公开端口,与docker-compose.yml中的“app”服务相同。