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); } #endregionView 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
儲存完畢之後,看看檔案修改效果
然後把專案的容器重啟
開啟網頁檢視效果