使用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
posted @ 2019-11-01 18:30  齐建伟  阅读(424)  评论(0编辑  收藏  举报