MacOS 10.15
mysql版本: 8.0.11
node版本:18.19.0
解决方式:
使用docker inspect + mysql容器的地址。 进入容器查看该容器的ip地址。
nestjs应用中将mysql的连接改为容器内部的地址。这些配置尽量写在配置文件中,我这里为了方便演示直接写死了。
TypeOrmModule.forRoot({
type: 'mysql',
host: '172.19.0.2',
port: 3306,
username: 'root',
password: 'password',
database: 'db_name',
autoLoadEntities: true,
synchronize: true,
logging: true,
connectorPackage: 'mysql2',
extra: {
authPlugin: 'sha256_password',
},
});
docker-compse配置
version: '3'
services:
# 我的nest服务名称
nest-master:
image: node:18.19.0
_name: 'zz_master'
# nest项目打包时,用的是他自己目录下的 Dockerfile
# 依赖于另外两个 service,另外两个 service 会先被构建
working_dir: /nest-backend-service
volumes:
- ./:/nest-backend-service
command: npm run start:dev
depends_on:
- zz-mysql-7
# 端口映射,左边是宿主机上的端口 7008,也就是你打开浏览器http://localhost:7008 可以访问到 nest 的接口,而在容器内部他是运行在 7007 上
ports:
- '3000:3000'
# 失败时重启,有时候 mysql 没启动起来,nest 已经完事了,就会连不上 mysql,所以一直重启,知道 mysql 启动成功
# 不过你的项目如果有bug,他就会无限重启,所以要自己注意了
# restart: on-failure
# 声明他们在zzstudio-server 这个网络中,可以用container_name进行访问
# 不声明的话,也会在同一个网络中,名称默认是 项目_default, 比如我这个项目叫 zz-nest, 默认的网络名称就是 zz-nest_default
networks:
- zzstudio-server
# 我的 mysql 服务的名称
zz-mysql-7:
# 我指定的容器名,当 nest服务(也就是上边的 nest-master)要访问 mysql 时,mysql的 host 就配置为 zz_mysql
_name: 'zz_mysql'
image: mysql:8.0.11
# 端口映射,当你从外部访问 3307 时会被映射到容器内部的 3306 上。
# 因为这里我们三个服务在同一个网络下,所以我们prod.env 使用的应该是 3306
ports:
- '3307:3306'
# 挂载的本地目录
command: --default-authentication-plugin=mysql_native_password
restart: always
volumes:
- /usr/mysql:/var/lib/mysql
# 可以用于初始化时执行一些 sql,我查阅的野文里,有的用来解决数据库没有被创建,或用来表结构初始化,有需要的自行尝试
# - ./init.sql/:/docker-entrypoint-initdb.d/init.sql
# 相关的环境变量,密码应该是必须要设置的,忘了咋回事了
environment:
# 如果你的 mysql 是 8.x 不要指定 MYSQL_USER=root,会报错
# 在指定了MYSQL_DATABASE后,会自动创建这个数据库!
MYSQL_DATABASE: micro_app
MYSQL_ROOT_PASSWORD: A887563$
# 同样,显式的声明在一个网络下
networks:
- zzstudio-server
# 声明网络,和上边所有的 server 下边的 networks 相对应
networks:
zzstudio-server:
driver: bridge
此时nestjs服务已经运行正常了