您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么在Linux和Windows的Docker容器中運行ASP.NET Core”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么在Linux和Windows的Docker容器中運行ASP.NET Core”吧!
我安裝了如下東西:
Visual Studio Community 2015
Visual Studio 2015 Update 3
ASP.NET Core with .NET Core
.NET Core 1.0.1 - VS 2015 Tooling Preview 2
Docker for Windows (我使用Beta通道)
Visual Studio Tools for Docker
Docker for Windows真的非常好,它可以自動為你配置好Hyper-V,創建一個Docker宿主OS,并啟動好這個虛擬機。節約了大量的時間。
這是我的Linux宿主,我無需太多關心它的情況。我將會通過命令行或Visual Studio來完成所有事情。
首先通過File | New Project來創建一個運行在.NET Core中的ASP.NET Core應用程序。
接著在項目名稱上點擊右鍵并選擇Add | Docker Support。這一菜單來自Visual Studio Tools for Docker擴展。這個步驟會添加基本的Dockerfile和其他docker-compose文件。通過這樣的開箱即用的步驟,我就完成了所有的配置從而能夠把ASP.NET Core應用程序部署到Docker Linux容器中。
從我這個ASP.NET Core應用當中,我們可以看到其使用的基礎鏡像(就是Dockerfile中的FROM語句)是Linux的ASP.NET Core鏡像。
FROM microsoft/aspnetcore:1.0.1
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
EXPOSE 80
COPY $source .
接下來,由于我不希望Docker編譯我的應用程序,只想發布到本地。可以閱讀Steve Laske的博客文章"Building Optimized Docker Images with ASP.NET Core"來了解如何在一個容器中構建應用程序而在其他容器中運行。這樣做優化了服務器的使用率和資源。
我將通過如下命令行指令來發布、構建鏡像并運行它。
>dotnet publish
>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonlinux
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonlinux latest dab2bff7e4a6 28 seconds ago 276.2 MB
microsoft/aspnetcore 1.0.1 2e781d03cb22 44 hours ago 266.7 MB
>docker run -it -d -p 85:80 aspnetcoreonlinux
1cfcc8e8e7d4e6257995f8b64505ce25ae80e05fe1962d4312b2e2fe33420413
>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cfcc8e8e7d4 aspnetcoreonlinux "dotnet WebApplicatio" 2 seconds ago Up 1 seconds 0.0.0.0:85->80/tcp clever_archimedes
到此,我的ASP.NET Core應用就可以運行在Docker中了。我們現在已經嘗試了一個Docker容器,它是托管在Windows中通過Hyper-V來運行的Linux宿主中。
我們還可以做點別的什么呢?
有這樣一種Windows Server,稱之為Windows Server Core,它刪除了UI相關的東西;有這樣一種Windows Server,稱之為Windows Nano Server,它讓Windows縮減到只有幾百M而不是幾G。這意味著從所需功能和服務器使用率的角度看,這是一個非常好的選擇,讓你部署的空間占用盡可能的小。
讓我來看一下我是否能把ASP.NET Core通過Kestrel【譯者注:ASP.NET Core的跨平臺Web服務器實現】運行到Windows Nano Server中。當然,由于Nano功能強大,我也能在這個容器中運行IIS,這里有文檔說明。
來自Docker公司的Michael Friis有一篇很棒的博客文章描述了在Windows Server容器中構建和運行Docker應用。在安裝了最新版的Docker for Windows之后,你就可以通過上下文菜單來在Linux和Windows容器間切換。
那么現在我就來用用Windows容器的Docker。你可能還不知道你已經擁有Windows容器了!它已經和Windows 10周年更版本一起發布了。你可以在Windows特性對話框中啟用容器功能:
我將修改一下Dockerfile來使用Windows Nano Server鏡像。我也可以在Docker內部通過環境變量和Expose命令來控制ASP.NET暴露的端口。
FROM microsoft/dotnet:nanoserver
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .
接著,我發布并構建……
>dotnet publish
>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonnano
然后,運行它,映射Windows外部端口到Windows容器內部!
注意:在Windows 10通過“NAT”(網絡地址轉換)來和容器通訊的時候,有一個Bug,你不能如你(我)所愿的那樣,直接通過 http://localhost:82 來訪問容器應用。你不得不通過容器本身的IP來訪問。一旦聽到這個Bug的更多消息和被修復的情況,我會及時公布在這里。它應該會通過Windows Update在幾天內出現。從Docker得到容器的IP地址的方法為:docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" HASH
那么,我將通過如下命令在Windows Nano Server中運行我的ASP.NET Core應用(再次說明一下,它將運行在Windows 10的Nano Server容器內)。
>docker run -it -d -p 88:82 aspnetcoreonnano
afafdbead8b04205841a81d974545f033dcc9ba7f761ff7e6cc0ec8f3ecce215
>docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" afa
172.16.240.197
現在,我可以通過172.16.240.197:82來訪問這個站點。一旦上面的Bug被修復后,我們就能像其他容器那樣訪問它了。
Windows容器的最美好的一面就是它非常快和輕量級。一旦鏡像被下載下來,在機器上構建好,那么你通過Docker來啟動和停止它們都是秒完成。
不過,你也可以通過如下命令來使用Docker隔離Windows容器:
docker run --isolation=hyperv -it -d -p 86:82 aspnetcoreonnano
如此一來,實例完全是通過Hyper-v本身來隔離運行的。你可以獲得世界上最好的東西:速度、方便的部署加上可選且便捷的隔離。
接下來,我把Dockerfile修改為使用完整的Windows Server Core鏡像。在下載安裝這個鏡像后,其占用大約8G的空間,需要花一點時間來下載和解壓,不過它確實是真正的Windows。你也可以選擇運行為一個容器或者隔離的Hyper-V容器。
這里,我通過修改FROM語句來使用包含了.NET Core的Windows Sever Core:
FROM microsoft/dotnet:1.0.0-preview2-windowsservercore-sdk
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .
注意:我聽說使用Windows Sever Core的.NET Core鏡像有可能會取消。因為讓.NET Core運行在Windows Nano Server或其他輕量級鏡像中更有意義。你應該把Sever Core用于那些更加笨重的應用。如果你真的需要運行在Sever Core的.NET Core,你可以制作自己的Dockerfile來輕易構建你所要的鏡像。
接下來,我將再次發布、構建和運行。
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonnano latest 7e02d6800acf 24 minutes ago 1.113 GB
aspnetcoreonservercore latest a11d9a9ba0c2 28 minutes ago 7.751 GB
由于容器能夠非常快的啟動和停止,所以我可以利用跑在容器中的Redis、一個SQL容器和包含其他部分的第三個容器來跑一個完整的Web集群。或者混合并配對。
>docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
d32a981ceabb aspnetcoreonwindows "dotnet WebApplicatio" 0.0.0.0:87->82/tcp compassionate_blackwell
a179a48ca9f6 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:86->82/tcp determined_stallman
170a8afa1b8b aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:89->82/tcp agitated_northcutt
afafdbead8b0 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:88->82/tcp naughty_ramanujan
2cf45ea2f008 a7fa77b6f1d4 "dotnet WebApplicatio" 0.0.0.0:97->82/tcp sleepy_hodgkin
再次,讓我們閱讀Michae的另外一篇文章,他使用Docker Compose來把ASP.NET Music Store示例跑在一個Windows容器中,而SQL Express跑在另外一個中,以及Steve Lasker的博客文章(實際上他的整篇文章都是金礦)中提到的為ASP.NET Core制作一個優化的Docker鏡像。
IMAGE ID RESPOSITORY TAG SIZE
0ec4274c5571 web optimized 276.2 MB
f9f196304c95 web single 583.8 MB
f450043e0a44 microsoft/aspnetcore 1.0.1 266.7 MB
706045865622 microsoft/aspnetcore-build 1.0.1 896.6 MB
Steve提到了大量的技巧,讓你可以解決Docker和ASP.NET Core在一起的大部分問題。
所有的一切意味著(IMHO),你可以把ASP.NET Core用在:
在Linux中跑ASP.NET Core
在Docker容器里面
在任何云平臺中
在Windows,、Windows Server、Server Core和Nano Server中跑ASP.NET Core
在Docker的Windows容器里面
在Docker的Hyper-V隔離容器里面
這意味著你可以選擇任意特性支持和為服務器使用率和便捷度優化過的尺寸大小。一旦所有的工具(Docker for Windows和Visual Studio Docker Tools)準備妥當,我們就能擁有良好的調試環境,和從開發到生產的工作流支持。
到此,相信大家對“怎么在Linux和Windows的Docker容器中運行ASP.NET Core”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。