独自の Web アプリを実行するために Docker イメージをカスタマイズする

完了

Docker Hub は、独自のコンテナー化されたアプリの構築を開始するためのイメージの優れたソースです。 必要となる基本的な機能を備えているイメージをダウンロードし、その上に独自のアプリケーションを "階層化" して、新しいカスタム イメージを作成できます。 Dockerfile を記述することで、このプロセスの手順を自動化できます。

オンラインの衣料品店のシナリオでは、会社は Docker が前進するための方法だと判断しました。 次の手順では、Web アプリケーションをコンテナー化する最善の方法を決定します。 会社では ASP.NET Core を使用してアプリの多くを構築することを計画しています。 あなたは Docker Hub に、このフレームワークを含む基本イメージが含まれていることに気付いています。 概念実証として、この基本イメージを利用して開始し、Web アプリのいずれかのコードを追加して、新しいカスタム イメージを作成することをおすすめします。 また、このプロセスを簡単に反復できるようにし、新しいバージョンの Web アプリをリリースするたびに自動化できるようにする必要があります。

このユニットでは、カスタム Docker イメージを作成する方法と、Dockerfile を記述してプロセスをどのように自動化できるかについて学習します。

Dockerfile でカスタム イメージを作成する

ご利用のアプリケーションを含む Docker イメージを作成するには、通常、ファイルと構成情報を追加する "基本イメージ" をまず特定します。 適切な基本イメージを特定するプロセスは、通常、Docker Hub 上のイメージを検索することから始めます。 このイメージには既にアプリケーション フレームワークと、Ubuntu や Alpine などの Linux ディストリビューションのすべてのユーティリティとツールが含まれています。 たとえば、コンテナーにパッケージ化する ASP.NET Core アプリケーションがある場合、Microsoft では、ASP.NET Core ランタイムが既に含まれている mcr.microsoft.com/dotnet/core/aspnet というイメージを発行します。

基本イメージでコンテナーを起動し、変更を加えることで、イメージをカスタマイズできます。 変更には通常、ローカル ファイルシステムからコンテナーへのファイルのコピーや、コードをコンパイルするためのさまざまなツールとユーティリティの実行などのアクティビティが含まれます。 完了したら、docker commit コマンドを使用して、新しいイメージに変更を保存します。

上記のプロセスを手動で完了するには時間がかかり、エラーが発生しやくなります。 Bash のようなスクリプト言語でスクリプト化できますが、Docker には、Dockerfile を介してイメージの作成を自動化するためのより効率的な方法が用意されています。

Dockerfile は、イメージのビルドに必要なコマンドをすべて含んだプレーン テキスト ファイルです。 Dockerfile は、イメージの構築と構成用に設計された最小限のスクリプト言語で記述されます。 基本イメージで開始するイメージの構築に必要な操作がドキュメント化されています。

次の例は、.NET Core 2.2 アプリケーションを構築し、新しいイメージにパッケージ化する Dockerfile を示しています。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2
WORKDIR /app
COPY myapp_code .
RUN dotnet build -c Release -o /rel
EXPOSE 80
WORKDIR /rel
ENTRYPOINT ["dotnet", "myapp.dll"]

このファイルでは、次の操作が実行されます。

コマンド アクション
FROM 指定されたイメージをダウンロードし、このイメージに基づいて新しいコンテナーが作成されます。
WORKDIR 以降のコマンドで使用される、コンテナー内の現在の作業ディレクトリが設定されます。
COPY ホスト コンピューターからコンテナーにファイルがコピーされます。 最初の引数 (myapp_code) は、ホスト コンピューター上のファイルまたはフォルダーです。 2 番目の引数 (.) では、コンテナー内の宛先として機能するファイルまたはフォルダーの名前を指定します。 この場合、宛先は現在の作業ディレクトリ (/app) です。
実行 コンテナー内のコマンドが実行されます。 RUN コマンドの引数は、コマンドライン コマンドです。
EXPOSE コンテナーの実行時に開かれるポートを指定する構成を、新しいイメージに作成します。 コンテナーで Web アプリが実行されている場合は、ポート 80 を公開するのが一般的です。
ENTRYPOINT コンテナーで起動時に実行する必要がある操作を指定します。 この例では、新しく構築されたアプリが実行されます。 実行するコマンドと、その各引数を文字列配列として指定します。

慣例により、Docker イメージとしてパッケージ化されるアプリケーションには通常、ソース コードのルートに Dockerfile が配置され、ほとんどの場合、Dockerfile という名前になります。

docker build コマンドでは、Dockerfile を実行して、新しいイメージを作成します。 このコマンドの構文には、いくつかのパラメーターがあります。

  • -f フラグは、使用する Dockerfile の名前を示します。
  • -t フラグによって、作成されるイメージの名前が指定されます。この例では、myapp:v1 となります。
  • 最後のパラメーターである . では、COPY コマンドのソース ファイルの "ビルド コンテキスト" が提供されます。これは、ビルド プロセス時に必要な、ホスト コンピューター上のファイル セットです。
docker build -t myapp:v1 .

バックグラウンドでは、docker build コマンドによってコンテナーが作成され、そこでコマンドが実行されてから、新しいイメージに変更がコミットされます。