运行Docker容器时MongoDB连接失败求助:无需docker-compose解决方案
解决Docker容器连接Mongo失败的问题(无需docker-compose)
我来帮你定位问题并搞定它——你的核心问题在于多阶段构建的Mongo阶段没有实际运行,且Node容器和Mongo容器不在同一个可互通的网络环境里,导致Node容器无法解析mongo这个主机名。下面是一步步的解决办法:
第一步:创建自定义Docker网络
Docker默认的bridge网络不支持容器间通过主机名互相访问,所以我们需要创建一个自定义网络,让两个容器能在这个网络里互通:
docker network create app-network
第二步:独立运行Mongo容器
你之前的Dockerfile里的Mongo阶段只是构建了镜像,但没有实际启动Mongo服务。现在我们单独启动Mongo容器,并把它加入刚才创建的网络:
docker run -d --name mongo --network app-network -v mongo-data:/data/db mongo:latest
--name mongo:给Mongo容器命名为mongo,这样Node容器里的mongodb://mongo/allin就能正确解析到它-v mongo-data:/data/db:用Docker卷持久化Mongo数据,避免容器重启后数据丢失--network app-network:把容器加入自定义网络
第三步:简化你的Dockerfile
原来的多阶段构建里的Mongo阶段完全没用(因为最后输出的是Node镜像),所以删掉多余的Mongo阶段,简化后的Dockerfile如下:
FROM node:latest RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json /usr/src/app/ RUN npm i COPY . /usr/src/app EXPOSE 4000 CMD [ "npm", "start" ]
第四步:构建Node应用镜像
在项目根目录下执行构建命令:
docker build -t node-app .
第五步:启动Node容器并加入同一网络
把Node容器也加入刚才的自定义网络,这样它就能访问到Mongo容器了:
docker run -d --name node-app --network app-network -p 4000:4000 node-app
-p 4000:4000:把主机的4000端口映射到容器的4000端口,方便你访问应用
为什么原来的方法不行?
你之前的多阶段构建只是把Mongo镜像作为一个“构建阶段”,但最终生成的镜像只有Node环境,并没有包含Mongo服务。而且就算你单独启动了Mongo容器,两个容器不在同一网络的话,Node容器里的mongo主机名无法被解析,自然连不上27017端口。
内容的提问来源于stack exchange,提问作者MrSkineto
相关产品推荐
相关产品推荐

