zoukankan      html  css  js  c++  java
  • 使用Docker-Compose编排发布.Net Core+Redis应用两个镜像到Docker

    对于刚刚完成的Alipay支的Demo, 我想要把它部署到Docker中去, 下面我来演示相关步骤.

    创建配置文件

    配置文件的重中之重是Dockerfile, 他的内容如下:

    # 第一部分是编译并发布项目
    # 以微软.Net Core SDK作为基础镜像, 并且以build作为别名
    FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
    # 切换build镜像工作目录到/app
    WORKDIR /app
    # 拷贝sln和csproj项目文件
    COPY *.sln .
    COPY AliPay/*.csproj ./AliPay/
    # Restore项目用到的包
    RUN dotnet restore
    # 拷贝项目文件到镜像里面相应到目录
    COPY AliPay/. ./AliPay/
    # 切换build镜像工作目录到/app/AliPay
    WORKDIR /app/AliPay
    # 以Release模式发布应用到out文件夹
    RUN dotnet publish -c Release -o out
    # 第二部分是启动项目
    # 以微软.Net Core运行环境作为基础镜像, 并且以runtime作为别名
    FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
    # 切换runtime镜像工作目录到/app
    WORKDIR /app
    # 把build镜像里面编译出来的文件拷贝到runtime镜像
    COPY --from=build /app/AliPay/out ./
    # 暴漏端口
    EXPOSE 8000
    # 启动应用
    # ENTRYPOINT ["dotnet", "AliPay.dll", "--server.urls", "http://*:8000"]
    ENTRYPOINT ["dotnet", "AliPay.dll"]
    

    还可以再多一个.dockerignore, 如下:

    bin
    obj
    

    打包镜像

    在创建了Dockerfile之后, 创建镜像将会很容易:

    docker build -t alipayimg .
    

    里面的两个参数:

    • -t: 指定要创建的目标镜像名
    • .: Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

    启动容器

    最后是启动镜像:

    docker run -d -p 8666:8000 --name alipay alipayimg
    

    参数说明:

    • -d: 镜像启动后在后台运行
    • -p 8666:8000: 端口的映射关系, 主机端口:容器端口
    • --name alipay: 启动容器的名字
    • alipayimg: 使用的镜像名

    编程总结

    一开始, 我按照网上的介绍, 一直使用如下命令指定端口:

    dotnet AliPay.dll --server.urls http://*:8000
    

    而它一直不起作用.

    Github上说需要添加Microsoft.Extensions.Configuration.CommandLine, 可是添加完了依然不起作用, 没办法, 最后只能在代码里把端口写死:

    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureAppConfiguration(config =>
            {
                config.AddJsonFile("alipay.json");
                // config.AddCommandLine(args);
            });
            webBuilder.UseUrls("http://*:8000");
            webBuilder.UseStartup<Startup>();
        });
    

    访问应用

    打开主机浏览器, 访问http://localhost:8666, 大功告成.

    Docker加强

    在之前的基础上, 我们继续使用docker-compose进行容器编排.

    移除容器和镜像

    因为要进行编排, 所以我们使用命令将之前创建的容器和镜像删掉:

    • 关闭容器:
    docker stop container_id[container_name]
    
    • 删除容器:
    docker rm container_id[container_name]
    # 注意: 如果没有停止容器直接删除会报错
    
    • 删除镜像:
    docker rm- image_id[image_name]
    # 注意: 如果没有删除容器而直接删除镜像会报错
    

    引进Redis

    如果是单个文件使用compose实际上意义不大, 所以我们引进Redis.

    引入类库

    首先使用nugget安装StackExchange.Redis.

    安装完成之后, 在Startup的ConfigureService添加内容如下:

    services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect("docker.myredis:6379"));
    

    改写代码

    修改HomeController如下:

    private readonly ILogger<HomeController> _logger;
    private readonly IConnectionMultiplexer _connectionMultiplexer;
    public HomeController(ILogger<HomeController> logger, IConnectionMultiplexer multiplexer)
    {
        _logger = logger;
        _connectionMultiplexer = multiplexer;
    }
    public IActionResult Index()
    {
        var db = _connectionMultiplexer.GetDatabase();
        var num = db.StringIncrement("count");
        ViewData["num"] = num;
        return View();
    }
    

    修改Home/Index的view如下:

    @{
        ViewData["Title"] = "Home Page";
    }
    <div class="text-center">
        <h1 class="display-4">Welcome, 您是当前 @ViewData["num"]  位访客, 更新1</h1>
        <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
    </div>
    

    添加编排文件

    在项目根目录添加docker-compose.yml, 内容如下:

    version: '3.0'
    services:
      alipay:
        container_name: alipay
        image: alipayimg
        build:
          context: .
          dockerfile: ./Dockerfile
        depends_on:
          - myredis
        links:
          - "myredis:docker.myredis"
        ports:
          - "8666:8000"
      myredis:
        container_name: myredis
        image: redis
    

    编排项目:

    docker-compose up --build -d
    
  • 相关阅读:
    浅析嵌入式程序设计中的优化问题
    TCP粘包问题
    使用python 批量 配对t检验 医学 基础研究 数据分析
    Ubuntu误删系统文件修复办法
    飞思卡尔powerpc交叉编译环境的
    ubuntu packege下载网址
    数组对象里面对日期进行排序
    c# 字符串以逗号分割属性加上单引号
    Vue mysql 变量赋值, 获取数组
    Element vue Select 下拉框默认
  • 原文地址:https://www.cnblogs.com/jerryqi/p/11778645.html
Copyright © 2011-2022 走看看