Docker Compose 在 MySQL 和 NodeJS 中出现错误 ECONNREFUSED 127.0.0.1:3306

Posted

技术标签:

【中文标题】Docker Compose 在 MySQL 和 NodeJS 中出现错误 ECONNREFUSED 127.0.0.1:3306【英文标题】:Docker Compose getting error ECONNREFUSED 127.0.0.1:3306 with MySQL and NodeJS 【发布时间】:2021-02-07 06:37:26 【问题描述】:

我正在尝试通过在 Windows 10 主机中使用 Docker Compose 为我的 NestJS + TypeORM + mysql 环境设置一些容器,但我收到 ECONNREFUSED 错误:

connect ECONNREFUSED 127.0.0.1:3306 +2ms
backend_1  | Error: connect ECONNREFUSED 127.0.0.1:3306
backend_1  |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1145:16)
backend_1  |     --------------------
backend_1  |     at Protocol._enqueue (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
backend_1  |     at Protocol.handshake (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)        
backend_1  |     at PoolConnection.connect (/usr/src/app/node_modules/mysql/lib/Connection.js:116:18)
backend_1  |     at Pool.getConnection (/usr/src/app/node_modules/mysql/lib/Pool.js:48:16)
backend_1  |     at /usr/src/app/node_modules/typeorm/driver/mysql/MysqlDriver.js:793:18
backend_1  |     at new Promise (<anonymous>)
backend_1  |     at MysqlDriver.createPool (/usr/src/app/node_modules/typeorm/driver/mysql/MysqlDriver.js:790:16)
backend_1  |     at MysqlDriver.<anonymous> (/usr/src/app/node_modules/typeorm/driver/mysql/MysqlDriver.js:278:51)
backend_1  |     at step (/usr/src/app/node_modules/typeorm/node_modules/tslib/tslib.js:141:27)
backend_1  |     at Object.next (/usr/src/app/node_modules/typeorm/node_modules/tslib/tslib.js:122:57)

我创建了以下Dockerfile 来配置 NestJS API 容器:

FROM node:12-alpine
WORKDIR /usr/src/app

COPY package.json .
RUN npm install

EXPOSE 3000

#CMD ["npm", "start"]

CMD /wait-for-it.sh db:3306 -- npm start

COPY . .

然后我在 Docker Compose 中使用以下 docker-compose.yml 引用它:

version: "3.8"

networks:
  app-tier:
    driver: bridge

services:
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    expose:
      - "3306"
    ports:
      - "3306:3306"    
    networks:
      - app-tier      
    environment:
      MYSQL_DATABASE: school
      MYSQL_ALLOW_EMPTY_PASSWORD: ok
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: dbuser
      MYSQL_ROOT_HOST: '%'
  backend:
    depends_on:
      - db
    build: .
    ports:
      - "3000:3000"
    networks:
      - app-tier      

最后,我将 TypeORM 配置设置为与 Docker Compose 文件匹配:

export const DB_CONFIG: TypeOrmModuleOptions = 
    type: 'mysql',
    host: 'db',
    port: 3306,
    username: 'dbuser',
    password: 'dbuser',
    database: 'school',
    entities: [], // We specify the entities in the App Module.
    synchronize: true,
;

我是 Docker Compose 的新手,但我尝试了很多事情,比如将输出端口更改为 3307,设置显式网络......并且当我运行它时,端口 3306 在我的主机操作系统中是免费的。有什么帮助吗?

编辑 1

我已按照建议添加了MYSQL_ROOT_HOSTwait-for-it.sh,但仍然没有结果。

【问题讨论】:

docker 是否正在启动 mysql 容器,数据库是否在容器内正确启动?你能检查一下容器日志吗? 尝试这些步骤,错误似乎类似***.com/a/64487298/13961165 你好。是的,“db”容器在端口 3306 上运行,我可以登录以检查默认表。但是“后端”失败了。至于日志,我不确定是否不止这些。 您需要在应用程序中使用db:3306(容器名称和端口)而不是127.0.0.1:3306 嗯,很有趣。应用程序日志仍然显示Error: connect ECONNREFUSED 127.0.0.1:3306 【参考方案1】:

我认为您的数据库需要更多时间来启动,并且您的应用程序在数据库之前启动,请为您的 docker-compose.yml 文件尝试这样的操作:

version: "3.8"

networks:
  app-tier:
    driver: bridge

services:
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    expose:
      - "3306"
    ports:
      - "3306:3306"    
    networks:
      - app-tier      
    environment:
      MYSQL_DATABASE: school
      MYSQL_ALLOW_EMPTY_PASSWORD: ok
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: dbuser
      MYSQL_ROOT_HOST: '%'
  backend:
    depends_on:
      - db
    build: .
    command: bash -c 'while !</dev/tcp/db/3306; do sleep 1; done; npm start'
    ports:
      - "3000:3000"
    networks:
      - app-tier   

【讨论】:

谢谢,它成功了。我只需要在我的 Dockerfile 中添加 RUN apk update &amp;&amp; apk add bash 以便它可以执行 bash。 你在 Dockerfile 中哪里添加了这个命令?

以上是关于Docker Compose 在 MySQL 和 NodeJS 中出现错误 ECONNREFUSED 127.0.0.1:3306的主要内容,如果未能解决你的问题,请参考以下文章

在 docker-compose、nginx、mysql 和 php 上运行 wordpress

在 docker-compose 中使用 MySQL 初始化 Hibernate 时连接被拒绝

Docker-compose 多个Docker容器管理:以MYSQL和Wordpress为例

使用 docker-compose 无法在同一网络中连接 mysql 和 spring boot

docker docker-compose部署mysql和redis

docker docker-compose部署mysql和redis