昨年の 5 月には、ASP.NET と Docker を使った作業はまだ始まったばかりでした。しかし、クールなものが進行中でした。 ASP.NET 5 (当時は 5、現在は Core 1.0) アプリを Docker に公開する方法を示すブログ記事を書きました。 2015 年 12 月後半、Docker Toolbox や Kitematic などの新しいツールにより、作業がさらに簡単になりました。 2016 年 5 月、Docker for Windows Beta は順調に前進を続けました。
2016 年 10 月に、ASP.NET Core、Docker、および Windows がどのようになっているのかを確認したかったのです。
これらのものをインストールしました:
- Visual Studio コミュニティ 2015
- Visual Studio 2015 Update 3
- .NET Core を使用した ASP.NET Core
- .NET Core 1.0.1 - VS 2015 ツール プレビュー 2
- Docker for Windows (ベータチャンネルを使用しました)
- Docker 用の Visual Studio ツール
Docker for Windows は、Hyper-V のセットアップを自動化し、Docker ホスト OS を作成してすべて実行できるため、非常に優れています。これにより、時間を大幅に節約できます。
特に考える必要のない Linux ホストがあります。コマンド ラインまたは Visual Studio からすべてを行います。
私はファイルと言うでしょう |新しいプロジェクトを作成し、.NET Core で実行される新しい ASP.NET Core アプリケーションを作成します。
次に、右クリックして 追加 | を追加します。 Docker サポート .このメニューは、Visual Studio Tools for Docker 拡張機能から取得されます。これにより、基本的な Dockerfile といくつかの docker-compose ファイルが追加されます。箱から出してすぐに、ASP.NET Core アプリを Docker Linux コンテナーにデプロイするためのすべてのセットアップが完了しました。
Docker Linux コンテナー内の ASP.NET Core
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 Lasker のブログ記事「Building Optimized Docker Images with ASP.NET Core」を必ず読んで、1 つの Docker コンテナーでアプリをビルドし、もう 1 つの Docker コンテナーでそれを実行する方法を学んでください。これにより、サーバーの密度とリソースが最適化されます。
公開し、イメージをビルドして実行します。
>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
そして、Docker で実行されている ASP.NET Core アプリがあります。そのため、私は Windows を実行し、Hyper-V を実行し、Docker コンテナーをホストする Linux ホストを実行しています。
他に何ができますか?
Windows Nano Server を実行する Docker Windows コンテナー内の ASP.NET Core
Windows Server があります 、 Windows Server Core があります 特にUIを削除し、 Windows Nano Server があります これにより、Windows は、多くのギグではなく、数百メガのようになります。これは、機能とサーバー密度に必要なものに応じて、多くの優れた選択肢があることを意味します.発送はできるだけ少なくしてください。
Windows Nano Server の Kestrel で ASP.NET Core を実行できるかどうか見てみましょう。確かに、Nano は非常に優れた機能を備えているため、コンテナー内で IIS を実行でき、それに関するドキュメントがあります。
Docker の Michael Friis は、最初の Docker Windows Server コンテナーの構築と実行に関する素晴らしいブログ投稿を行っています。新しい Docker for Windows を使用すると、それを右クリックするだけで、Linux と Windows コンテナーを切り替えることができます。
だから今、私は Windows コンテナーで Docker を使用しています。既に Windows コンテナーを使用している可能性があることに気付いていない可能性があります。 Windows 10 Anniversary Edition に同梱されています。機能でコンテナを確認できます:
Windows Nano Server イメージを使用するように Dockerfile を変更します。必要に応じて、環境変数を使用して ASP.NET が通信するポートを制御し、それを Docker 内で公開することもできます。
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" (ネットワーク アドレス変換) を介してコンテナーと通信する方法に影響を与えるバグがあり、あなた (および私) が望むように http://localhost:82 に簡単にアクセスできなくなります。今日は、コンテナの IP を直接ヒットする必要があります。このバグとそれがどのように修正されるかについて詳しく聞いたら、また報告します。いつかWindows Updateに表示されます。回避策は、次のように docker からコンテナーの IP アドレスを取得することです:docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" HASH
UPDATE : このバグは Windows 10 April Update で修正されました。詳細はこちら Windows コンテナ ポートへのローカルホスト アクセス
そこで、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 でそのサイトにアクセスできます。上記のバグが修正されると、他のコンテナと同様にヒットしてルーティングされます。
Windows コンテナーの最大の利点は、高速で軽量であることです。イメージがダウンロードされてマシンにビルドされたら、Docker を使用して数秒で開始および停止できます。
ただし、次のように Docker を使用して Windows コンテナーを分離することもできます。
docker run --isolation=hyperv -it -d -p 86:82 aspnetcoreonnano
そのため、このインスタンスは Hyper-V 自体内で完全に分離されて実行されています。あなたはすべての世界で最高のものを手に入れます。迅速で便利な展開に加えて、オプションで簡単に分離できます。
Windows Server Core 2016 を実行する Docker Windows コンテナー内の ASP.NET Core
その後、完全な Windows Server Core イメージを使用するように Dockerfile を変更できます。これは 8 ギガバイトなので、ダウンロードと解凍に少し時間がかかるので、準備ができている必要がありますが、これは実際には 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 Server Core イメージ上の .NET Core がなくなる可能性が高いと聞いています。 .NET Core を Windows Nano Server またはその他の軽量イメージで実行する方が理にかなっています。より重いものには Server Core を使用します。Server は、"完全な" .NET Framework アプリをコンテナーで実行できることを意味するため、優れています。本当に Server 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 スタックを 3 分の 1 で実行して、完全な 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
結論
繰り返しますが、Docker Compose を使用して ASP.NET Music Store サンプルを 1 つの Windows コンテナーで SQL Express を使用し、別のコンテナーで ASP.NET Core を作成している Michael の記事と、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 を使用する Docker 担当者と Visual Studio Docker Tools を使用する VS 担当者) が完成すると、開発から運用までの適切なデバッグとワークフローが得られます。
Docker、コンテナー、ASP.NET Core で何をしてきましたか?コメントで聞いてください。
スポンサー: 今週のRedgateに感謝します! 世界で最も信頼されている SQL Server 比較ツールを見つけてください。 SQL Server スキーマを比較および展開するための業界標準である SQL Compare の無料トライアルをお楽しみください。