原文:https://blogs.msdn.microsoft.com/dotnet/2018/06/13/using-net-and-docker-together-dockercon-2018-update/git
去年我寫了一篇關於 共同使用 .NET 和 Docker 的文章。隨着本週 DockerCon 2018 的開始,彷佛是一個更新的好時機。從上一篇文章以來,咱們啓用了一系列的 .NET Core 和 .NET Framework 嚮導和示例的 Docker 工做流,用於開發,CI/CD 和 生產。咱們也提供了更多的 Windows 和 Linux 的鏡像。若是你最近沒有關注 Docker 和 .NET,如今是一個好時機。github
在和 .NET 開發者對話中 Docker 和容器愈來愈多的被提到。它已經成爲許多人部署服務端應用程序的方式。因爲一致性和輕量級的主要優勢代替了虛擬機。在 DockerCon 的主題中,有多個 .NET 演示瞭如何應用 Docker 到現代應用和傳統架構的舊應用中。它使得經過微軟和 Docker 的工具封裝 .NET 應用更容易。docker
關於 .NET 容器鏡像的信息請看與.NET容器映像保持同步.緩存
嘗試 Docker架構
咱們維護了 .NET Core 和 .NET Framework 的示例倉庫。只需命令行中的幾個命令,就能夠用這些示例鏡像測試 Docker。app
最簡單的(支持大多數操做系統)是 .NET Core 控制檯應用示例。你只須要輸入如下命令:工具
docker run --rm microsoft/dotnet-samples
你也可嘗試其餘的示例,都是控制檯和 ASP.NET 應用:單元測試
如何使用 Docker測試
Docker 是靈活的,使你可以以多種不一樣的方式使用它。當採用 Docker 時主要有三種主要的方案須要考慮:ui
你能夠採用 Docker 來處理全部這些角色或者一個子集。從咱們所看到的,大多數開發者從生產場景開始,而後在他們發現有用的基礎架構採用更多的 Docker。這種處理是有意義的,選擇使用 Docker 一般用它來運行應用程序爲中心。
在 .NET 團隊,咱們在構建和測試代碼時已經大量的使用 Docker。高保真和即時啓動計算環境的價值很是高,例如,當你能夠能夠在幾秒鐘內啓動徹底正確的環境時,無需在 Debian 上推遲產品調查。
如下部分顯示了針對這三種方案的 .NET Core 和 .NET Framework 混合的示例。
使用二進制文件構建容器鏡像
在生產環境中運行 Docker 的主要需求是容器化應用程序。在現有的構建基礎結構中建立鏡像最簡單的方式是複製構建文件到鏡像裏。這個模型的主要價值是環境之間的一致性,好比 staging 環境和生產環境。
如下 Dockerfile 將當前目錄中的構建資產複製到基於 Docker Hub 上的 .NET Core 運行時鏡像的新鏡像。
FROM microsoft/dotnet:2.1-runtime WORKDIR /app COPY . . ENTRYPOINT ["dotnet","app.dll"]
如下命令經過上邊的 Dockerfile 建立了一個 app 的鏡像,假設命令在 Dockerfile 和 app.dll 所在的目錄運行:
docker build --pull -t app .
如下命令基於 app 鏡像建立了一個運行的容器:
docker run --rm app
注意:--rm 參數在容器結束後移除該容器。保持容器只有在你想調查爲何他們表現某一(不但願的)方式時。
使用源文件構建容器鏡像
Docker 使爲應用程序構建源文件並在一個步驟中生成容器鏡像變得容易。這也被稱爲多級構建。在容器內構建源文件的價值以下:
下邊的 Dockerfile 基於 Docker Hub 上的 .NET Framework SDK 鏡像從當前目錄複製源文件到新的鏡像。Dockerfile 命令使用 NuGet 和 MSBuild 來構建源代碼。將基於 .NET Framework 運行時鏡像的二進制文件在構建階段複製到一個新鏡像。構建階段鏡像被丟棄。所選的鏡像名稱僅用於從最後階段生成的鏡像。
上邊的第二部分是 Docker 閃光的地方。Docker 中的每個命令建立 Docker 鏡像中的不一樣的層。若是 Docker 發現給定層的輸入沒有改變,那麼後續 Docker 的構建不會從新構建該層。第二部分複製了 msbuild 資產,好比項目文件,而後運行 nuget 恢復。若是 msbuild 資產沒有改變,則跳過執行恢復。這樣最終節省了大量時間。它也解釋了爲何 Dockerfile 編寫的方式。
接下來的命令使用上邊的 Dockerfile 建立了一個 aspnetapp 的新鏡像,假設該命令是從 Dockerfile 和 源文件所在的目錄運行的:
docker build --pull -t aspnetapp .
例如,若是 Docker Hub 上存在 --pull 參數會拉取新的 microsoft/dotnet-framework 鏡像,這個參數會花費更長的時間(若是沒有新的鏡像存在)在每次 docker 構建,但要保持最新環境。從長遠來看,最新的方法是很是有用的,由於它使你的環境於沒有緩存鏡像的環境保持同步。
下邊的命令建立了一個基於 aspnetapp 鏡像的容器:
docker run --rm -it -p 8000:80 aspnetapp
-p 參數把主機端口映射到 Docker 客戶端端口。
更多用 Docker 構建源代碼的信息請參考下面的示例:
用 Docker 測試二進制文件
測試場景展現了 Docker 的價值,由於當測試環境和目標環境保持高度一致時測試具備更多價值。假設你的應用支持多個操做系統或操做系統版本。你能夠在他們每個的 Docker 中測試你的應用。它很容易作到而且很是有價值。
到目前爲止,在本篇文章中你看到有運行命令的 Dockerfile ,它描述了須要用 Docker 構建執行的邏輯以及用 Docker 運行的最終結果。經過 Docker 構建運行測試做爲早期反饋是有用的,主要是經過打印到控制檯/終端的經過/失敗結果。這種模型能夠很好的用於測試,可是有兩個緣由規模不大:
使用 docker 運行測試時一個很好的選擇,由於它不受這兩個挑戰的任何一個的影響。使用 docker 構建測試頗有用,假如測試失敗你也想讓你的構建失敗。本文檔中的說明展現瞭如何使用 docker 運行測試。
下面的 Dockerfile 在正常使用中與上面看到的 .NET Framework 相似。而後,這其中包含了一些技巧來實現測試。包括一個一般很是接近 no-op testrunner 階段,但這對測試很是有用。
爲了測試,建立一個 testrunner 階段鏡像,這將包括全部內容構建成一點。結果鏡像是基於 .NET Core SDK 鏡像的,包括全部 .NET Core 測試基礎設施。這個 Dockerfile 的訣竅在於 testrunner 階段提供了一個替代的 ENTRYPOINT,調用 dotnet 測試來啓動測試。若是你一直經過運行 Dockerfile (不針對特定的階段),那麼第一個 ENTRYPOINT 會被最後一個替換,這是應用程序的 ENTRYPOINT。
下面的命令建立一個 dotnetapp:test 的新鏡像,使用上面的 Dockerfile 只限構建和包括 testrunner 階段,假設命令是從 Dockerfile 和 源文件目錄運行的:
docker build --pull --target testrunner -t dotnetapp:test .
爲了在本地機器上手機測試日誌,須要使用 volume 安裝。簡而言之,你能夠將你機器上的目錄做爲統一目錄導入容器中。 Volume 安裝是一種獲取容器內或從容器輸出很好的方法。
下面的命令基於 dotnetapp:test 建立了一個容器。volume 將 C:\app\TestResults 本地目錄安裝到應用中的 /app/tests/TestResults。本地目錄必須已經存在,而且 C 盤必須共享給 Docker。
docker run --rm -v C:\app\TestResults:/app/tests/TestResults dotnetapp:test
運行命令後,你應該在 C:\app\TestResults 文件中看到 .trx 文件。
用 Docker 運行 .NET Core 單元測試 顯示瞭如何在容器中進行更詳細的測試。包括 Windows,macOS 和 Linux。還包括本節中描述的管理測試工做流的腳本。
在容器中開發
以上場景關注於生成或驗證容器鏡像。Docker 的使用能夠進一步向上游發展。
Visual Studio 容許在容器中進行開發。你能夠添加 Dockerfile 到一個 .NET 項目中,Windows 容器或者 Linux 容器。經驗幾乎是無縫的。很難說你在使用 Docker,就像你在下面的圖片中看到的同樣。
你還能夠在命令行的容器內開發。.NET Core SDK 鏡像包含了不少功能,你能夠建立一個 Dockerfile 來絕不費力的使用它。事實上,你能夠經過命令行運行,構建或者測試你的應用程序。
在容器中開發 ASP.NET Core 應用程序說明了如何經過 Docker 構建和從新構建 ASP.NET Core 應用程序,例如你能夠在本地機器上在本地機器上從 Visual Studio Code 中編輯他們。
下面的命令行經過 dotnet 宿主一個 ASP.NET Core 應用程序守候在 macOS 或者 Linux 上。在容器中開發 ASP.NET Core 應用程序中Windows 說明是可用的。每次在本地機器上編輯和保存應用程序時,它將在容器中從新構建。我歷來沒有試過連續1000次這樣作,可是你極可能作到。此方案依賴於 volume 安裝,將本地化的源代碼投影到正在運行的容器中。正如你所見,經過編寫 Dockerfile 來實現 volume 安裝是一個強有力的選擇。
docker run --rm -it -p 8000:80 -v ~/git/aspnetapp:/app/ -w /app/aspnetapp microsoft/dotnet:2.1-sdk dotnet watch run
有關 .NET Core 控制檯應用程序的相似指令請參見在容器中開發 .NET Core 應用程序。
ASP.NET Core 和 HTTPS
用 HTTPS 來託管 Web 應用程序時很中亞哦的。在許多狀況下,在到達 ASP.NET Core 站點前會種終止 HTTPS 請求。在 ASP.NET Core 須要直接處理 HTTPS 流量的狀況而且在容器中運行你的站點時,則須要一個解決方案。
經過 HTTPS 在 Docker 中託管 ASP.NET Core 鏡像描述瞭如何用 HTTPS 來託管咱們的 ASP.NET Core 樣品鏡像。所描述的模型很是相似於如何用你本身的證書來託管本身的鏡像。
如下命令可用於在 Windows 上使用 Linux 容器運行 dev 證書的 ASP.NET Core 示例鏡像:
dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p crypticpassword
dotnet dev-certs https --trust
docker pull microsoft/dotnet-samples:aspnetapp
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_Kestrel__Certificates__Default__Password="crypticpassword" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v %USERPROFILE%\.aspnet\https:/https/ microsoft/dotnet-samples:aspnetapp
在 Docker 中經過 HTTPS 指令託管 ASP.NET Core 鏡像能夠用在 Windows,macOS 和 Linux 上。
結尾
你可能會發現咱們在一塊兒使用 .NET 和 Docker 的方法上比咱們在最初2017的主題文章中走的更遠。咱們遠沒有完成全部能夠想象的容器控件,但已經爲你提供了一個更完整的基礎做爲你採用 Docker 的使用。