.NetCoreApi容器與MySql容器互聯
構建Mysql容器
1、拉取mysql映象
docker pull mysql/mysql-server
2、建立mysql映象
docker run -d -p 3306:3306 -e MYSQL_USER="lzl" -e MYSQL_PASSWORD="password" -e MYSQL_ROOT_PASSWORD="password" --name mysql01 mysql/mysql-server --character-set-server=utf8 --collation-server=utf8_general_ci
3、進入mysql 授權給上面使用者"lzl"許可權
①docker exec -it mysql01 bash
②mysql -uroot -p
③GRANT ALL PRIVILEGES ON . TO 'LZL'@'%' WITH GRANT OPTION;
構建.NetCoreApi
一、新建api專案
二、安裝mysql驅動
MySql.Data.EntityFrameworkCore 8.0.18連線.netCore3.0 有Bug ,做Db遷移的時候失敗.因此採用Pomelo.EntityFrameworkCore.MySql驅動。
Microsoft.EntityFrameworkCore.tools。
三、新建Model、配置DbContext
①新建資料夾Entityes、新建User
namespace Api.Entities
{
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Company { get; set; }
public string Title { get; set; }
}
}
②新建資料夾Data、新建UserContext.cs
namespace Api.Data { public class UserContext:DbContext { public UserContext(DbContextOptions<UserContext> options):base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<User>() .ToTable("t_ApiUser"); } public DbSet<User> Users { get; set; } } }
四、配置UserContext DI注入、配置MYSQL連結字串
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<UserContext>(options =>
{
options.UseMySql(Configuration.GetConnectionString("MySqlConString"));
});
services.AddControllers();
}
"ConnectionStrings": {
"MySqlConString": "Server=mysql01;database=db_appuser;userid=lzl;password=password;"
}
注意:此處Server=mysql01為第一步Mysql容器的名稱。在本地開發的時候可以設定為對應的Db伺服器地址。
五、初始化Db
依次執行 Add-Migration IntialDb、Update-Database
六、新增SeedData
StartUp.cs新增以下程式碼初始化資料。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
InitialDataBase(app);
}
public void InitialDataBase(IApplicationBuilder app)
{
using (var scope = app.ApplicationServices.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<UserContext>();
if (!context.Users.Any())
{
context.Users.Add(new User()
{
Company = "kingdee",
Name = "LZL",
Title = "2020",
Id = 1
});
context.SaveChanges();
}
}
}
七、新建UserController
namespace Api.Controllers
{
[ApiController]
[Route("[controller]/[action]")]
public class UserController : ControllerBase
{
private ILogger<UserController> _logger;
private UserContext _userContext;
public UserController(ILogger<UserController> logger,UserContext userContext)
{
_logger = logger;
_userContext = userContext;
}
[HttpGet]
public async Task<IActionResult> Get()
{
var users = await _userContext.Users.ToListAsync();
return new JsonResult(users);
}
}
}
八、啟動專案,測試連線是否成功
九、編寫api的Dockerfile
# 1.指定編譯和釋出應用的映象
FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build-env
# 2. 指定(編譯和釋出)工作目錄
WORKDIR /app
# 3. 拷貝.csproj到工作目錄/app,然後執行dotnet restore恢復所有安裝的NuGet包
COPY *.csproj ./
RUN dotnet restore
# 4. 拷貝當前專案目錄下所有檔案到工作目錄(/app),然後執行dotnet publish命令將應用釋出到/app/out目錄下
COPY . ./
RUN dotnet publish -c Release -o out
# 5. 編譯生成Docker映象
# 5.1.設定基礎映象
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
# 5.2. 設定(執行)工作目錄,並將釋出檔案拷貝到out子目錄下
WORKDIR /app
COPY --from=build-env /app/out .
# 5.3. 利用環境變數設定ASP.NET Core應用的監聽地址
ENV ASPNETCORE_URLS http://0.0.0.0:3827
# 5.4. 執行dotnet命令啟動ASP.NET Core應用
ENTRYPOINT ["dotnet", "Api.dll"]
10、cmd進入專案的dos目錄、構建api映象
docker build -t userapi:prod .
-t 映象名稱 dockerfile所在的目錄
11、建立network,用於連線mysql容器和api容器
docker network create -d bridge my-network
-d
引數指定 Docker 網路型別,有 bridge
overlay
。其中 overlay
網路型別用於 Swarm mode
12、建立啟動api容器,指定對應的network
docker run -d -p 8084:3827 --network my-net --name myuserapi userapi:prod
本機埠8084,容器監聽埠3827
13、由於mysql01容器並沒有加入到該網路連線,api容器依然無法訪問。下面將mysql01新增到my-net中來
docker network connect my-net mysql01 #新增進網路
docker network disconnect my-net mysql01 #從網路中移除
14、檢視兩個容器是否在同一網段
docker inspect myuserapi
docker inspect mysql01
15、瀏覽器訪問localhost:8084/User/Get。