运行Docker Compose部署MongoDB与NestJS后无法访问localhost:8080求助
问题排查与解决方案
核心问题分析
你的docker-compose.yaml中api服务同时配置了network_mode: "host"和ports: "8080:3000",这两个配置冲突:
- 当使用
network_mode: "host"时,容器会直接使用主机的网络栈,ports端口映射配置会完全失效。 - 你的NestJS应用通过环境变量
PORT: 3000指定运行在3000端口,所以此时应该访问http://localhost:3000而非8080。
另外还有两处配置不一致的地方需要修正:
- Dockerfile中
EXPOSE 8080与实际应用运行端口3000不匹配; - TypeORM配置中缺少数据库认证信息,且网络模式不同时主机配置需要调整。
解决方案一:移除network_mode: "host"(推荐)
这种方式使用Docker Compose默认的桥接网络,更符合容器化部署的最佳实践:
- 修改
docker-compose.yaml的api服务,删除network_mode: "host"配置:
version: "3.9" services: mongo: image: mongo ports: - "27018:27017" environment: ME_CONFIG_MONGODB_ADMINUSERNAME: root ME_CONFIG_MONGODB_ADMINPASSWORD: example api: image: image_name build: . depends_on: - mongo environment: NODE_ENV: development PORT: 3000 USERNAME: root PASSWORD: example ports: - "8080:3000" # 移除network_mode: "host"
- 修改TypeORM配置,将数据库主机改为
mongo(Docker Compose默认网络中,服务名可直接作为域名访问),端口改为容器内的27017,并添加认证信息:
@Module({ imports: [ TypeOrmModule.forRoot({ type: 'mongodb', host: 'mongo', // 替换为mongo服务名 port: 27017, // 容器内mongo默认端口 database: 'admin', entities: [], synchronize: true, auth: { username: 'root', password: 'example' } })], controllers: [AppController], providers: [AppService], }) export class AppModule {}
- 修改Dockerfile中的
EXPOSE端口为3000,保持与应用实际端口一致:
# Base image FROM node:12 # Create app directory WORKDIR /usr/src/app # A wildcard is used to ensure both package.json AND package-lock.json are copied COPY package*.json ./ # Install app dependencies RUN npm install # Bundle app source COPY . . EXPOSE 3000 # 修改为3000 # Creates a "dist" folder with the production build RUN npm run build # Start the server using the production build CMD [ "node", "dist/main.js" ]
完成上述修改后,重新构建并启动服务:
docker-compose down docker-compose build docker-compose up
此时访问http://localhost:8080即可正常访问NestJS应用。
解决方案二:保留network_mode: "host"
如果坚持使用主机网络,需调整以下配置:
访问端口改为3000:直接访问
http://localhost:3000(因为host模式下容器端口与主机端口一致)。修正Dockerfile的
EXPOSE端口为3000:
EXPOSE 3000
- 完善TypeORM配置,添加认证信息:
@Module({ imports: [ TypeOrmModule.forRoot({ type: 'mongodb', host: 'localhost', port: 27018, database: 'admin', entities: [], synchronize: true, auth: { username: 'root', password: 'example' } })], controllers: [AppController], providers: [AppService], }) export class AppModule {}
重新构建启动服务后,访问http://localhost:3000即可。
内容的提问来源于stack exchange,提问作者Thịnh Cường
相关产品推荐
相关产品推荐

