Docker启动MongoDB失败及外部连接问题求助
你遇到的问题主要出在容器运行时的镜像选择错误和端口映射格式不正确这两个核心点上,另外外部连接的命令也需要匹配正确配置,下面一步步帮你梳理解决:
一、先理清场景1的正确操作逻辑
场景1中你提到解决方案有效,但其实你的docker run命令存在一个关键疏漏:你构建了自定义镜像image1:1.0,但运行容器时却使用了官方的mongo镜像,这会导致你添加的mongo-init.js初始化脚本根本没被执行。正确的运行命令应该是:
docker run -d -p 27017-27019:27017-27019 --name mongo-container image1:1.0
只有这样,容器才会加载你自定义的初始化脚本,创建test-database和test-user,并插入测试数据。
二、场景2的问题修正
1. 修正端口映射错误
你修改后的运行命令docker run -d -p 37017:27017-27019格式完全错误,Docker的端口映射规则是单个主机端口对应单个容器端口,不能用一个主机端口映射容器的端口范围。如果需要映射27017-27019这三个端口,应该拆分写成:
docker run -d -p 37017:27017 -p 37018:27018 -p 37019:27019 --name mongo-container image1:1.0
如果只是常规连接MongoDB的默认27017端口,只需要保留-p 37017:27017即可。
2. 确保初始化脚本被执行
和场景1的问题一样,必须使用你自己构建的image1:1.0镜像运行容器,而不是官方mongo镜像——否则初始化脚本不会生效,自然找不到test-database和test-user。
3. 正确的外部连接方式
当你从容器外部连接时,需要指定正确的认证信息和目标数据库。比如使用MongoDB Shell连接的话,可以直接用带认证的连接字符串:
mongosh mongodb://test-user:test-password@172.20.1.100:37017/test-database
或者先连接再分步认证:
mongosh mongodb://172.20.1.100:37017
进入Shell后执行:
use test-database db.auth('test-user', 'test-password')
这样就能成功连接到你创建的test-database,并看到插入的测试数据了。
三、补充说明初始化脚本的正确性
你的mongo-init.js脚本逻辑是没问题的:
db.auth('admin-user', 'admin-password') db = db.getSiblingDB('test-database') db.createUser({ user: 'test-user', pwd: 'test-password', roles: [ { role: 'readWrite', db: 'test-database' } ] }); db.foo.insert({ x: 1, y: 1 })
因为你设置了MONGO_INITDB_DATABASE=admin,初始化脚本默认在admin库执行,所以先通过root用户admin-user认证,再切换到test-database创建用户和插入数据,这个流程完全符合MongoDB的初始化规范。
内容的提问来源于stack exchange,提问作者Afnan Ahmad

