V květnu loňského roku bylo dělání věcí s ASP.NET a Dockerem v plenkách. Ale přišly skvělé věci. Napsal jsem blogový příspěvek ukazující, jak publikovat aplikaci ASP.NET 5 (v té době 5, nyní Core 1.0) na Docker. Později v prosinci 2015 nové nástroje jako Docker Toolbox a Kitematic vše ještě zjednodušily. V květnu 2016 Docker pro Windows Beta pokračoval v posouvání míče vpřed.
Chtěl jsem vidět, jak to vypadá s ASP.NET Core, Dockerem a Windows zde v říjnu 2016.
Nainstaloval jsem tyto věci:
- Komunita Visual Studio 2015
- Visual Studio 2015 Update 3
- ASP.NET Core s .NET Core
- .NET Core 1.0.1 – VS 2015 Tooling Preview 2
- Docker pro Windows (Použil jsem beta kanál)
- Nástroje Visual Studio pro Docker
Docker pro Windows je opravdu pěkný, protože automatizuje nastavení Hyper-V za vás a vytváří hostitelský OS Docker a vše zprovozňuje. To je velká úspora času.
Tady je můj hostitel Linuxu, o kterém opravdu nemusím přemýšlet. Vše udělám z příkazového řádku nebo ze sady Visual Studio.
Řeknu Soubor | Nový projekt a vytvoření nové aplikace ASP.NET Core běžící na .NET Core.
Poté kliknu pravým tlačítkem aPřidat | Podpora dockeru . Tato nabídka pochází z rozšíření Visual Studio Tools for Docker. To přidá základní soubor Dockerfile a některé soubory docker-compose. Po vybalení jsem připraven nasadit svou aplikaci ASP.NET Core do kontejneru Docker Linux.
ASP.NET Core v kontejneru Docker Linux
Počínaje svou aplikací ASP.NET Core se ujistím, že můj základní obraz (to je FROM v souboru Dockerfile) je základní obraz ASP.NET Core pro Linux.
FROM microsoft/aspnetcore:1.0.1
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
EXPOSE 80
COPY $source .
Dále, protože nechci, aby Docker zatím sestavoval moji aplikaci, zveřejním ji lokálně. Nezapomeňte si přečíst blogový příspěvek Steva Laskera „Vytváření optimalizovaných dockerových obrázků pomocí ASP.NET Core“, kde se dozvíte, jak nechat jeden kontejner dockeru sestavit vaši aplikaci a druhý ji spustit. To optimalizuje hustotu serveru a zdroje.
Publikuji, pak vytvořím obrázky a spustím to.
>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
A v Dockeru běží moje aplikace ASP.NET Core. Takže používám Windows, běžím Hyper-V, běžím na hostiteli Linuxu, který hostí kontejnery Docker.
Co ještě mohu udělat?
ASP.NET Core v kontejneru Docker Windows se systémem Windows Nano Server
Je zde Windows Server , je zde Windows Server Core který mimo jiné odstraňuje uživatelské rozhraní a je zde Windows Nano Server což způsobí, že Windows budou mít rády stovky mega místo mnoha koncertů. To znamená, že existuje mnoho skvělých možností v závislosti na tom, co potřebujete pro funkčnost a hustotu serveru. Odesílejte co nejméně.
Uvidím, jestli mohu spustit ASP.NET Core na Kestrel pod Windows Nano Server. Samozřejmě, protože Nano je velmi schopný, mohl bych spouštět IIS v kontejneru a jsou na to dokumenty.
Michael Friis z Dockeru má skvělý blogový příspěvek o sestavení a spuštění vašeho prvního Docker Windows Server Container. S novým Dockerem pro Windows na něj můžete kliknout pravým tlačítkem a přepínat mezi kontejnery Linux a Windows.
Nyní tedy používám Docker s kontejnery Windows. Možná nevíte, že pravděpodobně již máte kontejnery Windows! Byl dodán v rámci Windows 10 Anniversary Edition. Kontejnery můžete zkontrolovat v části Funkce:
Změním svůj Dockerfile tak, aby používal obraz Windows Nano Server. Pokud chci, mohu také ovládat porty, na kterých ASP.NET mluví, pomocí proměnné prostředí a vystavit ji v rámci Dockeru.
FROM microsoft/dotnet:nanoserver
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .
Pak zveřejním a postavím...
>dotnet publish
>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonnano
Pak to spustím a namapuji porty z Windows vně do kontejneru Windows uvnitř!
POZNÁMKA: V době psaní tohoto článku je chyba, která ovlivňuje, jak Windows 10 komunikuje s kontejnery prostřednictvím „NAT“ (Network Address Translation), takže nemůžete snadno přejít na http://localhost:82, jak byste chtěli (a já). Dnes musíte přímo trefit IP kontejneru. Jakmile se dozvím více o této chybě a jak se opravuje, podám zprávu. Jednoho dne se zobrazí ve Windows Update. Řešením je získat IP adresu kontejneru z dockeru takto:docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" HASH
AKTUALIZACE : Tato chyba byla opravena v dubnové aktualizaci Windows 10. Podrobnosti zde Přístup místního hostitele k portům kontejneru Windows
Spustím tedy svou aplikaci ASP.NET Core na Windows Nano Server (opět, aby bylo jasno, běží na Windows 10 a Nano Server je uvnitř kontejneru!)
>docker run -it -d -p 88:82 aspnetcoreonnano
afafdbead8b04205841a81d974545f033dcc9ba7f761ff7e6cc0ec8f3ecce215
>docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" afa
172.16.240.197
Teď můžu na ten web zasáhnout 172.16.240.197:82. Jakmile bude výše uvedená chyba opravena, bude zasažena a směrována jako každý kontejner.
Nejlepší na kontejnerech Windows je to, že jsou rychlé a lehké. Jakmile je obraz stažen a sestaven na vašem počítači, můžete je spouštět a zastavovat během několika sekund pomocí Dockeru.
ALE můžete také izolovat kontejnery Windows pomocí Dockeru takto:
docker run --isolation=hyperv -it -d -p 86:82 aspnetcoreonnano
Nyní tedy tato instance běží plně izolovaně v rámci samotného Hyper-V. Získáte to nejlepší ze všech světů. Rychlost a pohodlné nasazení plus volitelná a snadná izolace.
ASP.NET Core v kontejneru Windows Docker se systémem Windows Server Core 2016
Poté mohu změnit Dockerfile tak, aby používal úplný obraz jádra Windows Server. Toto je 8 koncertů, takže buďte připraveni, protože stažení a extrahování bude chvíli trvat, ale je to opravdu Windows. Můžete se také rozhodnout, zda to spustíte jako kontejner nebo jako izolovaný kontejner Hyper-V.
Zde jen změním FROM a získám Windows Sever Core s .NET Core v ceně.
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 .
POZNÁMKA: Slyšel jsem, že je pravděpodobné, že obrazy .NET Core na Windows Server Core pravděpodobně zmizí. Pro .NET Core dává větší smysl běžet na Windows Nano Server nebo jiných odlehčených obrazech. Server Core použijete na těžší věci a Server je pěkný, protože to znamená, že můžete spouštět „plné“ aplikace .NET Framework v kontejnerech! Pokud SKUTEČNĚ chcete mít .NET Core na Server Core, můžete si vytvořit svůj vlastní Dockerfile a snadno vytvořit a vytvořit image, který obsahuje věci, které chcete.
Poté publikuji, sestavím a znovu spustím.
>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
Protože se kontejnery spouštějí a zastavují tak rychle, mohu mít kompletní webovou farmu spuštěnou s Redis v kontejneru, SQL v jiném a můj webový zásobník ve třetím. Nebo kombinujte.
>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
Závěr
Znovu se podívejte na Michaelův článek, kde používá Docker Compose k vyvolání ukázky ASP.NET Music Store s SQL Express v jednom kontejneru Windows a ASP.NET Core v jiném, a také na blog Steva Laskera (ve skutečnosti je celý jeho blog zlatý). ) o vytváření optimalizovaných obrazů Docker pomocí ASP.NET Core.
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 poukazuje na řadu technik, které vám umožní vytěžit maximum z Dockeru a ASP.NET Core.
Výsledek toho všeho znamená (IMHO), že můžete používat ASP.NET Core:
- ASP.NET Core v systému Linux
- v kontejnerech Docker
- v libovolném cloudu
- ASP.NET Core v systémech Windows, Windows Server, Server Core a Nano Server.
- v kontejnerech oken Docker
- v rámci kontejnerů Hyper-V izolovaných Docker
To znamená, že si můžete vybrat úroveň podpory funkcí a velikost pro optimalizaci pro hustotu a pohodlí serveru. Jakmile budou všechny nástroje (dockery s Dockerem pro Windows a VS s Visual Studio Docker Tools) hotové, budeme mít pěkné ladění a pracovní postupy od vývojáře až po produkci.
Co jste dělali s Dockerem, kontejnery a ASP.NET Core? Vypněte zvuk v komentářích.
Sponzor: Díky Redgate tento týden! Objevte světově nejdůvěryhodnější nástroj pro porovnání SQL Serveru. Užijte si bezplatnou zkušební verzi SQL Compare, průmyslového standardu pro porovnávání a nasazování schémat SQL Server.