Windows コンテナーとして既存の .NET アプリを展開するDeploy existing .NET apps as Windows containers

Windows コンテナーに基づく展開は、クラウド向けに最適化されたアプリケーションやクラウドネイティブ アプリケーションに適用できます。Deployments that are based on Windows Containers are applicable to Cloud-Optimized applications and Cloud-Native applications.

ただし、このガイド (特に以降のセクション) では、主として、アプリケーションを再設計する必要のない "クラウド向けに最適化されたアプリケーション" での Windows コンテナーの使用に重点を置いています。However, in this guide and especially in the following sections, it mostly focuses on using Windows Containers for Cloud-Optimized applications where you don't need to rearchitect your application.

コンテナーとはWhat are containers? (Linux または Windows)(Linux or Windows)

コンテナーとは、アプリケーションをそれ独自の分離パッケージにラップする方法です。Containers are a way to wrap up an application into its own isolated package. コンテナー内のアプリケーションは、コンテナーの外部に存在するアプリケーションやプロセスの影響を受けません。In its container, the application is not affected by applications or processes that exist outside of the container. アプリケーションがプロセスとして正常に実行するために依存するすべてのものは、コンテナー内にあります。Everything the application depends on to run successfully as a process is inside the container. コンテナーが移動する場所がどこであっても、アプリケーションの要件は、直接的な依存関係の観点から常に満たされます。これは、実行に必要なすべてのもの (ライブラリの依存関係やランタイムなど) がアプリケーションにバンドルされているためです。Wherever the container might move, the requirements of the application will always be met, in terms of direct dependencies, because it is bundled with everything that it needs to run (library dependencies, runtimes, and so on).

コンテナーの主な特徴は、コンテナー自体に必要なすべての依存関係が付属しているために、さまざまな展開にわたり同じ環境が確保されるということです。The main characteristic of a container is that it makes the environment the same across different deployments because the container itself comes with all the dependencies it needs. ご利用のコンピューター上でアプリケーションをデバッグしてから、同じ環境が保証されている別のコンピューターに展開することができます。You can debug the application on your machine, and then deploy it to another machine, with the same environment guaranteed.

コンテナーは、コンテナー イメージのインスタンスです。A container is an instance of a container image. コンテナー イメージとは、(スナップショットのように) アプリやサービスをパッケージ化してから、信頼性が高く、再現可能な方法で展開する方法です。A container image is a way to package an app or service (like a snapshot), and then deploy it in a reliable and reproducible way. Docker はテクノロジであるだけでなく、哲学やプロセスでもあると言うことができます。You could say that Docker is not only a technology-it's also a philosophy and a process.

コンテナーが日常的に使用されるようになるにつれて、コンテナーは業界全体の "展開の単位" になりつつあります。As containers daily become more common, they are becoming an industry-wide "unit of deployment."

コンテナーの利点 (Linux または Windows 上の Docker エンジン)Benefits of containers (Docker Engine on Linux or Windows)

コンテナー (軽量な構成要素として定義されている場合もあります) を使用してアプリケーションをビルドすると、インフラストラクチャ全体で任意のアプリケーションをビルド、配布、実行するための機敏性が大幅に向上します。Building applications by using containers-which also might be defined as lightweight building blocks-offers a significant increase in agility for building, shipping, and running any application, across any infrastructure.

コンテナーを使用すると、Microsoft 開発者ツール、オペレーティング システム、およびクラウド全体にわたる Docker 統合により、コードをほとんどまたはまったく変更せずに、開発から運用まで任意のアプリを利用できます。With containers, you can take any app from development to production with little or no code change, thanks to Docker integration across Microsoft developer tools, operating systems, and the cloud.

プレーン VM に展開する場合、ご利用の VM に ASP.NET アプリを展開するための所定の方法が既に用意されているはずです。When you deploy to plain VMs, you probably already have a method in place for deploying ASP.NET apps to your VMs. ただし、その方法には、Puppet などの展開ツールまたは同様のツールを使用して、手動による複数の手順または複雑な自動化プロセスが必要である可能性があります。It's likely, though, that your method involves multiple manual steps or complex automated processes by using a deployment tool like Puppet, or a similar tool. 場合によっては、構成項目の変更、サーバー間でのアプリケーション コンテンツのコピー、.msi セットアップに基づく対話型セットアップ プログラムの実行などのタスクを行い、その後でテストを実行する必要があります。You might need to perform tasks like modifying configuration items, copying application content between servers, and running interactive setup programs based on .msi setups, followed by testing. 展開でのそのようなすべての手順を行うと、展開にかかる時間が長くなりリスクが増えます。All those steps in the deployment add time and risk to deployments. ターゲット環境に依存関係が存在しない場合は必ずエラーが発生します。You will get failures whenever a dependency is not present in the target environment.

Windows コンテナーでは、アプリケーションをパッケージ化するプロセスが完全に自動化されています。In Windows Containers, the process of packaging applications is fully automated. Windows コンテナーは、コンテナーの展開に対して自動更新およびロールバックを行うことができる Docker プラットフォームに基づいています。Windows Containers is based on the Docker platform, which offers automatic updates and rollbacks for container deployments. Docker エンジンを使用することで得られる主な改善点は、ご利用のアプリケーションとその依存関係をすべて含むスナップショットのようなイメージを作成できることです。The main improvement you get from using the Docker engine is that you create images, which are like snapshots of your application, with all its dependencies. このイメージは Docker イメージです (この場合は Windows コンテナー イメージ)。The images are Docker images (a Windows container image, in this case). イメージでは、ソース コードに戻ることなく、コンテナー内で ASP.NET アプリが実行されます。The images run ASP.NET apps in containers, without going back to source code. コンテナーのスナップショットが展開の単位となります。The container snapshot becomes the unit of deployment.

組織の多くは、次の理由により、既存のモノリシック アプリケーションをコンテナー化しています。Many organizations are containerizing existing monolithic applications for the following reasons:

  • 改善された展開によるリリースの機敏性Release agility through improved deployment. コンテナーにより、開発と運用の間で一貫した展開コントラクトが得られます。Containers offer a consistent deployment contract between development and operations. コンテナーを使用すると、"自分のマシンでは動作するのに運用環境で動作しないのはなぜだ" と言う開発者の言葉を聞くことはありません。When you use containers, you won't hear developers say, "It works on my machine, why not in production?" 彼らは "コンテナーとして実行されているので、運用環境でも実行される" と言うことができます。They can say, "It runs as a container, so it will run in production." パッケージ化されたアプリケーションは、そのすべての依存関係と共に、サポートされている任意のコンテナーベースの環境で実行することができます。The packaged application, with all its dependencies, can be executed in any supported container-based environment. すべての展開ターゲット (開発、QA、ステージング、運用) での実行を意図した方法で実行されます。It will run the way it was intended to run in all deployment targets (dev, QA, staging, production). コンテナーでは、あるステージから次のステージに移行するときにほとんどの摩擦が排除されるため、展開が大幅に改善され、より迅速に配布できるようになります。Containers eliminate most frictions when they move from one stage to the next, which greatly improves deployment, and you can ship faster.

  • コスト削減Cost reductions. コンテナーでは、既存のハードウェアの統合と削除によって、またはハードウェア単位ごとのより高い密度でのアプリケーションの実行により、コスト削減がもたらされます。Containers lead to lower costs, either by the consolidation and removal of existing hardware, or from running applications at a higher density per unit of hardware.

  • 移植性Portability. コンテナーはモジュール式で移植可能です。Containers are modular and portable. Docker コンテナーは、任意のサーバー オペレーティング システム (Linux および Windows)、任意のメジャー パブリック クラウド (Microsoft Azure、Amazon AWS、Google、IBM)、およびオンプレミス環境とプライベートまたはハイブリッドのクラウド環境でサポートされています。Docker containers are supported on any server operating system (Linux and Windows), in any major public cloud (Microsoft Azure, Amazon AWS, Google, IBM), and in on-premises and private or hybrid cloud environments.

  • 制御Control. コンテナーでは、コンテナー レベルで制御される柔軟で安全な環境が実現されます。Containers offer a flexible and secure environment that's controlled at the container level. コンテナーに対して実行制約ポリシーを設定することで、コンテナーをセキュリティで保護し、分離し、さらに制限することができます。A container can be secured, isolated, and even limited by setting execution constraint policies on the container. Windows コンテナーに関するセクションで詳述したように、Windows Server 2016 と Hyper-V コンテナーには、追加のエンタープライズ サポート オプションが用意されています。As detailed in the section about Windows Containers, Windows Server 2016 and Hyper-V containers offer additional enterprise support options.

コンテナーを使用してアプリケーションを開発および管理すると、機敏性、移植性、および制御が大幅に改善され、最終的には大幅なコスト削減につながります。Significant improvements in agility, portability, and control ultimately lead to significant cost reductions when you use containers to develop and maintain applications.

Docker についてWhat is Docker?

Docker とは、クラウドまたはオンプレミスで実行できる移植可能な自己完結型のコンテナーとしてアプリケーションの展開を自動化するオープン ソース プロジェクトです。Docker is an open-source project that automates the deployment of applications as portable, self-sufficient containers that can run in the cloud or on-premises. Docker は、このテクノロジを促進および進化させる会社でもあります。Docker is also a company that promotes and evolves this technology. この会社は、Microsoft を含む、クラウド、Linux、Windows の各ベンダーとの共同作業を行っています。The company works in collaboration with cloud, Linux, and Windows vendors, including Microsoft.

Docker によってハイブリッド クラウドにコンテナーが展開される方法を示す図。

図 4-6Figure 4-6. Docker は、ハイブリッド クラウドのすべてのレイヤーでコンテナーを展開します。Docker deploys containers at all layers of the hybrid cloud

仮想マシンを使い慣れているユーザーにとって、コンテナーは非常に似ているように見えるかもしれません。To someone familiar with virtual machines, containers might appear to be remarkably similar. 物理または仮想コンピューター システムと同様に、コンテナーではオペレーティング システムが実行され、ファイル システムが用意されており、コンテナーにはネットワーク経由でアクセスできます。A container runs an operating system, has a file system, and can be accessed over a network, just like a physical or virtual computer system. ただし、コンテナーの背後にあるテクノロジおよび概念は仮想マシンとは大きく異なります。However, the technology and concepts behind containers are vastly different from virtual machines. 開発者の観点から見ると、コンテナーはむしろ 1 つのプロセスのように扱う必要があります。From a developer point of view, a container must be treated more like a single process. 実際、コンテナーには 1 つのプロセス用の単一のエントリ ポイントがあります。In fact, a container has a single entry point for one process.

Docker コンテナー (簡単にする場合は、"コンテナー") は、Linux と Windows 上でネイティブに実行できます。Docker containers (for simplicity, containers) can run natively on Linux and Windows. 通常のコンテナーを実行する場合、Windows コンテナーは Windows ホスト (ホスト サーバーまたは VM) 上でのみ実行でき、Linux コンテナーは Linux ホスト上でのみ実行できます。When running regular containers, Windows containers can run only on Windows hosts (a host server or a VM), and Linux containers can run only on Linux hosts. ただし、最新バージョンの Windows Server コンテナーおよび Hyper-V コンテナーでは、現在 Windows Server コンテナーでしか使用できない Hyper-V による分離テクノロジを使用することで、Linux コンテナーを Windows Server 上でネイティブに実行することもできます。However, in recent versions of Windows Server and Hyper-V containers, a Linux container can also run natively on Windows Server by using the Hyper-V isolation technology that currently is available only in Windows Server Containers.

近い将来、Linux コンテナーと Windows コンテナーの両方が混在する環境が可能になり、さらには一般的になります。In the near future, mixed environments that have both Linux and Windows containers will be possible and even common.

既存の .NET アプリケーションに対する Windows コンテナーの利点Benefits of Windows Containers for your existing .NET applications

Windows コンテナーを使用することの利点は、一般にコンテナーから得られる利点と基本的に同じです。The benefits of using Windows Containers are fundamentally the same benefits you get from containers in general. Windows コンテナーを使用すれば、機敏性、移植性、および制御が大幅に向上します。Using Windows Containers is about greatly improving agility, portability, and control.

既存の .NET アプリケーションは、.NET Framework を使用して作成されたアプリケーションを参照します。Existing .NET applications refer to those applications that were created using the .NET Framework. たとえば、それらが従来の ASP.NET Web アプリケーションである場合、より新しく、Linux、Windows、および MacOS に対してクロスプラットフォームで実行される .NET Core や .NET 5.0 は使用されません。For example, they might be traditional ASP.NET web applications-they don't use .NET Core or .NET 5.0, which is newer and runs cross-platform on Linux, Windows, and MacOS.

.NET Framework 内の主な依存関係は Windows です。The main dependency in the .NET Framework is Windows. また、IIS や、従来の ASP.NET の System.Web などの、セカンダリの依存関係もあります。It also has secondary dependencies, like IIS, and System.Web in traditional ASP.NET.

.NET Framework アプリケーションは、Windows 上で実行する必要があります。A .NET Framework application must run on Windows, period. 既存の .NET Framework アプリケーションをコンテナー化したいが、.NET Core 以上への移行には投資できない、あるいはしたくない場合 ("正常に動作している場合は移行しないでください")、コンテナーに対する唯一の選択肢は Windows コンテナーを使用することです。If you want to containerize existing .NET Framework applications and you can't or don't want to invest in a migration to .NET Core or later("If it works properly, don't migrate it"), the only choice you have for containers is to use Windows Containers.

したがって、Windows コンテナーの主な利点の 1 つは、Windows 上で実行されている既存の .NET Framework アプリケーションをコンテナー化を使用して最新化する方法を得られるということです。So, one of the main benefits of Windows Containers is that they offer you a way to modernize your existing .NET Framework applications that are running on Windows-through containerization. 最終的に、Windows コンテナーでは、コンテナーを使用することで、期待している利点 (機敏性、移植性、およびより優れた制御) が得られます。Ultimately, Windows Containers gets you the benefits that you are looking for by using containers-agility, portability, and better control.

NET ベースのコンテナーでターゲットとする OS を選択するChoose an OS to target with .NET-based containers

Docker でサポートされているオペレーティング システムの多様性に加えて、.NET Framework と .NET Core の違いを考慮し、使用しているフレームワークに基づいて特定の OS と特定のバージョンをターゲットにする必要があります。Given the diversity of operating systems that are supported by Docker, as well as the differences between .NET Framework and .NET Core, you should target a specific OS and specific versions based on the framework you are using.

Windows の場合、Windows Server Core または Windows Nano Server を使用できます。For Windows, you can use Windows Server Core or Windows Nano Server. これらの Windows バージョンは、.NET Framework または .NET アプリケーションで必要とされる可能性があるさまざまな特性を備えています (IIS と、Kestrel のような自己ホスト型 Web サーバーのように)。These Windows versions provide different characteristics (like IIS versus a self-hosted web server like Kestrel) that might be needed by .NET Framework or .NET applications.

Linux の場合、複数のディストリビューションを利用できます。また、Linux は公式の .NET Docker イメージ (Debian など) でサポートされています。For Linux, multiple distros are available and supported in official .NET Docker images (like Debian).

図 4-7 に、.NET Framework のアプリのバージョンに応じてターゲットにすることができる OS バージョンを示します。Figure 4-7 shows OS versions that you can target, depending on the app's version of the .NET Framework.

.NET Framework のバージョンに基づいてターゲットにする OS を示す図。

図 4-7Figure 4-7. .NET Framework のバージョンに基づいてターゲットにするオペレーティング システムOperating systems to target based on .NET Framework version

.NET Framework アプリケーションに基づいた既存のアプリケーションまたはレガシ アプリケーションの移行シナリオでは、主な依存関係は Windows と IIS にあります。In migration scenarios for existing or legacy applications that are based on .NET Framework applications, the main dependencies are on Windows and IIS. 唯一のオプションは、Windows Server Core と .NET Framework に基づいた Docker イメージを使用することです。Your only option is to use Docker images based on Windows Server Core and the .NET Framework.

ご利用の Dockerfile ファイルにイメージ名を追加すると、.NET Framework ベースの Windows コンテナー イメージに関する次の例のように、タグを使用してオペレーティング システムとバージョンを選択できます。When you add the image name to your Dockerfile file, you can select the operating system and version by using a tag, as in the following examples for .NET Framework-based Windows container images:

TagTag システムとバージョンSystem and version Windows Server Core での .NET Framework 4.x.NET Framework 4.x on Windows Server Core Windows Server Core 上での、追加の ASP.NET カスタマイズを含む .NET Framework 4.x.NET Framework 4.x with additional ASP.NET customization, on Windows Server Core

.NET (Linux と Windows のクロスプラットフォーム) の場合、タグは次のようになります。For .NET (cross-platform for Linux and Windows), the tags would look like the following:

TagTag システムとバージョンSystem and version Linux 上の .NET ランタイムのみ.NET runtime-only on Linux Windows Nano Server 上の .NET ランタイムのみ.NET runtime-only on Windows Nano Server

マルチアーキテクチャ イメージMulti-arch images

また、2017 年半ばから、マルチアーキテクチャ イメージと呼ばれる Docker の新機能を使用できるようになりました。Beginning in mid-2017, you can also use a new feature in Docker called multi-arch images. .NET Docker イメージにはマルチアーキテクチャ タグを使用できます。.NET Docker images can use multi-arch tags. ご利用の Dockerfile ファイルでは、ターゲットとするオペレーティング システムを定義する必要がなくなりました。Your Dockerfile files no longer need to define the operating system that you are targeting. マルチアーキテクチャ機能では、1 つのタグを、複数のコンピューター構成にわたって使用できます。The multi-arch feature allows a single tag to be used across multiple machine configurations. たとえば、マルチアーキテクチャでは、 という 1 つの一般的なタグを使用できます。For instance, with multi-arch, you can use one common tag: Linux コンテナー環境からそのタグをプルすると、Debian ベースのイメージが得られます。If you pull that tag from a Linux container environment, you get the Debian-based image. Windows コンテナー環境からそのタグをプルすると、Nano Server ベースのイメージが得られます。If you pull that tag from a Windows container environment, you get the Nano Server-based image.

.NET Framework イメージの場合、従来の .NET Framework では Windows しかサポートされていないため、マルチアーキテクチャ機能は使用できません。For .NET Framework images, because the traditional .NET Framework supports only Windows, you cannot use the multi-arch feature.

Windows コンテナーの種類Windows container types

Linux コンテナーと同様に、Windows Server コンテナーは Docker エンジンを使用して管理されます。Like Linux containers, Windows Server containers are managed by using Docker Engine. Linux コンテナーとは異なり、Windows コンテナーには 2 つの異なるコンテナー タイプ、つまり実行時 Windows Server コンテナーと Hyper-V による分離が含まれます。Unlike Linux containers, Windows containers include two different container types, or run times-Windows Server containers and Hyper-V isolation.

Windows Server コンテナー: プロセスと名前空間の分離テクノロジを使用してアプリケーションの分離を実現します。Windows Server containers: Provides application isolation through process and namespace isolation technology. Windows Server コンテナーは、コンテナー ホスト、およびホスト上で実行されているすべてのコンテナーとカーネルを共有します。A Windows Server container shares a kernel with the container host and all containers that are running on the host. これらのコンテナーは敵対的なセキュリティ境界を提供しないため、信頼されていないコードを分離するために使用しないでください。These containers do not provide a hostile security boundary and should not be used to isolate untrusted code. 共有されたカーネル空間があるため、これらのコンテナーには同じカーネル バージョンおよび構成が必要です。Because of the shared kernel space, these containers require the same kernel version and configuration.

Hyper-V による分離: 高度に最適化された VM で各コンテナーを実行することで、Windows Server コンテナーによって実現される分離を拡張します。Hyper-V isolation: Expands on the isolation provided by Windows Server Containers by running each container on a highly optimized VM. この構成では、コンテナー ホストのカーネルは、同じホスト上にある他のコンテナーと共有されません。In this configuration, the kernel of the container host is not shared with other containers on the same host. これらのコンテナーは、VM と同じセキュリティ保証を使用して、敵対的なマルチテナント ホスティング向けに設計されています。These containers are designed for hostile multitenant hosting, with the same security assurances of a VM. これらのコンテナーは、ホスト、またはホスト上のその他のコンテナーとカーネルを共有しないため、さまざまなバージョンおよび構成のカーネルを実行することができます (バージョンがサポートされている場合)。Because these containers don't share the kernel with the host or other containers on the host, they can run kernels with different versions and configurations (with supported versions). たとえば、Windows 10 上のすべての Windows コンテナーでは、Hyper-V による分離を使用して、Windows Server カーネルのバージョンと構成が利用されます。For example, all Windows containers on Windows 10 use Hyper-V isolation to utilize the Windows Server kernel version and configuration.

Windows 上でコンテナーの実行を、Hyper-V による分離を使用して行うか、使用しないで行うかの決定は、実行時に行います。Running a container on Windows with or without Hyper-V isolation is a run-time decision. 最初は Hyper-V による分離を使用してコンテナーを作成し、実行時に Windows Server コンテナーとして実行するように選択することもできます。You might choose to create the container with Hyper-V isolation initially, and at run time, choose to run it as a Windows Server container instead.

その他の技術情報Additional resources

Azure でのコンテナー エコシステムThe container ecosystem in Azure

前のセクションでは、Docker コンテナーの利点と、.NET アプリケーション用の特定のコンテナー イメージの詳細について説明しました。In previous sections, it's been explained what the benefits of Docker containers are as well as details on the specific container images for .NET applications. その一般的な情報はすべて、アプリケーションを開発またはコンテナー化するための基本となります。All that generic information is fundamental in order to develop or containerize an application. ただし、運用展開環境または QA および開発/テスト環境について考えた場合、Microsoft Azure では、オープンで多岐にわたる選択肢が用意され、クラウドでの完全なコンテナー エコシステムが実現されます (以下の図を参照)。However, when thinking about the production deployment environment or even QA and Dev/Test environments, Microsoft Azure provides an open and broad variety of choices, a full container ecosystem in the cloud (shown in the diagram below). 特定のアプリケーションのニーズに応じて、いずれかの Azure 製品を選択する必要があります。Depending on your specific application's needs, you should choose one or another Azure product.

Azure のコンテナーエコシステムの図。

図 4-7.5Figure 4-7.5. Azure でのコンテナー エコシステムThe container ecosystem in Azure

Azure でのコンテナー エコシステムから、次の製品によって、インフラストラクチャと見なされるコンテナーがサポートされています。From the container ecosystem in Azure, the following products supporting containers that are considered infrastructure:

  • Azure Container Instances (ACI)Azure Container Instances (ACI)
  • Azure Virtual Machines (コンテナーをサポート)Azure Virtual Machines (With container's support)
  • Azure Virtual Machine Scale Sets (コンテナーをサポート)Azure Virtual Machine Scale Sets (With container's support)

これら 3 つのうち、ACI には大きな利点があります。それは基礎となる OS を維持する必要がなく、アップグレードやパッチなどを行う必要がないという事実です。しかし、このブックの後のセクションで詳しく説明するように、ACI は引き続きインフラストラクチャ レベルに配置されます。From those three, ACI provides a great benefit, which is the fact that you don't need to maintain the underlying OS, no need for you to upgrade/patch, etc. but ACI still is positioned in the infrastructure level, as better explained in the upcoming sections of this book.

同時に PaaS (サービスとしてのプラットフォーム) レベルにも配置される Azure サポート コンテナーの製品は次のとおりです。The products in Azure supporting containers that are at the same time positioned more in the PaaS (Platform as a Service) level are:

  • Azure App ServiceAzure App Service
  • Azure Kubernetes Service (AKS および ACS)Azure Kubernetes Service (AKS and ACS)
  • Azure BatchAzure Batch

次に、Azure Container Registry は、Azure でホストされる拡張性の高いコンテナー レジストリであり、カスタム コンテナー イメージを登録してデプロイするときに、前述のすべての製品から使用することができます。Then, Azure Container Registry is a high scalable container registry hosted in Azure that you can use from all the previous products when registering and deploying your custom container images.

さらに、ご利用のコンテナーからは、Azure SQL Database、Azure Redis Cache、Azure Cosmos DB など、Azure 内の他のマネージド サービスを利用することもできます。In addition, from your containers, you can consume other managed services in Azure like Azure SQL Database, Azure Redis cache, Azure Cosmos DB, etc. また、Azure Marketplace には、Cloud Foundry や OpenShift などのサードパーティ製ソリューション/プラットフォームも用意されており、Azure 内でコンテナーを使用することもできます。plus there are third-party solutions/platforms available in Azure Marketplace like Cloud Foundry and OpenShift where you can also use containers within Azure.

次のセクションでは、特に Windows コンテナーをターゲットとする場合に、それらの Azure 製品とソリューションの各々を使用するタイミングに関する Microsoft の推奨事項について説明します。In the next sections, you can explore Microsoft's recommendations on when to use each of those Azure products and solutions specifically when targeting Windows Containers.