Docker Compose部署MongoDB数据库连接错误求助
嘿,我看到你在用Docker Compose部署客户端-服务端应用时遇到了数据库连接错误——客户端页面能正常加载,但后端连不上MongoDB,控制台报Database connection error,浏览器还出现404。咱们一步步排查解决:
1. 最常见的原因:应用比MongoDB先启动
当你执行docker-compose up时,angular和database服务会同时启动,但MongoDB需要几秒完成初始化,你的Node.js应用这时候就去连接,自然会失败。
修复方案:
在docker-compose.yml里给angular服务加启动等待逻辑,确保等MongoDB就绪后再启动应用,同时给数据库加健康检查让Docker明确它的就绪状态:
version: '2' services: angular: build: ./ ports: - "8000:8000" depends_on: - database # 用netcat检测数据库端口,连通后再启动应用 command: > sh -c "until nc -z database 27017; do sleep 1; done; npm run start:prod" networks: - app-network database: restart: always image: mongo container_name: mongo ports: - "27017:27017" # 健康检查:每隔5秒ping一次数据库,确认就绪 healthcheck: test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 5 networks: - app-network networks: app-network: driver: bridge
如果你的Node 10镜像里没有nc(netcat),可以在Dockerfile里加一行安装命令:
RUN apt-get update && apt-get install -y netcat
2. Mongoose连接配置补全
你的连接代码里少了一个关键配置项,新版本Mongoose需要useUnifiedTopology: true,否则可能导致连接失败。同时可以增加超时和自动重连逻辑:
import * as mongoose from 'mongoose'; const server = 'database:27017'; const database = 'twitter'; export class Database { constructor() {} static connect() { const connectWithRetry = () => { mongoose.connect(`mongodb://${server}/${database}`, { useCreateIndex: true, useNewUrlParser: true, useUnifiedTopology: true, // 必须添加的核心配置 connectTimeoutMS: 10000, // 延长连接超时时间 retryWrites: true }) .then(() => { console.log('Database connection successful'); }) .catch(err => { console.error('Database connection error, retrying in 5s...', err); setTimeout(connectWithRetry, 5000); // 失败后自动重试 }); }; connectWithRetry(); } }
这个重连逻辑能确保应用在数据库就绪后自动连上,不用手动重启。
3. 检查容器网络连通性
如果上面的方法没用,可以手动测试angular容器能不能访问database服务:
# 查看运行中的容器 docker-compose ps # 进入angular容器的命令行 docker-compose exec angular bash # 测试ping数据库服务 ping database # 测试端口是否开放 telnet database 27017
如果ping不通或者端口连不上,说明Docker网络有问题,上面的app-network显式定义网络的配置就能解决这个问题。
4. 确认MongoDB容器正常运行
查看MongoDB的日志,确认它有没有正常启动:
docker-compose logs database
如果日志里出现waiting for connections on port 27017,说明数据库没问题;如果有权限相关的错误,给数据库加个Docker卷来持久化数据,避免主机文件权限问题:
database: restart: always image: mongo container_name: mongo ports: - "27017:27017" volumes: - mongodb_data:/data/db volumes: mongodb_data:
按上面的步骤来,应该就能解决你的数据库连接问题了!
内容的提问来源于stack exchange,提问作者Al Gebra

