Docker Windowsイメージに初めて取り組んでいますか?現在Windowsショップで働いていて、Dockerビルドについて学びたいと思っていますか?正しい場所に来ました。新しいものを学ぶ最良の方法は、docker build
コマンドとdocker build "tag"
コマンドを使用して実際にやってみることです!
この記事では、docker build
コマンドを使用してDockerfileから最初のWindows Dockerイメージを作成する方法を学びます。
さあ、始めましょう!
Dockerコンテナイメージの理解
長年、複数のオペレーティングシステム(OS)でのテストや開発を行う唯一の方法は、OSバージョンを選択していくつかの専用の物理または仮想マシンにイメージ化することでした。この方法論は、各ソフトウェアとOSの仕様に対して新しいマシンを提供するためにより多くのハードウェアとオーバーヘッドが必要でした。
しかし、現在ではDocker コンテナイメージの使用が増えてきており、その一因はマイクロサービスアーキテクチャの人気です。Dockerの人気の上昇に応えて、Microsoftはさまざまな主力製品のDockerイメージを公式にサポートし始めています。さらに、Windows 10やWindows Server 2016での製品機能としてWindowsのイメージに対するネイティブサポートも追加されました!
A Docker image is run on a container by using the Docker Engine. Docker images have many benefits such as portability (applicable to multiple environments and platforms), customizable, and highly scalable. As you can see below, unlike traditional virtual machines, the Docker engine runs on a layer between the host OS kernel and the isolated application services that are being containerized.

Docker Buildとイメージの理解
docker build
コマンドは、コンテナイメージの作成を自動化し、コンテナをコードとして採用し、プロジェクトの開発サイクルにコンテナ化を統合するために活用することができます。Dockerfile は、既存のイメージを基に新しいコンテナイメージを作成するために Docker が使用するビルド命令を含むテキストファイルです。
ユーザーは、コンテナイメージがデプロイまたは初回起動される際に実行する基本イメージとコマンドのリストを指定することができます。この記事では、Windows ベースの Docker イメージを Dockerfile を使用して作成する方法について説明します。
このプロセスは、事前に構築されたコンテナイメージを使用する場合よりもいくつかの利点があります:
- 複数の Windows バージョン向けのコンテナイメージを再ビルドすることができます。これは、複数のプラットフォームでコード変更をテストするのに非常に便利です。
- コンテナ内にインストールされるものをより細かく制御できます。これにより、コンテナのサイズを最小限に抑えることができます。
- セキュリティ上の理由から、コンテナを脆弱性のチェックやベースイメージのセキュリティ強化に使用したい場合があります。
前提条件/要件
この記事は、Dockerfile を使用して Docker イメージをビルドする方法についての手順を紹介しています。一緒に進める場合は、次の前提条件を確認してください。
- Windows に Docker をインストール。私の環境では Docker Community Edition(CE)バージョン 2.1.0.4 を使用します。
- Dockerイメージをダウンロードするためには、インターネットアクセスが必要です。
- Windows 10+オペレーティングシステム(このチュートリアルではバージョン1709を使用しています)
- ネストされた仮想化が有効になっている
- ローカルマシンに5GBの無料ディスク容量が必要です
- PowerShell 5.0+
- このチュートリアルではVisual Studio Code IDEを使用します。ただし、ご希望のIDEをご利用いただいても構いません。
注意: Dockerをインストールする際に、Windows Containers Configurationを有効にしてください。
準備の手順
まず、Dockerイメージとそれらのイメージからビルドされるすべてのコンテナを保存するためのフォルダが必要です。これを行うには、PowerShellまたはcmdターミナルを開いて(この記事ではPowerShellを使用します)、C:\Containersという名前の新しいディレクトリを作成します。
フォルダが作成されたら、そのディレクトリに移動します。これにより、コンソールの現在の作業ディレクトリがC:\Containersに変更され、すべてのダウンロードがこのディレクトリに保存されるようになります。
この記事では、あなたはヘッドスタートを得ることができます。このプロジェクトで作業するためのほとんどのファイルはすでに利用可能です。フォルダが作成されたら、Git pullを実行して、TechSnips Githubリポジトリからこの記事で必要なファイルをC:\Containersフォルダにコピーします。完了したら、C:\Containersフォルダが以下のようになっていることを確認してください。

IIS Windows Dockerイメージのダウンロード
最初に実行するタスクは、”テンプレート”またはベースイメージをダウンロードすることです。後で独自のDockerイメージをビルドしますが、まずは最初に始めるためのイメージが必要です。このチュートリアルで必要な最新のIISおよびWindows Server Coreイメージをダウンロードします。更新されたイメージの一覧は、公式のMicrosoft Dockerハブのイメージページで確認できます。
現在のDockerベースイメージの確認
イメージリポジトリからイメージをダウンロードする前に、現在のローカルシステムで利用可能なDockerベースイメージを確認しましょう。管理者としてPowerShellコンソールを実行し、docker images
と入力します。このコマンドはローカルシステム上のすべてのイメージを返します。
以下のように、利用可能なイメージは最初は空です。

ベースイメージのダウンロード
今、Docker Hubから基本のIISイメージをダウンロードする時間です。以下のようにdocker pull
を実行してください。このプロセスは、インターネットの速度に応じて完了するまで時間がかかる場合があります。

次にdocker images
を実行し、このチュートリアルで使用できる最新のMicrosoft Windows Core IISイメージが表示されるはずです。

Dockerfileの検査
以前のステップで、このチュートリアルのために既存のDockerfileをダウンロードしました。では、それが具体的に何を含んでいるか見てみましょう。
お好きなエディタでC:\Containers\Container1\Dockerfileファイルを開いてください。このDockerfileの内容は、ビルド時にコンテナイメージの構成方法を定義するために使用されます。
このファイルの各部分が何をするかについての説明をインラインコメントで確認できます。
新しいDockerイメージのビルド
Dockerfileを準備し、ベースのIISイメージをダウンロードしました。さて、Dockerfileを使用して新しいDockerイメージをビルドする時間です。
新しいイメージをビルドするには、docker build "tag"
コマンドを使用します。このコマンドはイメージを作成します。この記事では、以下のように-t **
オプションを使用しています。このオプションは、新しいイメージに友好的なタグ名を付けて、Dockerfileを参照するためにフォルダパスを指定することができます。
以下に、コンソールがC:\Containersディレクトリ内にあることを確認し、C:\Containers\Container1ディレクトリ内のDockerfileから新しいイメージをビルドする例が示されています。
開始すると、コマンドがDockerfileの各命令を1行ずつトラバースする様子を確認できます。

完了したら、新しいDockerイメージが作成されているはずです!
次に、docker images
コマンドを実行して使用可能なイメージを表示します。以下に、作成されたcontainer1イメージの例が示されています。

注意:
docker build —help
コマンドは、実行されているdockerコマンドの詳細情報を表示する便利なパラメータです。
Dockerコンテナの実行
この時点で、新しいイメージが作成されました。このイメージを使用してコンテナを起動する時間です。新しいコンテナを起動するには、docker run
コマンドを使用します。
docker run
コマンドは、以前に作成したcontainer1イメージを基に、新しいDockerコンテナを起動します。以下に例を示します。
-d
パラメータが使用されていることに注意してください。これにより、dockerランタイムはデタッチモードでイメージを起動し、コンテナのルートプロセスが終了すると終了します。
docker run
が完了すると、作成されたコンテナのIDが返されます。以下の例では、このIDを$containerID
変数に格納して後で簡単に参照できるようにしています。

コンテナが起動したら、docker ps
コマンドを実行します。このコマンドは、各イメージを使用して現在実行中のコンテナを表示することができます。以下の例では、実行中のイメージが自動的にニックネーム(この場合はbusy_habit)が付けられていることに注意してください。このニックネームは、コンテナを管理する際にコンテナIDの代わりに使用されることがあります。

コンテナ内でコードを実行する
A new container is built from a new image you just created. Let’s now start actually using that container to run code. Running code inside of a Docker container is done using the docker exec
command.
この例では、コンテナ内でdocker exec
コマンドを実行して、コンテナ内でGet-ChildItem
コマンドのPowerShell出力を表示します。これにより、Dockerfileの指示に従ってデフォルトのIISファイルが削除されたことを確認できます。
以下の例では、index.htmlのみが存在することがわかります。これは、デフォルトのファイルが削除されていることを意味します。

次に、コンテナ内でipconfig
コマンドを実行し、コンテナイメージのローカルIPアドレスを取得してIISウェブサイトに接続しようとします。
以下に示すように、ipconfig
はコンテナで実行され、ローカルコンピュータ上で実行しているかのようにすべてのIP情報を返しています。

ipconfig
in a Docker containerIISウェブサイトの調査
さて、あなたの努力の成果を明らかにする時です!Dockerコンテナで実行されているIISサーバが正しくindex.htmlページを提供しているかどうかを確認しましょう。
ブラウザを開き、ipconfig
で見つかったIPv4アドレスをアドレスバーに貼り付けます。すべてがうまくいっていれば、以下のようなHello World!!メッセージが表示されるはずです。

Dockerの履歴の確認
Dockerコンテナを使用する際に役立つコマンドの1つがdocker history
コマンドです。イメージやコンテナ自体の作成とは必ずしも関係がないですが、docker history
コマンドはコンテナイメージに対して行われた変更を確認するのに便利なコマンドです。
以下に示すように、docker history
は作業しているcontainer1コンテナに対して行われたすべてのDockerfileとPowerShellの操作を返します。

docker history
実行中のDockerイメージのクリーンアップ
以下の手順は、マシン上で実行中のすべての停止したコンテナをクリーンアップするために使用されます。これにより、ディスク容量とシステムリソースが解放されます。
docker ps
コマンドを実行して、システム上で実行中のコンテナのリストを表示します:

次に、docker stop
コマンドを使用して実行中のコンテナを停止します:

最後に、docker system prune
コマンドを使用して停止したコンテナを永久に削除できます。
