zoukankan      html  css  js  c++  java
  • docker 创建.netcore3.0 api容器 以及连接mysql容器

    1】环境说明

    操作系统:Window 10 专业版

    开发工具 Vs2019专业版

    Docker:  Docker for Windows 

    docker在windows上安装完毕之后可以看到

    2】拉取mysql镜像以及创建容器

    1:首先 以管理员方式打开PowerShell 

    docker运行成功会显示

     

    2:拉取mysql5.7镜像 ,在powershell输入下面命令,然后回车

    docker pull mysql:5.7

    然后可以看到镜像

    3:创建mysql容器

    建议下面代码先写好,然后合并成一行,再执行

    复制代码
    docker run 
    --name mysql57 
    -p 3306:3306 
    -e MYSQL_USER=qy       
     -e MYSQL_PASSWORD=123  
    -e MYSQL_ROOT_PASSWORD=123
     -d mysql:5.7 
    --character-set-server=utf8  --collation-server=utf8_general_ci
    复制代码

    下面是上面代码的注释

    复制代码
    docker run 
    --name mysql57     #容器名称
    -p 3306:3306       #端口映射  前面3306是mysql的访问端口,后面是本身的访问端口  如果设置成3307:3306  那么数据库建立之后,通过外部(比如navicat)访问就只能通过3307访问mysql
    -e MYSQL_USER=qy    #创建账号
     -e MYSQL_PASSWORD=123   #创建账号的密码
    -e MYSQL_ROOT_PASSWORD=123   #重置root的密码
     -d mysql:5.7                 #镜像名称(从那个镜像上面创建容器)
    --character-set-server=utf8  --collation-server=utf8_general_ci   #设置utf-8  这样mysql就可以加入中文字符
    复制代码

     在STATUS中如果显示up则表示改容器正在运行,mysql容器到此一段落

    3】创建api项目

    1:创建项目

    选择模板

    3创建一个实体 以及上下文

    复制代码
      public class User
        {
            [Key]
            public int Id { get; set; }
            public string Name { get; set; }
            public string Age { get; set; }
        }
    复制代码
    复制代码
    public class TestContext : DbContext
        {
            public TestContext (DbContextOptions<TestContext > options)
                : base(options)
            {
            }
    
            public DbSet<User> User { get; set; }
        }
    复制代码

    4配置文件

    appsettings.json中添加数据库连接语句[注意server后面跟的是mysql的容器名称]

      "AllowedHosts": "*",
      "ConnectionStrings": {
        "MysqlUser": "server=mysqlTS;port=3306;database=beta_user;userid=root;password=Ee123"
      }

    连接好了之后。在    Startup.cs->ConfigureServices中添加以下文件[注意放在services.addMvc  的后面]

    问了方便再创建的数据库中看到数据。所以在 ValuesController.cs添加以下内容  []

    复制代码
            #region MyRegion
            private TestContext _testContext;
    
            public ValuesController(TestContext estContext)
            {
                _testContext = estContext;
            }
    
            [HttpGet]
            public string Get()
            {
                string reMsg = "无数据";
    
                //1先保存一个数据
                int num = 1;
                var getall = _testContext.User.Where(c => true).OrderByDescending(c => c.Id).FirstOrDefault();
                if (getall != null)
                {
                    num = getall.Id + 1;
                }
                _testContext.User.Add(new Models.User
                {
                    Id = num,
                    Name = "测试" + num,
                    Age = "2" + num
                });
                _testContext.SaveChanges(); 
    
                //2获取一个数据,然后返回
                if (getall != null)
                {
                    var get = _testContext.User.SingleOrDefault(c => c.Id == 1);
                    reMsg = get.Id + get.Name;
                }
              
                return (reMsg);
            }
            #endregion
    复制代码

    然后打开 程序包管理器空值台 输入代码迁移数据库

     在控制台输入以下代码【注意执行这段命令之前。先把 appsettings.json中连接数据库的 server=mysql  改成 server=localhost     因为mysql是项目发布到docker中使用。而localhost是在本地使用   如果这里不该。程序将连接不上数据库】

    #程序包管理器控制台
    Add-Migration Init/[自定义名称]
    Update-Database

     (update-database 代码太多,就不截全了)

    执行完毕之后可以看到数据库已经生成【本地通过navicat看】

    4】将创建的项目制作成镜像并且弄成容器运行

    1创建dockerfile文件并且发布项目

     由于使用的是vs编辑器。建议在vs上生成dockerfile

    右键项目,添加docker支持。然后弹出框中选择linux。将dockerfile文件修改好之后修改属性为 【始终支持】 然后发布项目

     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/core/aspnet:2.2-stretch-slim AS base
    #WORKDIR /app
    #EXPOSE 80
    #EXPOSE 443
    #
    #FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
    #WORKDIR /src
    #COPY ["dockerTs/dockerTs.csproj", "dockerTs/"]
    #RUN dotnet restore "dockerTs/dockerTs.csproj"
    #COPY . .
    #WORKDIR "/src/dockerTs"
    #RUN dotnet build "dockerTs.csproj" -c Release -o /app/build
    #
    #FROM build AS publish
    #RUN dotnet publish "dockerTs.csproj" -c Release -o /app/publish
    #
    #FROM base AS final
    #WORKDIR /app
    #COPY --from=publish /app/publish .
    #ENTRYPOINT ["dotnet", "dockerTs.dll"]
    
    
    FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
    WORKDIR /app 
    COPY . .
    EXPOSE 80
    EXPOSE 443 
    ENTRYPOINT ["dotnet", "WebApplication1.dll"]
    复制代码

    项目发布注意选择 【文件夹】格式    =》注意 发布的时候  appsettings.json中连接数据库的 server=localhost  改成 server=mysql  因为mysql是项目发布到docker中使用

     2将项目文件制作成镜像

     打开windowsPowerShell。cd到项目的发布文件地址

    然后创建镜像  运行下列代码

    docker build -t dockersample .

    【docker  build -t 镜像名称:版本号   .    】  注意.不要漏掉了

    【docker  build -t 镜像名称   .    】  注意.不要漏掉了

    3使用network方式创建容器连接

    在docker的容器中有link和network两种方式连接。考虑到link被docker放弃。这里就使用network

    3.1首先创建一个network

    docker network create -d bridge Mybridge
    # docker network create -d bridge   名称

    3.2 network创建完毕之后。就来创建容器(发布的.netCore项目)

    docker run -d -p 8002:80   --net Mybridge  --name  dockersampleRQ dockersample
    docker run -d -p 访问端口:程序设置带你看   --net network名称  --name  创建的容器名称 镜像名称

    3.3network桥接mysql容器

    docker network connect Mybridge  mysql      
    docker network connect   network Bridge方式创建的名称   要连接的数据库容器  

    3.4修改mysql名称

    因为之前发布的.netCore项目中appsettings.josn中连接的名称是 mysqlTS而mysql容器的名称是mysql所以,想让程序运行。需要修改一下mysql容器名称

    docker rename mysql mysqlTS   
    
    docker rename mysql容器名称    修改后名称

    访问8002端口就可以看见正常方位

    当然不能每次都去修改容器名称

    这里提供另外种方法就是通过vim去修改appsettings.josn文件

    4通过vim修改appsettings.josn文件

    4.1首先进入需要修改的容器

    docker exec -it  dockersampleRQ bash  
    docker exec -it  容器名称 bash  

     4.2安装vim

    依次输入

    apt-get update      
    回车
     apt-get install -y vim
    回车

     vim安装完毕之后,进入appsettings.josn文件

    vim  appsettings.json
    vim  文件名.后缀

    回车之后看见页面如图

    进入编辑状态需要进行以下操作

    先按ESC  然后按 i

    就可以进行编辑了

    编辑完毕之后

    先按ESC   
    冒号键 按 w  按 q  按 enter 键
    
    
    esc   :wq

    保存完毕之后,看看文件修改效果

     然后把项目的容器重启

     打开网页查看效果

    5】拓展 使用docker-compose.yml (2019-11-22更新)

    上面demo中使用的就两个容器,需要一个个部署生成,然后使用network桥接。比较麻烦。所以考虑使用docker-compose.yml取代上面手写一个个生成容器的办法。

    【docker-compose.yml建议使用vscode编辑器编写。】

    1准备阶段

    首先再docker准备需要的mysql镜像。我这里使用的是mysql5.7

     创建文件docker-compose.yml  【被注释的部分是磁盘映射,就是本机物理磁盘映射到docker上的位置。但是本机再设置docker  的shared drives时候一直失败,所以先跳过。正式发布文件就删除这个】

    复制代码
    version: '3'
    
    services:
     db:
      image: mysql:5.7
      container_name: mysqlYml
      command: mysqld --character-set-server=utf8  --collation-server=utf8_general_ci
      restart: always
      ports:
       - '3306:3306'
      environment:
        MYSQL_USER: qy       
        MYSQL_PASSWORD: Ee123  
        MYSQL_ROOT_PASSWORD: Ee123


    # volumes:
    # -/K/docker/beta/mysql-init:/docker-entrypoint-initdb.d

     web:
      build: .
      container_name: 'aspnetcore'
      ports:
        - "8003:80"
      depends_on:
        - db
    复制代码

     同时注意appsettings.josn的连接名也需要修改

     2开始创建容器

    首先cd到文件路径下

     2执行

    #1创建
    docker-compose build

      #2启动

      docker-compose up

     

     当所有执行完毕之后。查看镜像和容器

     这个时候访问8003依旧无法访问。原因是项目用的是codefirs。还么有进行数据迁移。而mysql也没有数据库

    3迁移数据库

     

    通过navicat查看

     最后刷新网页

    6】.netCore3.1codefirst 跟新

    .netCore 3.1

    mysql 8.0

    需要安装以下插件

    Pomelo.EntityFrameworkCore.MySql
    Microsoft.EntityFrameworkCore.Tools

    同时注意修改appsettings.json中的数据库连接方式

      "ConnectionStrings": {
        "MysqlUser": "server=localhost,3306;database=core3;userid=root;password=Ee123"
      }

    最后注意Startup.cs  =》ConfigureServices

     var connection = Configuration.GetConnectionString("MysqlUser");
                services.AddDbContext<MyDbContext>(options => options.UseMySql(connection));

  • 相关阅读:
    webpack 性能优化
    Bert模型实现垃圾邮件分类
    基于SKLearn的SVM模型垃圾邮件分类——代码实现及优化
    sklearn中,数据集划分函数 StratifiedShuffleSplit.split() 使用踩坑
    mysql5.7安装教程【转载】
    Postman 使用小技巧/指南
    如何知道 window 的 load 事件已经触发
    前端常用库 CDN
    使用 rollup 打包可按需加载的 NPM 包
    webpack 4 快速搭建
  • 原文地址:https://www.cnblogs.com/YzpJason/p/12099090.html
Copyright © 2011-2022 走看看