翻譯-在10行代碼以內建立容器化的.net core應用

本文翻譯自Hans Kilian的文章linux

Creating a containerized .NET core application in less than 10 lines of codegit

https://medium.com/@hkkilian/creating-a-containerized-net-core-application-in-less-than-10-lines-of-code-567f4572ef01docker

Docker的一個優點是你能夠在別人的容器之上建立你本身的容器。在這片文章我將向你展現怎麼快速得建立一個包含.net core應用的docker容器。數據庫

咱們須要的僅僅只是一臺安裝了docker的機器,而且能鏈接上internet。c#

建立一個目錄而且在該目錄中建立一個文件「Dockerfile」。打開那個文件,粘貼一下的代碼行,而且保存。瀏覽器

FROM microsoft/dotnet:2.1-sdk AS build-env
WORKDIR /app
RUN dotnet new razor
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.1-aspnetcore-runtime-alpine
WORKDIR /app
COPY --from=build-env /app/out ./
ENTRYPOINT ["dotnet", "app.dll"]

在終端中執行命令 「docker build -t myapp .」app

這行命令從當前目錄的Dockerfile文件建立了一個docker鏡像而且給這個鏡像取了一個名字叫作「myapp」的標籤。asp.net

而後咱們就能夠經過輸入命令「docker run -d -p 80:80 myapp」運行這個容器化的應用了。less

而後當你打開你的瀏覽器而且導航到http://localhost/你將看到下面顯示的屏幕:工具

這是怎麼運行的呢?

上邊的那個Dockerfile指定了多級構建,包含有兩個部分,每一個部分四行。第一部分爲要運行的應用生成並編譯了源碼,第二部分把編譯好的應用打包進一個咱們能運行的容器中。多級構建在docker17.05中才開始有介紹,所以若是你要使用該特性的話你須要17.05或者更新的docker版本。

  • 第一行指出了咱們將基於微軟提供的.NET core 2.1 SDK來構建咱們想要的docker鏡像。咱們給.NET core 2.1 SDK取個別名「build-env」,這在後邊會用到。
  • 第二行中咱們建立了一個工做目錄「/app」。
  • 第三行中咱們在上邊建立的目錄中執行命令「dotnet new razor」,這行命令使用Razor pages建立了一個基本的asp.net應用程序所須要的全部的源代碼。
  • 第四行中咱們發佈上邊的應用到「out」目錄。全路徑是「/app/out」。「publish」命令足夠智能,它能夠在發佈以前自動還原所須要的Nuget包而且進行編譯。

Dockerfile中的最後四行將發佈了的應用程序打包進一個只包含.net core運行時環境的docker鏡像中。當咱們運行這個應用的時候徹底沒有必要包含整個的sdk。咱們想要運行的鏡像越小越好。

第一行咱們首先指定咱們想要開始構建一個跟上一個不同的docker鏡像。此次咱們將會使用基於包含了ASP.NET core運行時環境的Alpine linux分支開始構建。Alpine是一個很是小的linux發行版本,而且被普遍地使用與docker基礎鏡像中。

而後咱們再次建立了一個工做目錄「/app」,這跟第一次建立的「/app」不是同一個目錄,由於咱們如今正在構建一個新的docker鏡像。

而後咱們從第一個建立的鏡像中複製應用的文件。「--from=build-env」選項指定了咱們想要的是從第一個建立的鏡像中複製。咱們從第一個建立的鏡像中複製了全部的「/app/out」目錄下的文件到當前的目錄/app

而後咱們指定了容器的運行入口是dotnet 命令而且還要跟上參數「app.dll」。

當咱們運行這個鏡像的時候,咱們指定了幾個運行參數。第一個參數「-d」指定了該鏡像應該在後臺運行。第二個參數「-p 80:80」指定了容器中的80端口應該被映射到運行容器的機器的80端口上。若是你機器上的80端口被佔用了,你可使用其餘端口進行映射。好比你想映射到運行docker的機器的8080端口,你可使用「-p 8080:80」,而後你能夠經過「http://localhost:8080/」訪問該應用。無論你映射到機器上的哪一個端口,應用程序表現出來的是不變的,就像它一直使用的是80端口同樣。

你可使用docker命令「docker ps」查看當前運行的docker鏡像。

你也可使用「docker kill <name>」中止容器。

從這裏咱們將要進一步學習些什麼?

固然了這不是一個有用的示例。爲了讓示例更加接近實際,你能夠很容易地改變這個例子去容器化一個自定義的c#工程項目。假設你有一個子目錄「code」,其中含有你的項目源碼,你能夠替換「RUN dotnet new razor」 爲「COPY ./code/ ./」,僅僅就改變這一行,你就能夠構建你自定義的項目。或者你還能夠從使用「git clone」命令從git上拉取項目。

在docker容器中構建你的解決方案的另一個好處是你不須要擔憂你電腦上安裝的sdk的版本衝突。若是你想嘗試NET core 2.2 preview,你能夠很簡單地使用下邊的代碼來使用2.2 的SDK和2.2的 ASP.NET 運行時環境:

FROM microsoft/dotnet:2.2.100-preview3-sdk AS build-env
WORKDIR /app
RUN dotnet new razor
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.2.0-preview3-aspnetcore-runtime-alpine
WORKDIR /app
COPY --from=build-env /app/out ./
ENTRYPOINT [「dotnet」, 「app.dll」]

若是你不喜歡這樣的結果(2.2 preview如今彷佛沒有2.1好用),你不須要卸載任何的2.2的preview SDK,由於你的機器上歷來沒有安裝過它。2.2 SDK僅僅只是安裝在docker鏡像之中的,僅僅只是下載下來並無運行,除非你要求運行該鏡像的時候。

若是你想查看其餘的合適的.NET Docker鏡像,你能夠從這裏開始https://hub.docker.com/r/microsoft/dotnet/

我但願這篇文章能夠鼓勵你嘗試使用docker或者.NET core,若是你歷來沒有嘗試過的話。添加一個相似PostgreSQL 數據庫將會很是簡單,由於這裏已經有構建好的合適的docker鏡像可使用,你根本不須要任何的定製化。當你有多個須要相互之間進行通訊的容器的時候,docker-compose是一個很棒的工具,它可使用一個簡單的命令加速並接管控制多個容器。

相關文章
相關標籤/搜索