构建 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
1新建文件夹 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; }
- }
- }
2新建文件夹 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.
docker 中 netcoreapi 连接 MySQL 成功
来源: https://www.cnblogs.com/roluodev/p/12151887.html