基於上一篇.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的容錯次數便可。