zoukankan      html  css  js  c++  java
  • .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项目

    image-20200105103151900

    二、安装mysql驱动

    MySql.Data.EntityFrameworkCore 8.0.18连接.netCore3.0 有Bug ,做Db迁移的时候失败.因此采用Pomelo.EntityFrameworkCore.MySql驱动。

    Microsoft.EntityFrameworkCore.tools。

    image-20200105103321440

    三、新建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

    image-20200105105337799

    六、添加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);
            }
        }
    
    }
    

    八、启动项目,测试连接是否成功

    image-20200105110437253

    九、编写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所在的目录

    image-20200105111250017

    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
    

    image-20200105113954007

    docker inspect mysql01
    

    image-20200105114103427

    15、浏览器访问localhost:8084/User/Get。

    image-20200105113559841

    docker中netcoreapi连接Mysql成功

  • 相关阅读:
    通用工业协议(CIP)形式化的安全分析(前期概念的梳理)
    WEB安全工程师整理资料
    AWVS (Acunetix Web Vulnerability Scanner )
    Java Decompiler反编译Jar文件
    信息安全面试题整理
    工业网络安全 智能电网,SCADA和其他工业控制系统等关键基础设施的网络安全(总结)
    PLC编程的基础知识的总结
    协议安全分析方法的综述
    The Essential Burp Suite
    kali linux 虚拟机克隆之后版本回退问题
  • 原文地址:https://www.cnblogs.com/roluodev/p/12151887.html
Copyright © 2011-2022 走看看