.NetCoreApi容器与MySql容器互联
环境:
VS2020+.NET5.0 + Linux(Centos7) + Docker
1. 拉取mysql镜像
docker pull mysql/mysql-server
2. 创建mysql镜像
docker run -d -p 3306:3306 -e MYSQL_USER="yak" -e MYSQL_PASSWORD="123456" -e MYSQL_ROOT_PASSWORD="123456" --name mysql01 mysql/mysql-server --character-set-server=utf8 --collation-server=utf8_general_ci
3. 给用户授权
①docker exec -it mysql01 bash ②mysql -uroot -p ③GRANT ALL PRIVILEGES ON . TO 'yak'@'%' WITH GRANT OPTION;
参考:
4. 开启MySQL远程访问权限
select host,user from user; ALTER USER 'yak'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; flush privileges;
配置mysql远程连接
#登录mysqlmysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
#添加远程登录用户
CREATE USER 'yak'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO '123456'@'%';
可以远程连接了:
5. 新建API,结构如下:
6. 添加代码:
public class User { public int Id { get; set; } public string Name { get; set; } public string Company { get; set; } public string Title { get; set; } }
public class UserContext : DbContext { public UserContext(DbContextOptions<UserContext> options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); //配置连接字符串 必须TreatTinyAsBoolean=true 如果不加 bool类型会自动转化成bit类型 疯狂报错 //optionsBuilder.UseMySQL("Server=127.0.0.1;database=testdb;uid=root;password=pwd123456;TreatTinyAsBoolean=true"); //optionsBuilder.UseMySql("Server=192.168.192.138;database=db_appuser;uid=yak;password=123456;TreatTinyAsBoolean=true", new MySqlServerVersion(new Version(8, 0, 27))); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<User>() .ToTable("t_ApiUser"); } public DbSet<User> Users { get; set; } }
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var connectionString = Configuration["ConnectionSetting:MySqlConnection"]; ServerVersion serverVersion = ServerVersion.AutoDetect(connectionString); services.AddDbContext<UserContext>(options => options.UseMySql(connectionString,serverVersion)); services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Yak.DockerCompose.Api", Version = "v1" }); }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, UserContext dataDBContext) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Yak.DockerCompose.Api v1")); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); dataDBContext.Database.EnsureCreated();//数据库不存在的话,会自动创建 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 = "Huawei", Name = "yak", Title = "2022", Id = 1 }); context.SaveChanges(); } } } }
appsettings:
{ "ConnectionSetting": { "MySqlConnection": "Server=mysql01;database=db_appuser;user id=yak;password=123456;sslMode=None" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" }
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/aspnet:5.0 AS base WORKDIR /app COPY . . ENV ASPNETCORE_URLS http://0.0.0.0:3827 ENTRYPOINT ["dotnet", "Yak.DockerCompose.Api.dll"]
UserController:
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using System.Threading.Tasks; namespace Yak.DockerCompose.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); } } }
7.构建api镜像
docker build -t userapi:prod .
8. 创建network,用于连接mysql容器和api容器
docker network create -d bridge my-net
-d
参数指定 Docker 网络类型,有 bridge
overlay
。其中 overlay
网络类型用于 Swarm mode
9. 创建启动api容器,指定对应的network
docker run -d -p 8084:3827 --network my-net --name myuserapi userapi:prod
本机端口8084,容器监听端口3827
10. 由于mysql01容器并没有加入到该网络连接,api容器依然无法访问。下面将mysql01添加到my-net中来
docker network connect my-net mysql01 #添加进网络
docker network disconnect my-net mysql01 #从网络中移除
11. 查看两个容器是否在同一网段
docker inspect mysql01 docker inspect myuserapi
12. 浏览器访问http://192.168.192.138:8084/user/get
鸣谢:
https://jingyan.baidu.com/article/a681b0de2cf6627a1943460d.html
https://www.cnblogs.com/roluodev/p/12151887.html
https://blog.csdn.net/weixin_36297266/article/details/113127547
https://www.cnblogs.com/felixzh/p/10792082.html
本文来自博客园,作者:{春光牛牛,yak},转载请注明原文链接:https://www.cnblogs.com/yakniu/p/16292178.html
欢迎各位大佬们评论指正
QQ讨论群:610129902