このビデオでは、コンテナとは何か、コンテナをWindows Serverオペレーティング システムでどう実行するか、コンテナをどのように使用できるかを簡単に説明します。コンテナとは、アプリケーションを実行できる分離された環境です。
コンテナ、アプリケーション、およびそのすべての依存関係は、カーネル オペレーティング システム、CPU、メモリなどのホストのリソースの一部で構成されます。それらは他のコンテナや、ホスト自体から論理的に分離されます。
この図は、赤と黄色のコンテナが、同じハードウェア リソースとカーネル オペレーティング システムを使用して同じホスト内に共存し、個々のスペース内に格納されているため、外部からの干渉を受けることなくアプリケーションを実行する方法を示しています。
同じハードウェアとそのハードウェアにインストールされたオペレーティング システムは、各コンテナで起こっていることから独立して、独自のアプリケーションとサービスを実行できます。
デフォルトでは、このコンテナは破棄可能です。コンテナが停止すると、そこにあるすべてのソフトウェアとファイルは削除されます。ホストの再起動でも、同じことが起こります。
コンテナは、ホスト コンピューターのファイアウォールも使用できます。このすべてを仮想マシンと比較してみましょう。第一に、仮想マシンではコンテナを実行できますが、その逆は不可能です。
仮想マシンは、コンピューター全体をシミュレートします。よって、仮想マシンはそれ自体のOSを実行する必要があります。これはより優れたセキュリティを可能にしますが、同時により多くの構成作業とメンテナンスを必要とし、このために、頻繁にアイドル状態のリソースが発生します。
Visual Studio、Azure、Kubernetes、Windowsなどコンテナを使用して作業する方法は複数ありますが、このビデオではDockerについて説明します。
Dockerは、アプリケーション、そのすべての依存関係、および構成情報をコンテナと呼ばれる単一のパッケージに結合する役割を担うサービスとしてのプラットフォーム製品です。
その後Dockerを利用して、そのコンテナの送信、実行、削除を行うことができます。この図にはすぐまた戻ります。これが実際に機能する様子を見てみましょう。その際に、詳細も見ていきます。これはインストールしたばかりのWindows Server 2022です。
[Server Manager]ウィザードを起動し、[Roles]と[Features]を追加します。このウィザードを使用して[Containers]機能を追加できます。しかし、この機能ではDockerはインストールされません。
別に行う必要があります。そのためにはこのウィザードをキャンセルする必要があります。[PowerShell]を開き、次の行を実行して、まず必要なプロバイダーをインストールします。
[Install-Module]、[DockerMsftProvider]、[PSGallery]をソースとして使用します。Enterを押します。このプロンプトで、[Yes]を選択してNuGetをインストールします。終わるまで待ちます。
2行目を実行して、Docker自体をインストールします。Install-Packageで「docker」と入力し、前にインストールした「DockerMsftProvider」を指定します。Enterを押します。少しするとプロンプトが表示されます。[Yes]を選択して続行します。
コンピューターを再起動するプロンプトが表示されます。「Restart-Computer」と入力して、再起動します。コンピューターのバックアップが取れたら、もう一度[Server Manager]で[役割と機能の追加ウィザード]を開きます。
[Containers]機能がすでにインストールされているのが分かります。これは、前述の2行のPowerShell行で実行しました。[PowerShell]で「docker」のようなコマンドを実行すると、どのようなことを実行できるかが分かります。
たとえば、Docker versionは、エンジン バージョン20.10.9で実行していることを示します。別のコマンド、「docker info」は、作成済みのコンテナがまだないことを示します。
このボックスには、コンテナで使用可能なCPUとRAMの量、「デフォルトの分離方法」、作成された「ネットワーク」タイプなどの詳細も表示されますが、ここでは説明しません。
DockerをインストールしたばかりのこのWindowsボックスに最初のコンテナをビルドして実行する手順を実行しましょう。図に戻り、Dockerは複数のアイテムを1つのコンテナにまとめるツールであることを思い出しましょう。たとえば、Webアプリケーションをコンテナ化すると、そのコンテナ内にいくつかのアイテムを入れる必要があります。
まず、「Dockerfile」が必要です。このファイルには、新しいコンテナを作成するために必要な構成情報と指示が入ります。Dockerfileはこのようなものです。非常に複雑な場合も、シンプルな場合もあります。
すぐに1つ作成します。コンテナ イメージも必要です。イメージは、読み取り専用テンプレートのようなものです。たとえば、"Windows Server Core" のテンプレートや "Nano Server" テンプレートを使用してコンテナーを構築できます。
このイメージまたはテンプレートは、「IIS」サービスと開発フレームワークなど、Webアプリケーションが必要とする依存関係の一部も提供します。最後に、Webアプリケーション自体が必要です。
Dockerでは、これらすべてをまとめてコンテナを作成することができます。実際に見てみましょう。PowerShellでDockerをインストールしたコンピューターに戻り、Cドライブのルートに切り替えて、「containers」という名前の新しいディレクトリーを作成します。
この新しい「containers」ディレクトリーに切り替えます。最初のコンテナを作成するには前述のDockerfileが必要です。このファイルは、コンテナ用の一連の指示が含まれたテキスト ファイルです。
「New-Item」と入力して、「dockerfile」という名前を指定します。このDockerfileには拡張子がないことに注目してください。エクスプローラーで作成されたファイルを確認できます。メモ帳で開きます。
この最初のコンテナをシンプルに保つため、このDockerfileに3行だけ追加します。1つずつ説明します。まず、「From」の指示は、コンテナを作成するためにどのコンテナ イメージを使用するかをDockerに伝えます。
イメージとは、テンプレートのようなものです。このケースでは、Dockerに、使用するイメージは、Microsoftコンテナ レジストリーから取得することを伝えます。このイメージはWindows Server Coreに基づくもので「IIS」ロールもインストールされています。
2 行目は、新しいコンテナー イメージの実行後にどのコマンドを実行するかを指定します。ソフトウェアをインストールしたり、ファイルやディレクトリーを作成したりするためのコマンドを含めることができます。
このケースでは、コンテナの実行時に、PowerShellを実行するようにDockerに指示します。最後にある「Copy」の指示により、ファイルまたはディレクトリーをホスト コンピューターからコンテナのファイル システムにコピーします。
この場合、すぐに作成され、サンプル Web アプリケーションとして機能するファイル名 "index.html" をホスト コンピューターからコンテナー内のこのフォルダー (IIS の既定の仮想ディレクトリ パス) にコピーするように Docker に指示しています。
これだけです。このDockerfileを保存しましょう。次に、PowerShell に戻り、そのコンテナーで実行される Web ページを作成します。これを行うため、また「New-Item」コマンドレットを使用し、ファイル名として「index.html」指定します。
エクスプローラーで、このファイルを「メモ帳」を使用して開きます。これをシンプルにするために、このサンプル HTML アプリケーションに 3 行、つまり基本的な "Hello World" Web ページを追加します。
これを保存します。これで、コンテナ作成に必要なコンポーネントがすべて揃いました。DockerはこのWindows Serverボックスにインストールされています。
前に作成したDockerfileがあります。このファイルではIISを持つ、Microsoftレジストリーから得たServer Coreイメージを使用するように指示しました。
また、そのDockerfileには、新しいコンテナが作成されたら、HTML Webページをコピーする指示も含めました。けれど存在するのは一連の指示のみです。まだ何も実行されていません。
PowerShellに戻り、それらの指示に基づいて実際にイメージを作成します。「docker」、「build」を実行して、命名するか、「webserver」とタグ付けします。
最後にある末尾のドットは、このコンテナ ディレクトリーで作業することを示します。ここには、Dockerfileと「index.html」Webページがあります。Enterを押します。
この行は、そのDockerfileで指定した命令を使用してコンテナーが作成されるベース イメージを作成します。このサーバーでこのイメージを初めて呼び出したため、Microsoftコンテナ レジストリーからダウンロードする必要があります。
これがすべて終了したら、docker imagesなどのコマンドを実行すると、最近ダウンロードしたイメージが、割り当てた名前またはタグとともに表示されます。これで、テンプレートのようなコンテナ イメージができました。しかし、まだ実行されているコンテナはありません。
サンプル Web アプリケーションにはまだアクセスできないことを示すために、Web ブラウザーを開き、「localhost」と入力します。これは失敗しますが、予想どおりです。ホストにIISがなく、Webページをホストできないためです。
最終的にダウンロードしたイメージ テンプレートを使用してコンテナを実行するため、PowerShellに戻って「docker run」と入力し、コンテナの名前を指定します。
「container1」という名前を使用します。このスイッチを使用してバックグラウンドで実行されるコンテナを指定します。もう1つは、コンテナの「port 80」がホストの「port 80」にマッピングされるように指定するものです。また、このコンテナの実行には、前にダウンロードして構築したwebserverイメージを使用するよう指定しています。
Enterを押します。以上です。このようにして、私たちが準備したばかりのwebserverイメージに基づいて「container1」という名前のコンテナが作成され、実行されます。
このコンテナにメモリーを割り当てる必要がなかったことに注目してください。仮想マシンのケースとは異なり、CPUも仮想ハード ディスクも割り当てませんでした。
コンテナには、これらのリソースを割り当てる必要がないからです。コンテナは必要なものを使用します。ブラウザーに戻って、また「localhost」と入力します。
サンプルWebアプリケーションが機能しています。ホスト上ではありません。その代わりに、ホストはポート80をコンテナに転送しています。コンテナの作成にあたっては、webserverイメージで指定した設定を使用し、Dockerfileの指示に基づいてHTML Webページがそこにコピーされています。
この新しく作成されたコンテナの操作は、コマンド ラインから行えます。たとえば、新しいPowerShellウィンドウを開き、「docker exec -ti」というコマンドを入力するとこのコンテナとインタラクティブに接続することを指定できます。
コンテナ名の「container1」、次に「powershell」を指定します。このDockerコマンドにより、作成したばかりのcontainer1でPowerShellが開き、プロンプトが表示されます。
このケースでは、たとえば「hostname」と入力すると、このコンテナにはコンピューター名が割り当てられたことが分かります。「ipconfig」などのコマンドを入力すると、このコンテナにIPアドレスが割り当てられていることも示されます。IPアドレスは、ネットワーク アドレス変換を使用してホストなどと通信します。
先ほど作成したHTML Webページに少し変更を加えます。「メモ帳」で編集し、この見出しを「container #1」ではなく、「container #2」にします。このファイルを保存します。PowerShellに戻り、最初のコンテナの構築と実行に使用した前と同じ2行を使用します。
最初の「docker build」の行は変更しません。Enterを押すと、これがすぐ実行されます。これは、Microsoftコンテナ レジストリーからIISロールがインストールされているServer Coreイメージをすでにダウンロードしているためです。
2行目は、「docker run」の行で、「container2」という新しいコンテナを作成するために編集し、このコンテナには、「port 80」ではなく「port 8080」をリッスンさせます。「port 80」は、「container1」に割り当てたものです。
Enterを押し、これが終わったら、ブラウザーに戻り、さらに「localhost」に戻りますが、今回は「port 8080」を指定します。ポート 8080 でリッスンしている Web ページは、先ほど作成した「container #2」によってホストされていることがわかります。一方、HTTPのデフォルトであるポート80は「container #1」によってホストされます。
同じことは、PowerShellで「docker ps」を実行しても確認できます。コンテナ #1 はポート 80 でリッスンしていますが、「コンテナ #2」はポート 8080 でリッスンしています。コンテナ #1 と「コンテナ #2」は、独自のホスト名と IP アドレスを持ち、独自の Web サイトをホストしています。
「container #1」で起こる変化は、「container #2」に影響しません。これらすべてを、ホスト サーバーに「IIS」ロールまたは「hyper v」ロールをインストールすることなく実行できたことに注目してください。
RAMやCPU、または仮想ハード ディスクなどのリソースを割り当てたり、ネットワークを構成する必要もありませんでした。ベース テンプレート イメージがローカルに配置されたら、コンテナの作成に2〜3秒かかりました。
最後に、コンテナで何を実行できるかについて簡単に触れます。第一に、Windowsでコンテナが始めてサポートされたのは、Windows Server 2016とWindows 10です。したがって、ホストされたアプリケーションは、これらのオペレーティング システム以降と互換性があることが理想的です。
グラフィカル ユーザー インターフェイスやドライバーが必要なアプリケーションは、コンテナへの導入には向いていません。ただし、コンテナを使用して、「Asp.net」や「Apache」などのアプリケーション フレームワーク、「Python」などのプログラミング言語、さらにはsqlserver-express、「mongodb」や「mysql」などのサービスの形式のデータベースをホストできます。
現時点では、「ドメイン コントローラー」、「DNS」、「DHCP」などのWindowsインフラストラクチャの役割をコンテナでホストすることはサポートされていませんが、将来どうなるかは誰にもわかりません。
ここまで、コンテナとは何か、コンテナをWindows Serverボックス上で実行する方法、コンテナを何に使用できるかについて簡単に説明しました。この情報がお役に立てば幸いです。ご視聴ありがとうございました。