基于上一篇.NetCoreApi容器与MySql容器互联,此处利用docker-compose来快速配置启动mysql容器与.NetCoreApi容器。html
注意:mysql
docker-compose.yml的编写缩进不要用tab,要直接用空格(坑了我好久。。。)web
version: "3" services: #mysql容器配置 db: image: mysql/mysql-server #使用镜像 command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci #至关于dockerfile中my.cnf中的配置,要以mysqld开头,不然不会生效 container_name: db #mysql容器名称 此处很关键,要与Web应用中链接字符串server保持一致(上面的db是只是services的名称) restart: always ports: - "3306:3306" environment: - MYSQL_PASSWORD=password - MYSQL_ROOT_PASSWORD=password - MYSQL_USER=lzl volumes: #数据库初始化sql脚本目录映射 本机目录:容器目录(按照官方的来) mysql启动的时候执行该脚本 - C:/Users/Luo/source/repos/Api/Api/MySql-InitScript:/docker-entrypoint-initdb.d/ #web应用配置 web: build: . #利用web应用的dockerfile来构建容器。 .为dockerfile所在的目录 container_name: "aspnetcoreapi" #容器名 ports: - "8004:3827" depends_on: #web应用依赖于mysql容器,此处设置让mysql容器先启动,再让web容器再启动。(注意:并不会等待mysql容器彻底启动) - db
#给用户受权(用于建立数据库以及数据表) GRANT ALL PRIVILEGES ON *.* TO 'lzl'@'%' WITH GRANT OPTION; #改变密码的加密方式(旧版本的navicat客户端不支持新版本mysql的密码加密方式,所以切换为原来的加密方式,不然链接不上mysql) alter user 'lzl'@'%' identified with mysql_native_password by 'password';
注意:sql
在映射初始化sql脚本的时候,启动的时候会提示驱动未共享。docker
解决:数据库
右键docker for windows->settings->Shared Drives 勾选对应的盘符便可。c#
经过加入错误重试,直到mysql容器启动成功。windows
public void InitialDataBase(IApplicationBuilder app,int? retry=0) { var retryTimes = retry.Value; using (var scope = app.ApplicationServices.CreateScope()) { try { var context = scope.ServiceProvider.GetRequiredService<UserContext>(); context.Database.Migrate(); if (!context.Users.Any()) { context.Users.Add(new User() { Company = "kingdee", Name = "LZL", Title = "2020", Id = 1 }); context.SaveChanges(); } } catch (Exception ex) { retryTimes ++; if(retryTimes<10) { InitialDataBase(app, retryTimes); } } } }
依次执行如下命令启动:api
docker-compose build
查看构建的两个镜像app
docker ps
docker-compose up
docker-compose ps
PS:启动后链接不上mysql容器的话,试着从新启动如下web应用(docker restart aspnetcoreapi)。若是重启后可以访问,加大SeedData的容错次数便可。