次の方法で共有


Docker とは

ヒント

このコンテンツは、.NET Docs で入手できる、またはオフラインで読み取ることができる無料のダウンロード可能な PDF として入手できる、コンテナー化された .NET アプリケーションの電子ブックである .NET マイクロサービス アーキテクチャからの抜粋です。

コンテナー化された .NET アプリケーションの .NET マイクロサービス アーキテクチャの電子ブックの表紙サムネイル。

Docker は、クラウドまたはオンプレミスで実行できる移植可能で自己十分なコンテナーとしてアプリケーションのデプロイを自動化するための オープンソース プロジェクト です。 Docker は、Microsoft を含むクラウド、Linux、Windows ベンダーと協力して、このテクノロジを促進および進化させる 企業 でもあります。

Docker コンテナーを実行できる場所を示す図。

図 2-2. Docker は、ハイブリッド クラウドのすべてのレイヤーにコンテナーをデプロイします。

Docker コンテナーは、お客様のデータセンター内、外部サービス プロバイダーまたはクラウド内の任意の場所(オンプレミス)、Azure 上で実行できます。 Docker イメージ コンテナーは、Linux と Windows でネイティブに実行できます。 ただし、Windows イメージは Windows ホストでのみ実行でき、Linux イメージは Linux ホストと Windows ホスト (これまでは Hyper-V Linux VM を使用) で実行できます。ホストはサーバーまたは VM を意味します。

開発者は、Windows、Linux、または macOS で開発環境を使用できます。 開発用コンピューターでは、開発者は、アプリとその依存関係を含め、Docker イメージがデプロイされている Docker ホストを実行します。 Linux または macOS で作業する開発者は、Linux ベースの Docker ホストを使用し、Linux コンテナーに対してのみイメージを作成できます。 (macOS で作業している開発者は、コードを編集したり、macOS から Docker CLI を実行したりできますが、この記事の執筆時点では、コンテナーは macOS では直接実行されません)。Windows で作業する開発者は、Linux または Windows コンテナーのイメージを作成できます。

開発環境でコンテナーをホストし、追加の開発者ツールを提供するために、Docker には、Windows または macOS Docker Desktop 付属しています。 これらの製品は、コンテナーをホストするために必要な VM (Docker ホスト) をインストールします。

Windows コンテナー 実行するには、次の 2 種類のランタイムがあります。

  • Windows Server コンテナーは、プロセスと名前空間の分離テクノロジによるアプリケーションの分離を提供します。 Windows Server コンテナーは、コンテナー ホストと、ホスト上で実行されているすべてのコンテナーとカーネルを共有します。

  • Hyper-V コンテナーは、高度に最適化された仮想マシンで各コンテナーを実行することで、Windows Server コンテナーによって提供される分離を拡張します。 この構成では、コンテナー ホストのカーネルは Hyper-V コンテナーと共有されないため、分離性が向上します。

これらのコンテナーのイメージは同じ方法で作成され、同じように機能します。 違いは、Hyper-V コンテナーを実行しているイメージからコンテナーを作成する方法に追加のパラメーターが必要である点です。 詳細については、「Hyper-V コンテナー」を参照してください。

Docker コンテナーと仮想マシンの比較

図 2-3 は、VM と Docker コンテナーの比較を示しています。

Virtual Machines Docker コンテナー
従来の VM のハードウェア/ソフトウェア スタックを示す図。 Docker コンテナーのハードウェア/ソフトウェア スタックを示す図。
仮想マシンには、アプリケーション、必要なライブラリまたはバイナリ、完全なゲスト オペレーティング システムが含まれます。 完全仮想化には、コンテナー化よりも多くのリソースが必要です。 コンテナーには、アプリケーションとそのすべての依存関係が含まれます。 ただし、OS カーネルは他のコンテナーと共有され、ホスト オペレーティング システム上のユーザー空間で分離されたプロセスとして実行されます。 (コンテナーごとに特殊な仮想マシン内で各コンテナーが実行される Hyper-V コンテナーを除く)。

図 2-3。 従来の仮想マシンと Docker コンテナーの比較

VM の場合、ホスト サーバーには、インフラストラクチャ、ホスト オペレーティング システム、ハイパーバイザーの 3 つの基本レイヤーがあり、その上に各 VM に独自の OS と必要なすべてのライブラリがあります。 Docker の場合、ホスト サーバーにはインフラストラクチャと OS のみが存在し、その上にコンテナー エンジンはコンテナーを分離したまま、基本 OS サービスを共有します。

コンテナーに必要なリソースがはるかに少ないため (たとえば、完全な OS は必要ありません)、デプロイが簡単で、迅速に開始できます。 これにより、密度を高めることができます。つまり、同じハードウェア ユニットでより多くのサービスを実行できるため、コストが削減されます。

同じカーネルで実行する副作用として、VM よりも分離性が低くなります。

イメージの主な目的は、異なるデプロイ間で環境 (依存関係) を同じにすることです。 つまり、コンピューターでデバッグし、同じ環境が保証された別のマシンにデプロイできます。

コンテナー イメージは、アプリまたはサービスをパッケージ化し、信頼性の高い再現可能な方法でデプロイする方法です。 Docker はテクノロジだけでなく、哲学とプロセスでもあると言えます。

Docker を使用すると、開発者は "自分のコンピューターで動作します。運用環境では動作しないのはなぜですか" と読み上げられません。パッケージ化された Docker アプリケーションは、サポートされている任意の Docker 環境で実行でき、すべてのデプロイ ターゲット (開発、QA、ステージング、運用など) で意図したとおりに実行されるため、単に "Docker で実行されます" と言うことができます。

単純な例え

おそらく、単純な類推は、Docker のコア概念を把握するのに役立ちます。

しばらくの間、1950 年代にさかのぼってみましょう。 ワードプロセッサはなく、コピー機はどこでも使用されていました(種類)。

あなたは、必要に応じて迅速に手紙のバッチを発行し、実際の紙と封筒を使用して顧客に郵送し、各顧客の住所に物理的に配信する責任があるとします(当時は電子メールはありませんでした)。

ある時点で、手紙が目的に応じて必要な段落を選んで配置した大きなセットの構成に過ぎないことに気づきます。そこで、大幅な昇給を期待して迅速に手紙を発行するシステムを考案します。

システムは単純です。

  1. まず、1 つの段落を含む透明なシートのデッキから始めます。

  2. 一連の文字を発行するには、必要な段落を含むシートを選び、それらを積み重ねて配置して、見た目と読みやすさを調整します。

  3. 最後に、セットをコピー機に配置し、スタートキーを押して必要な数の文字を生成します。

そのため、Docker の中核となる概念は簡略化です。

Docker では、各レイヤーは、プログラムのインストールなどのコマンドの実行後にファイル システムに発生する一連の変更になります。

そのため、レイヤーのコピー後にファイルシステムを "見る" と、プログラムのインストール時にレイヤーに含まれるすべてのファイルが表示されます。

イメージは、オペレーティング システムが既にインストールされている "コンピューター" にインストールできる補助読み取り専用ハード ディスクと考えることができます。

同様に、コンテナーは、イメージ ハード ディスクがインストールされた "コンピューター" と考えることができます。 コンテナーは、コンピューターと同様に、電源のオンとオフを切り替えることができます。