使用Docker部署NodeJS时连接MySQL报错的求助
解决Docker容器中NodeJS连接MySQL被拒绝的问题
问题根源
容器内的localhost指向容器自身,而非宿主机或其他容器,导致NodeJS无法连接到外部的MySQL服务。
解决方案1:用Docker网络连接MySQL容器(推荐,若MySQL也用Docker运行)
- 创建自定义Docker网络
docker network create app-network
- 启动MySQL容器并加入该网络
docker run -d \ --name mysql-db \ --network app-network \ -e MYSQL_ROOT_PASSWORD=ilovestackoverflow \ -e MYSQL_DATABASE=db830 \ mysql:latest
- 修改NodeJS数据库连接配置,将
host改为MySQL容器名mysql-db
const con = mysql.createConnection({ host: "mysql-db", user: "root", password: "ilovestackoverflow", database: "db830", port: "3306" });
- 重新构建镜像并启动NodeJS容器,加入同一网络
docker build -t help:help . docker run -p 3000:3000 \ --name node-app \ --network app-network \ help:help
解决方案2:连接宿主机上的MySQL
找到宿主机的IP地址:
- Linux:执行
ip addr show docker0查看网关地址 - Windows/macOS:执行
docker inspect bridge查找Gateway字段值
- Linux:执行
修改NodeJS连接配置的
host为宿主机IP
const con = mysql.createConnection({ host: "192.168.1.100", // 替换为你的宿主机IP user: "root", password: "ilovestackoverflow", database: "db830", port: "3306" });
- 确保宿主机MySQL允许外部连接:
- 修改MySQL配置文件(如
my.cnf或my.ini),将bind-address设为0.0.0.0 - 重启MySQL服务
- 修改MySQL配置文件(如
解决方案3:使用Docker Compose(一键管理多服务)
创建docker-compose.yml文件:
version: '3.8' services: node-app: build: . ports: - "3000:3000" depends_on: - mysql-db networks: - app-network mysql-db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: ilovestackoverflow MYSQL_DATABASE: db830 networks: - app-network networks: app-network: driver: bridge
修改NodeJS连接配置的host为mysql-db,然后执行命令启动所有服务:
docker-compose up --build
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

