.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


浙公网安备 33010602011771号