构建API与mysql互连

5.Mysql EF Core 快速构建API

  1. 新建一个空的webapi项目

  2. 引入依赖Mysql.entityframeworkcore

  3. 创建AppUser实体

  4. 创建UserContext类:DbContext

  5. 添加依赖注入

    services.AddDbContext<UserContext>(options => {
        options.UseMySQL(Configuration.GetConnectionString("MysqlUser"));
    });
    
  6. 在appsettings.json中添加ConnectStrings

     "ConnectionStrings": {
        "MysqlUser": "server=127.0.0.1;port=3306;database=beta_user;userid=root;password=123456"
      }
    
  7. 添加管道

    InitUserDataBase(app);//管道添加到UseEndpoint前面
    public void InitUserDataBase(IApplicationBuilder app) {
        using (var scope=app.ApplicationServices.CreateScope())
        {
            var userContext = scope.ServiceProvider.GetRequiredService<UserContext>();
    
            userContext.Database.Migrate();
            if (!userContext.Users.Any()) {
                userContext.Users.Add(new Model.AppUser { Name="jesse"});
                userContext.SaveChanges();
            }
        }
    }
    
  8. 在程序包管理器控制台执行

    $ add-migration init 
    $ Microsoft.EntityFrameworkCore.Tools #安装工具
    
  9. 运行程序。执行成功以后可以在mysql中看到对应的数据库和数据库表

  10. 添加controller

    [ApiController]
    [Route("api/[controller]")]
    public class ValueController : Controller
    {
        private UserContext _userContext;
        public ValueController(UserContext userContext)
        {
            _userContext = userContext;
        }
    
        [HttpGet]
        public async Task<IActionResult> Get()
        {
            return Json(await _userContext.Users.SingleOrDefaultAsync(u => u.Name == "jesse"));
        }
    }
    
  11. 新建Dockerfile文件

FROM mcr.microsoft.com/dotnet/sdk:3.1 as build-env
WORKDIR /code

COPY *.csproj /code/
RUN dotnet restore

COPY . /code/
RUN dotnet publish -c Release -o out    

FROM mcr.microsoft.com/dotnet/aspnet:3.1
WORKDIR  /app
COPY --from=build-env /code/out /app/
EXPOSE 5001
ENTRYPOINT ["dotnet","User.API.dll"]
  1. 启动文件中指明运行时url

    webBuilder.UseUrls("http://*:5001");
    

    修改ConnectionStrings

      "ConnectionStrings": {
        "MysqlUser": "server=db;port=3306;database=beta_user;userid=root;password=123456"
      }
    

13.构建镜像并以link方式互联

image-20211130144736297

$ docker build -t api:dev .

$ docker run -d  api:dev 

$ docker run -d -p 5001:5001 --name mywebapi --link mysql01:db  api:dev	# --link链接到mysql01:db(别名)
$ docker run -d -p 5011:5001 --name myapi1130_1 --link mysql01 api1130	#--link链接到mysql01:db(别名)

image-20211129171449099

  1. docker容器中没有ifconfig或ping命令
#使用命令:
$ apt-get update

$ apt install net-tools

$ apt install iputil-ping

$ apt install iputils-ping(通过该命令安装)
  1. 在运行的容器内ping db

image-20211130111548588

image-20211130111852762

image-20211130111334691

  1. Docker NetWork

Bridge:单台

桥接:网桥就有桥接作用,简单的说就是通过网桥可以把两个不同的物理局域网连接起来

#创建network
$ docker network create -d bridge mybridge

$ docker network ls
#桥接
$ docker run -d -p 8001:80 --net mybridge --name aspnetcore api:dev
#链接后容器可以通信
$ docker network connect mybridge mysql01 
#获取镜像的原数据
$ docker inspect mysql01

$ docker rename mysql01 db
posted @ 2021-11-30 17:05  CCmonitor  阅读(110)  评论(0)    收藏  举报