Mac下Docker部署TS ORM开发Node应用连接MySQL报错2002求助
问题根因
- 你的Dockerfile使用了多阶段构建规则,第一阶段安装的mariadb-server完全没有被带入到最终的node镜像阶段,最终生成的镜像里根本没有MySQL/MariaDB相关的执行文件、服务配置
- 启动容器时没有启动MySQL服务进程,就算镜像内有MySQL程序,服务未运行也不可能连接成功
- 从
docker ps的输出可以看到,你的容器没有配置端口映射,3306端口根本没有对外提供访问能力
修复方案
方案1:单容器同时运行Node和MariaDB(仅适合本地测试)
- 重写Dockerfile,取消多阶段构建,把所有依赖都装到同一个镜像内:
FROM ubuntu:20.04 # 安装系统依赖 RUN apt update && apt install -y mariadb-server nodejs npm RUN npm install -g typescript # 初始化MariaDB配置 RUN service mysql start && \ mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '自定义root密码'; FLUSH PRIVILEGES;" && \ mysql -e "CREATE DATABASE IF NOT EXISTS 你的数据库名称;" # 配置Node项目 WORKDIR /node/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3306 3000 # 3000替换为你实际的Node服务端口 # 配置启动脚本 COPY start.sh /start.sh RUN chmod +x /start.sh CMD ["/start.sh"]
- 同目录下创建启动脚本
start.sh:
#!/bin/bash service mysql start npm run start # 替换为你实际的项目启动命令
- 构建镜像后启动时添加端口映射:
docker run -p 3306:3306 -p 3000:3000 tazbiopooltech/nodeapp:1.0
启动完成后即可在本地使用mysql -h 127.0.0.1 -P 3306 -u root -p连接数据库。
方案2:多容器分离部署(推荐,符合Docker最佳实践)
将Node服务和MySQL拆分为两个独立容器,用docker-compose统一管理:
- 清理Dockerfile中所有和MySQL相关的逻辑,仅保留Node项目配置:
FROM node WORKDIR /node/app COPY package*.json package-lock*.json ./ RUN npm install RUN npm install -g typescript COPY . . EXPOSE 3000 # 替换为你实际的Node服务端口 CMD ["npm", "run", "start"]
- 同目录下创建
docker-compose.yml配置文件:
version: '3' services: mysql: image: mariadb:10.5 environment: MYSQL_ROOT_PASSWORD: 自定义root密码 MYSQL_DATABASE: 你的数据库名称 ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql nodeapp: build: . ports: - "3000:3000" depends_on: - mysql environment: # 替换为你项目ORM的数据库连接配置,主机名直接填mysql即可,Docker会自动做内部域名解析 DB_HOST: mysql DB_USER: root DB_PASSWORD: 自定义root密码 DB_NAME: 你的数据库名称 volumes: mysql-data:
- 执行
docker-compose up -d即可同时启动两个容器,本地可直接连接3306端口的MySQL,Node服务也可以正常访问数据库。
注意:单容器运行多服务不符合Docker的设计理念,生产环境请使用多容器分离部署的方案,方便各自扩容、排查问题、管理生命周期。
内容的提问来源于stack exchange,提问作者Zemmouri Tarek
相关产品推荐
相关产品推荐

