Docker环境下NestJS连接MySQL报ECONNREFUSED错误排查
问题原因分析
1. 容器间网络寻址错误
Docker Compose中每个容器都是独立的网络节点,不能用127.0.0.1访问其他容器。127.0.0.1在后端容器内指向容器自身,而非MySQL容器。正确的做法是使用docker-compose.yml中MySQL服务的名称(比如mysql)作为数据库连接的主机地址。
2. 端口概念混淆
- MySQL容器内部默认端口是
3306,如果你的docker-compose.yml里将MySQL端口映射为3307:3306,后端容器连接时必须用3306(容器内部端口),而非3307(宿主机映射端口)。宿主机端口仅用于外部访问,容器间通信直接使用容器内部端口。
3. 服务启动顺序问题
NestJS启动速度通常比MySQL快,后端可能在MySQL完成初始化前就尝试连接,导致连接被拒绝。需要在docker-compose.yml中给后端服务添加依赖配置,同时配合健康检查,确保MySQL就绪后再启动后端。
4. MySQL配置不匹配
- 检查MySQL容器的环境变量(如
MYSQL_ROOT_PASSWORD、MYSQL_DATABASE)是否正确,后端连接的用户名、密码、数据库名必须与这些配置完全一致。 - 确认MySQL容器未被自定义配置限制容器间连接(默认官方MySQL镜像允许容器间访问,除非你修改了权限配置)。
示例修正方向
docker-compose.yml 调整
services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: your_pwd MYSQL_DATABASE: your_db ports: - "3307:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 backend: build: context: . dockerfile: Dockerfile-backend depends_on: mysql: condition: service_healthy environment: DB_HOST: mysql DB_PORT: 3306 DB_USER: root DB_PASSWORD: your_pwd DB_NAME: your_db
app.module.ts 数据库配置调整
@Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: process.env.DB_HOST, port: parseInt(process.env.DB_PORT), username: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, entities: [/* 你的实体类 */], synchronize: true, }), ], }) export class AppModule {}
内容的提问来源于stack exchange,提问作者pmiranda
相关产品推荐
相关产品推荐

