场景
在宿主机上依次执行以下命令, 拉取 mongo 镜像, 创建容器并运行
docker pull mongo
docker run --rm -d \
--name mongo-test \
mongo \
bash
进入容器中:
docker exec -it mongo-test bash
执行使用 mongosh 连接 mongo 数据库的命令:
mongosh
报错:
MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017
分析
连接出错, 可能是 docker 容器的网络问题, 于是修改默认配置 ip , 修改之后没找到重新加载配置的方法, 遂重启容器, 顺便学习 docker cp 的用法, 重新加载配置也失败, 查看本地正常运行在 docker 中的 mongo 容器, 并没有修改 ip 为 0.0.0.0 , 又去复习了 127.0.0.1 和 0.0.0.0 以及 localhost 的区别.
后来想到, 有没有可能 mongo 服务没有启动, 没有启动应该也会导致连接出错. 果然是这样, 启动 mongodb 的命令是 mongod
, 启动之后解决问题. 同时需要修改容器启动命令为:
docker run --rm -d \
--name mongo-test \
mongo \
mongod
之后再使用 docker exec
进入容器使用 mongosh
连接正常.
出现这个问题的原因:
- 不清楚镜像和容器启动的关系, 以为容器启动之后 mongodb 会自动运行, 但实际需要在启动命令中显式声明
- 用
history
没有找到本地 mongo 容器启动的命令, 自己按习惯顺手写了 bash
实际上我有很多坑都是这样, 灯不亮, 灯泡没问题, 插座开关也开了, 但插座没插电.
总结
docker 启动命令中, 可能需要显式指明要启动的服务, mongodb 镜像并不会自动启动 mongodb 服务.
docker 容器中需要连接 127.0.0.1 时, 不需要作额外配置.