You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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。

另外还有两处配置不一致的地方需要修正:

  1. Dockerfile中EXPOSE 8080与实际应用运行端口3000不匹配;
  2. TypeORM配置中缺少数据库认证信息,且网络模式不同时主机配置需要调整。

解决方案一:移除network_mode: "host"(推荐)

这种方式使用Docker Compose默认的桥接网络,更符合容器化部署的最佳实践:

  1. 修改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"
  1. 修改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 {}
  1. 修改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"

如果坚持使用主机网络,需调整以下配置:

  1. 访问端口改为3000:直接访问http://localhost:3000(因为host模式下容器端口与主机端口一致)。

  2. 修正Dockerfile的EXPOSE端口为3000:

EXPOSE 3000
  1. 完善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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:16:38