将 ERRCONNREFUSED 序列化到 mysql db in docker compose

Sequelize ERRCONNREFUSED to mysql db in docker compose

在 docker 中启动我的 api/app/db 时,api 无法连接到 mysql 容器。

docker-compose.yml

version: "3.8"
services:
    web:
        build:
            context: ./frontend
            dockerfile: Dockerfile-dev
        container_name: vue-ui-v2
        volumes:
            - ./frontend:/usr/src/app/ui
            - /usr/src/app/ui/node_modules
        ports:
            - "8080:8080"
        depends_on:
            - api
    api:
        build:
            context: ./backend
            dockerfile: Dockerfile-dev
        ports:
            - "4000:4000"
        container_name: node-api-v2
        volumes:
            - ./backend:/usr/src/app/api
            - /usr/src/app/api/node_modules
        depends_on:
            - db
    db:
        image: mysql:8.0
        cap_add:
            - SYS_NICE
        restart: always
        environment:
            - MYSQL_DATABASE=thebooks
            - MYSQL_ROOT_PASSWORD=defaultPassword
        ports:
            - '3306:3306'
        volumes:
            - db:/var/lib/mysql
volumes:
  db:

docker 文件 api

FROM node:12

WORKDIR /usr/src/app/api

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 4000

CMD [ "npm", "run", "start" ]

并连接来自 sequelize 的调用:

    const sequelize = new Sequelize('thebooks', 'root', 'defaultPassword', {
        host: 'localhost',
        port: 3306,
        dialect: 'mysql'
      });

我觉得一定有一些简单的东西我错过了,但我已经挠头好几个小时试图遵循这个:https://www.bezkoder.com/docker-compose-nodejs-mysql/ 几个小时都失败了。

您正在尝试连接到 localhost

通过使用本地主机,它将尝试访问容器的本地主机

您应该改用服务名称 db

因为 compose 会默认创建一个桥接网络。您的API容器将能够通过服务

的名称解析数据库容器IP

改变

 host: 'localhost',
 port: 3306,
 ...

 host: 'db',
 port: 3306,
 ...