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
然后打開 程序包管理器空值台 輸入代碼遷移數據庫
在控制台輸入以下代碼【注意執行這段命令之前。先把 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
保存完畢之后,看看文件修改效果
然后把項目的容器重啟
打開網頁查看效果
5】拓展 使用docker-compose.yml (2019-11-22更新)
上面demo中使用的就兩個容器,需要一個個部署生成,然后使用network橋接。比較麻煩。所以考慮使用docker-compose.yml取代上面手寫一個個生成容器的辦法。
【docker-compose.yml建議使用vscode編輯器編寫。】
1准備階段
首先再docker准備需要的mysql鏡像。我這里使用的是mysql5.7
創建文件docker-compose.yml 【被注釋的部分是磁盤映射,就是本機物理磁盤映射到docker上的位置。但是本機再設置docker 的shared drives時候一直失敗,所以先跳過。正式發布文件就刪除這個】
version: '3' services: db: image: mysql:5.7 container_name: mysqlYml command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci restart: always ports: - '3306:3306' environment: MYSQL_USER: qy MYSQL_PASSWORD: Ee123 MYSQL_ROOT_PASSWORD: Ee123
# volumes:
# -/K/docker/beta/mysql-init:/docker-entrypoint-initdb.d
web: build: . container_name: 'aspnetcore' ports: - "8003:80" depends_on: - db
同時注意appsettings.josn的連接名也需要修改
2開始創建容器
首先cd到文件路徑下
2執行
#1創建
docker-compose build
#2啟動
docker-compose up
當所有執行完畢之后。查看鏡像和容器
這個時候訪問8003依舊無法訪問。原因是項目用的是codefirs。還么有進行數據遷移。而mysql也沒有數據庫
3遷移數據庫
通過navicat查看
最后刷新網頁
6】.netCore3.1codefirst 跟新
.netCore 3.1
mysql 8.0
需要安裝以下插件
Pomelo.EntityFrameworkCore.MySql
Microsoft.EntityFrameworkCore.Tools
同時注意修改appsettings.json中的數據庫連接方式
"ConnectionStrings": { "MysqlUser": "server=localhost,3306;database=core3;userid=root;password=Ee123" }
最后注意Startup.cs =》ConfigureServices
var connection = Configuration.GetConnectionString("MysqlUser"); services.AddDbContext<MyDbContext>(options => options.UseMySql(connection));