无法从宿主机连接Docker容器内的MongoDB,求解决方案
解决MongoDB容器无法暴露给宿主机的问题
你遇到的核心问题是ENTRYPOINT和CMD的组合方式错误,导致--bind_ip_all参数没有被正确传递给MongoDB进程,再加上Dockerfile里还有个路径小疏漏,咱们一步步解决:
问题根源拆解
- 你的
ENTRYPOINT用了shell形式(usr/bin/mongod)而非exec形式,Docker会通过/bin/sh -c启动进程,这时候CMD里的参数会被完全忽略,所以你加的--bind_ip_all根本没生效。 ENTRYPOINT的路径少了开头的/,正确路径应该是/usr/bin/mongod,否则系统会找不到这个命令。- MongoDB默认仅绑定
127.0.0.1,容器外的宿主机自然无法连接,必须指定--bind_ip_all或具体IP来开放接口。
修正后的Dockerfile方案
推荐用exec形式的ENTRYPOINT配合CMD传递参数,这是更灵活也符合Docker最佳实践的方式:
FROM ubuntu:16.04 RUN apt-get update RUN apt-get install apt-transport-https -y RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5 RUN echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.6.list RUN apt-get update RUN apt-get install -y mongodb-org=3.6.2 mongodb-org-server=3.6.2 mongodb-org-shell=3.6.2 mongodb-org-mongos=3.6.2 mongodb-org-tools=3.6.2 RUN mkdir -p /data/db EXPOSE 27017 # 修正为exec形式ENTRYPOINT,补全路径前缀/ ENTRYPOINT ["/usr/bin/mongod"] # 传递默认参数:绑定所有IP、指定端口、启用smallfiles CMD ["--bind_ip_all", "--port", "27017", "--smallfiles"]
如果是固定配置场景,也可以直接把参数写在ENTRYPOINT里,更简洁:
# ...前面步骤保持不变... ENTRYPOINT /usr/bin/mongod --bind_ip_all --port 27017 --smallfiles
修正运行命令
你的运行命令里重复了--rm参数,去掉一个即可:
docker run --rm -ti --security-opt=seccomp:unconfined -p27017:27017 -p28017:28017 --name mong mong
验证效果
重新构建镜像并运行后,之前的绑定警告会消失,宿主机可以通过localhost:27017正常连接MongoDB容器。这是因为--bind_ip_all让MongoDB绑定了容器内所有网络接口,配合Docker的端口映射-p27017:27017,宿主机就能访问到容器内的服务了。
内容的提问来源于stack exchange,提问作者Rudziankoŭ
相关产品推荐
相关产品推荐

