.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

 

posted @ 2022-05-20 14:20  春光牛牛  阅读(223)  评论(0编辑  收藏  举报