對於剛剛完成的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 .
裏面的兩個參數:編程
最後是啓動鏡像:json
docker run -d -p 8666:8000 --name alipay alipayimg
參數說明:c#
一開始, 我按照網上的介紹, 一直使用以下命令指定端口:瀏覽器
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-compose進行容器編排.
由於要進行編排, 因此咱們使用命令將以前建立的容器和鏡像刪掉:
docker stop container_id[container_name]
docker rm container_id[container_name] # 注意: 若是沒有中止容器直接刪除會報錯
docker rm- image_id[image_name] # 注意: 若是沒有刪除容器而直接刪除鏡像會報錯
若是是單個文件使用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