docker-compose之.netcoreapi容器與mysql容器

前言:

​ 基於上一篇.NetCoreApi容器與MySql容器互聯,此處利用docker-compose來快速配置啓動mysql容器與.NetCoreApi容器。html

注意:mysql

​ docker-compose.yml的編寫縮進不要用tab,要直接用空格(坑了我好久。。。)web

1、編寫docker-compose.yml文件

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

2、初始化sql腳本(C:/Users/Luo/source/repos/Api/Api/MySql-InitScript)

#給用戶受權(用於建立數據庫以及數據表)
GRANT ALL PRIVILEGES ON *.* TO 'lzl'@'%' WITH GRANT OPTION;

#改變密碼的加密方式(舊版本的navicat客戶端不支持新版本mysql的密碼加密方式,所以切換爲原來的加密方式,不然鏈接不上mysql)
alter user 'lzl'@'%' identified with mysql_native_password by 'password';

注意:sql

​ 在映射初始化sql腳本的時候,啓動的時候會提示驅動未共享。image-20200111200053441docker

​ 解決:數據庫

​ 右鍵docker for windows->settings->Shared Drives 勾選對應的盤符便可。c#

3、修改netcoreapi SeedData代碼(因爲mysql容器啓動較慢,api啓動較快,所以會報錯鏈接不到mysql)

經過加入錯誤重試,直到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);
                    }

                }
            }
        }

4、啓動容器編排

依次執行如下命令啓動:api

一、構建docker-compose中的鏡像
docker-compose build

查看構建的兩個鏡像app

docker ps

image-20200111204937419

二、啓動docker-compose
docker-compose up
三、查看容器運行狀況
docker-compose ps

image-20200111201029864

四、訪問http://localhost:8004/User/Get

image-20200111204553897

PS:啓動後鏈接不上mysql容器的話,試着從新啓動如下web應用(docker restart aspnetcoreapi)。若是重啓後可以訪問,加大SeedData的容錯次數便可。

相關文章
相關標籤/搜索