1. 程式人生 > >docker 建立.netcore2.2 api容器 以及連線mysql容器

docker 建立.netcore2.2 api容器 以及連線mysql容器

1】環境說明

作業系統:Window 10 專業版

開發工具 Vs2019專業版

Docker:  Docker for Windows 

 

docker在windows上安裝完畢之後可以看到

 

 

 

2】拉取mysql映象以及建立容器

1:首先 以管理員方式開啟PowerShell 

docker執行成功會顯示

 

 

 

 

 

 

2:拉取mysql5.7映象 ,在powershell輸入下面命令,然後回車

docker pull mysql:5.7

然後可以看到映象

 

 

 

3:建立mysql容器

建議下面程式碼先寫好,然後合併成一行,再執行

docker run 
--name mysql57 
-p 3306:3306 
-e MYSQL_USER=qy       
 -e MYSQL_PASSWORD=123  
-e MYSQL_ROOT_PASSWORD=123
 -d mysql:5.7 
--character-set-server=utf8  --collation-server=utf8_general_ci

下面是上面程式碼的註釋

docker run 
--name mysql57     #容器名稱
-p 3306:3306       #埠對映  前面3306是mysql的訪問埠,後面是本身的訪問埠  如果設定成3307:3306  那麼資料庫建立之後,通過外部(比如navicat)訪問就只能通過3307訪問mysql
-e MYSQL_USER=qy    #建立賬號
 -e MYSQL_PASSWORD=123   #建立賬號的密碼
-e MYSQL_ROOT_PASSWORD=123   #重置root的密碼
 -d mysql:5.7                 #映象名稱(從那個映象上面建立容器)
--character-set-server=utf8  --collation-server=utf8_general_ci   #設定utf-8  這樣mysql就可以加入中文字元

 

 

 在STATUS中如果顯示up則表示改容器正在執行,mysql容器到此一段落

3】建立api專案

1:建立專案

選擇模板

 

 

 

勾選.netCore2.2同時選擇api專案

 

 

 2:nuegt包下載

由於是連線mysql 所以在nuget中安裝以下包

MySql.Data.EntityFrameworkCore      =》安裝的是最新版本8.0.18

Microsoft.EntityFrameworkCore.Tools     =》由於使用的.netCore2.2 所以安裝 2.2.0

 

3建立一個實體 以及上下文

 

  public class User
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public string Age { get; set; }
    }

 

 

public class TestContext : DbContext
    {
        public TestContext (DbContextOptions<TestContext > options)
            : base(options)
        {
        }

        public DbSet<User> User { get; set; }
    }

 

4配置檔案

appsettings.json中新增資料庫連線語句[注意server後面跟的是mysql的容器名稱]

  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MysqlUser": "server=mysqlTS;port=3306;database=beta_user;userid=root;password=Ee123"
  }

連線好了之後。在    Startup.cs->ConfigureServices中新增以下檔案[注意放在services.addMvc  的後面]

 

 

問了方便再建立的資料庫中看到資料。所以在 ValuesController.cs新增以下內容  []

        #region MyRegion
        private TestContext _testContext;

        public ValuesController(TestContext estContext)
        {
            _testContext = estContext;
        }

        [HttpGet]
        public string Get()
        {
            string reMsg = "無資料";

            //1先儲存一個數據
            int num = 1;
            var getall = _testContext.User.Where(c => true).OrderByDescending(c => c.Id).FirstOrDefault();
            if (getall != null)
            {
                num = getall.Id + 1;
            }
            _testContext.User.Add(new Models.User
            {
                Id = num,
                Name = "測試" + num,
                Age = "2" + num
            });
            _testContext.SaveChanges(); 

            //2獲取一個數據,然後返回
            if (getall != null)
            {
                var get = _testContext.User.SingleOrDefault(c => c.Id == 1);
                reMsg = get.Id + get.Name;
            }
          
            return (reMsg);
        }
        #endregion
View Code

 

 

 

然後開啟 程式包管理器空值臺 輸入程式碼遷移資料庫

 

 在控制檯輸入以下程式碼【注意執行這段命令之前。先把 appsettings.json中連線資料庫的 server=mysql  改成 server=localhost     因為mysql是專案釋出到docker中使用。而localhost是在本地使用   如果這裡不該。程式將連線不上資料庫】

#程式包管理器控制檯
Add-Migration Init/[自定義名稱]
Update-Database

 

 (update-database 程式碼太多,就不截全了)

執行完畢之後可以看到資料庫已經生成【本地通過navicat看】

 

 

4】將建立的專案製作成映象並且弄成容器執行

1建立dockerfile檔案並且釋出專案

 

 由於使用的是vs編輯器。建議在vs上生成dockerfile

右鍵專案,新增docker支援。然後彈出框中選擇linux。將dockerfile檔案修改好之後修改屬性為 【始終支援】 然後釋出專案

 

 

 dockerfile程式碼

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

#FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
#WORKDIR /app
#EXPOSE 80
#EXPOSE 443
#
#FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
#WORKDIR /src
#COPY ["dockerTs/dockerTs.csproj", "dockerTs/"]
#RUN dotnet restore "dockerTs/dockerTs.csproj"
#COPY . .
#WORKDIR "/src/dockerTs"
#RUN dotnet build "dockerTs.csproj" -c Release -o /app/build
#
#FROM build AS publish
#RUN dotnet publish "dockerTs.csproj" -c Release -o /app/publish
#
#FROM base AS final
#WORKDIR /app
#COPY --from=publish /app/publish .
#ENTRYPOINT ["dotnet", "dockerTs.dll"]


FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app 
COPY . .
EXPOSE 80
EXPOSE 443 
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

專案釋出注意選擇 【資料夾】格式    =》注意 釋出的時候  appsettings.json中連線資料庫的 server=localhost  改成 server=mysql  因為mysql是專案釋出到docker中使用

 

 2將專案檔案製作成映象

 開啟windowsPowerShell。cd到專案的釋出檔案地址

然後建立映象  執行下列程式碼

docker build -t dockersample .

【docker  build -t 映象名稱:版本號   .    】  注意.不要漏掉了

【docker  build -t 映象名稱   .    】  注意.不要漏掉了

 

 

3使用network方式建立容器連線

在docker的容器中有link和network兩種方式連線。考慮到link被docker放棄。這裡就使用network

3.1首先建立一個network

docker network create -d bridge Mybridge
# docker network create -d bridge   名稱

 

 

 

3.2 network建立完畢之後。就來建立容器(釋出的.netCore專案)

docker run -d -p 8002:80   --net Mybridge  --name  dockersampleRQ dockersample
docker run -d -p 訪問埠:程式設定帶你看   --net network名稱  --name  建立的容器名稱 映象名稱

3.3network橋接mysql容器

docker network connect Mybridge  mysql      
docker network connect   network Bridge方式建立的名稱   要連線的資料庫容器  

3.4修改mysql名稱

因為之前釋出的.netCore專案中appsettings.josn中連線的名稱是 mysqlTS而mysql容器的名稱是mysql所以,想讓程式執行。需要修改一下mysql容器名稱

docker rename mysql mysqlTS   

docker rename mysql容器名稱    修改後名稱

訪問8002埠就可以看見正常方位

 

 

當然不能每次都去修改容器名稱

這裡提供另外種方法就是通過vim去修改appsettings.josn檔案

4通過vim修改appsettings.josn檔案

4.1首先進入需要修改的容器

docker exec -it  dockersampleRQ bash  
docker exec -it  容器名稱 bash  

 

 4.2安裝vim

依次輸入

apt-get update      
回車
 apt-get install -y vim
回車

 

 

 

 vim安裝完畢之後,進入appsettings.josn檔案

vim  appsettings.json
vim  檔名.字尾

 

 

 

回車之後看見頁面如圖

 

 

進入編輯狀態需要進行以下操作

先按ESC  然後按 i

就可以進行編輯了

編輯完畢之後

先按ESC   
冒號鍵 按 w  按 q  按 enter 鍵


esc   :wq

儲存完畢之後,看看檔案修改效果

 

 然後把專案的容器重啟

 

 開啟網頁檢視效果