使用Docker-Compose編排發佈.Net Core+Redis應用兩個鏡像到Docker

對於剛剛完成的Alipay支的Demo, 我想要把它部署到Docker中去, 下面我來演示相關步驟.html

建立配置文件

配置文件的重中之重是Dockerfile, 他的內容以下:
web

# 第一部分是編譯併發布項目
# 以微軟.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, 以下:redis

bin\
obj\

打包鏡像

在建立了Dockerfile以後, 建立鏡像將會很容易:docker

docker build -t alipayimg .

裏面的兩個參數:編程

  • -t: 指定要建立的目標鏡像名
  • .: Dockerfile 文件所在目錄,能夠指定Dockerfile 的絕對路徑

啓動容器

最後是啓動鏡像:json

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

參數說明:c#

  • -d: 鏡像啓動後在後臺運行
  • -p 8666:8000: 端口的映射關係, 主機端口:容器端口
  • --name alipay: 啓動容器的名字
  • alipayimg: 使用的鏡像名

編程總結

一開始, 我按照網上的介紹, 一直使用以下命令指定端口:瀏覽器

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

而它一直不起做用.bash

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
相關文章
相關標籤/搜索