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

Docker化Nestjs+MySQL+phpMyAdmin时Prisma无法连接localhost:3306

问题:Docker化部署NestJS+MySQL+phpMyAdmin后数据库连接失败

错误信息

容器启动后NestJS控制台报错:

Error: Can't reach database server at `localhost`:`3306`
at r /usr/src/app/node_modules/.pnpm/@prisma+client@4.15.0_prisma@4.15.0/node_modules/@prisma/client/runtime/library.js:108:2574)

本地操作情况

本地执行迁移与数据填充命令正常:

➜  my_app git:(master) ✗ npx prisma db push --force-reset && npx prisma db seed

Datasource "db": MySQL database "my_app" at "localhost:3306"

The MySQL database "my_app" at "localhost:3306" was successfully reset.

npm notice
Environment variables loaded from .env
Running seed command `ts-node prisma/seed.ts` ...

🌱  The seed command has been executed.

异常代码片段

以下数据库查询代码无法正常运行:

async signUp(@Body() dto: AuthDto):Promise<any> {
  return await this.prisma.user.findUnique(
      {
        where: {
          mobileNumber: dto.mobileNumber
        }
      }
  );
}

相关配置文件

docker-compose.yaml

networks:
  host:
    name: my_app
    external: true
  lan_access:
    driver: bridge
    
services:
  my_app:
    build:
      context: .
      dockerfile: src/Dockerfile
      target: development
    command: npm run start:dev my_app
    env_file:
      - src/.env

    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules
    networks:
      - default
    ports:
      - '80:3000'

  database:
    image: mysql:latest
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_DATABASE: 'my_db'
      MYSQL_PASSWORD: 'root'
      MYSQL_ROOT_PASSWORD: 'root'
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - my-db:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin:latest
    restart: always
    ports:
      - 8080:80
    environment:
      - PMA_ARBITRARY=1
volumes:
  my-db:

Dockerfile

# Development stage
FROM node:alpine As development

WORKDIR /usr/src/app

COPY package*.json ./
COPY prisma ../../prisma/

RUN npm install -g pnpm
RUN pnpm install --save

COPY . .

RUN npm run build

# Production stage
FROM node:alpine as production

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

WORKDIR /usr/src/app

COPY package*.json ./
COPY prisma ../../prisma/

RUN npm install -g pnpm
RUN pnpm install --only=production

COPY . .

COPY --from=development /usr/src/app/dist ./dist
COPY --chown=node:node --from=builder /usr/src/app/prisma /prisma


CMD ["node", "dist/src/amanpaz/main"]

解决方案

1. 修改数据库连接地址(核心问题)

在src/.env文件中,将数据库连接地址的localhost替换为Docker Compose中MySQL服务的名称database,同时确保数据库名与docker-compose配置一致:

# 修改后配置(容器内可用)
DATABASE_URL="mysql://root:root@database:3306/my_db"

注意:docker-compose中MySQL初始化的数据库名为my_db,需与连接地址中的库名保持一致;本地迁移用的my_app是宿主机上的独立数据库,与容器内数据库无关。

2. 确认网络连通性

my_app与database服务默认共用default网络,Docker Compose会自动为同网络内的服务提供DNS解析,通过服务名database即可直接访问MySQL服务,无需额外网络配置。

3. 重启容器

执行以下命令重新构建并启动容器:

docker-compose down && docker-compose up --build

补充说明

  • 本地执行迁移时用localhost:3306是因为宿主机通过端口映射直接访问MySQL容器;但容器内的NestJS服务中,localhost指向容器自身,无法连接到外部的MySQL服务。
  • phpMyAdmin可通过localhost:8080访问,在登录界面输入database:3306即可连接容器内的MySQL服务。

内容的提问来源于stack exchange,提问作者DolDurma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:35:17