前面谎碍,已經(jīng)在Linxu上對.Net Core兽叮、Nginx萄喳、Docker分別簡單的做了入門demo的練習(xí)卒稳,這篇文章是為的就是能把前面這些東西串起來運(yùn)用,感受一下容器化應(yīng)用從創(chuàng)建他巨、發(fā)布充坑、部署到用戶訪問的大體步驟,順便復(fù)習(xí)一下步驟闻蛀,鞏固理解匪傍。
正文開始。
1. 新建一個解決方案
前面一篇體驗(yàn).Net Core 應(yīng)用的demo里面都是直接新建的項(xiàng)目觉痛,用過宇宙第一IDE VS的同學(xué)應(yīng)該知道解決方案與項(xiàng)目關(guān)系役衡,簡單來說就是:一個解決方案可以包含多個項(xiàng)目。
新建一個目錄dotnet-docker用來專門存放解決方案薪棒,進(jìn)入后再新建一個解決方案目錄dockermvc手蝎,最后進(jìn)入解決方案目錄,分別新建解決方案和mvc項(xiàng)目:
這里和Visual Studio有所區(qū)別俐芯,VS里新建一個解決方案會同時新建一個解決方案文件夾和一個解決方案文件棵介,項(xiàng)目也是。但此處命令行 只會幫你新建文件吧史,不會新建目錄(Linux里習(xí)慣稱文件夾為目錄)邮辽,所以需要自己建,不然目錄結(jié)構(gòu)混亂
$ mkdir dotnet-docker
$ cd dotnet-docker
$ mkdir dockermvc
$ cd dockermvc
$ dotnet new sln
$ dotnet new mvc
敲完之后,利用ls
命令查看一下目錄內(nèi)容:
ls
解決方案目錄下分別是 解決方案文件 和 項(xiàng)目目錄,項(xiàng)目目錄下的文件內(nèi)容與前面一文的Core mvc的demo一模一樣
2. 添加Docker配置文件
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.sln .
COPY dockermvc/*.csproj ./dockermvc/
RUN dotnet restore
# copy everything else and build app
COPY dockermvc/. ./dockermvc/
WORKDIR /app/dockermvc
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime
WORKDIR /app
COPY --from=build /app/dockermvc/out ./
ENTRYPOINT ["dotnet", "dockermvc.dll"]
3. 將.Net Core應(yīng)用打包成Docker可以加載的鏡像
-t mydockermvc:1.0
表示生成名為mydockermvc且標(biāo)簽為1.0的docker鏡像吨述,最后面有個 **.**
表示當(dāng)前目錄
docker build -t mydockermvc:1.0 .
構(gòu)建鏡像成功如下:
中間省略一部分程序集初始化...
4. 運(yùn)行剛剛Core應(yīng)用生成的docker鏡像
沒有啟動docker時岩睁,Nginx服務(wù)雖然在監(jiān)聽80端口,但是沒有服務(wù)響應(yīng)內(nèi)容揣云,所以出現(xiàn)訪問失敗捕儒。
運(yùn)行docker鏡像mydockermvc:1.0 并命名運(yùn)行鏡像成功后的容器名為: mymvcdockerimgae
docker run -it --rm -p 5000:80 --name mymvcdockerimgae mydockermvc:1.0
-p 5000:80
是指定容器內(nèi)部使用網(wǎng)絡(luò)端口80 并且映射到我們使用主機(jī)上的5000端口,外網(wǎng)通過80端口的請求到了服務(wù)器主機(jī)邓夕。
所以整個請求流程是:外部訪問默認(rèn)80端口后刘莹,Nginx通過 讀取我們的自定義配置文件 將80端口的請求轉(zhuǎn)交到本主機(jī)的5000端口,請求到了5000端口焚刚,通過docker容器設(shè)置的映射關(guān)系点弯,請求繼續(xù)轉(zhuǎn)交到映射到了5000端口的mymvcdockerimgae容器,容器再在內(nèi)部讓與5000端口映射對應(yīng)的80端口服務(wù)程序響應(yīng)矿咕。
運(yùn)行鏡像后外部訪問Linux主機(jī)IP:
容器內(nèi)部端口可自行指定蒲拉,如10002-p 5000:10002
,但本例中 core程序默認(rèn)跑的是80端口痴腌,所以代碼得修改:
vi dotnet-docker/dockermvc/dockermvc/Program.cs
更新代碼為:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
namespace dockermvc
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseUrls("http://*:10002") //多一行指定端口的代碼
.Build();
}
}
重新生成鏡像:
$ docker build -t mydockermvc:2.0 .
運(yùn)行新生成的鏡像:
$ docker run -it --rm -p 5000:10002 --name mymvcdockerimgae mydockermvc:2.0
外網(wǎng)測試可以看到仍然可以訪問。