WindowsでコンテナとDockerを初めて使用する場合、楽しい時間が待っています。この記事では、Docker Desktop for Windowsまたはこの記事では単にDocker Desktopと呼ばれるものを使用して、Windows 10にDockerをセットアップする方法を学びます。
Docker Desktopは、Docker Engineと管理クライアントをパッケージ化したもので、Windows 10で簡単に使用できます。この記事では、Docker Desktopをインストールし、最初のコンテナをデプロイし、ホストとコンテナ間でデータを共有します。
WindowsでのDockerの前提条件
この記事は、WindowsでのDockerのためのDocker Desktopのさまざまなステップを説明するものです。進行するには、最初にいくつかの特定の要件を満たしていることを確認してください。
- データをダウンロードするためのインターネット接続
- Windows 10 64ビットのPro、Enterprise、またはEducation版(バージョン1703以降)
- A CPU with SLAT (nested paging) compatibility. All AMD/Intel processors since approximately 2008 are SLAT compatible
- 少なくとも4GBのRAM
- BIOSハードウェア仮想化(「Virtualization Technology」または「VTx」とも呼ばれることがあります)。これは有効にする必要があり、タスクマネージャーのパフォーマンスタブでEnabledと表示される必要があります。

Docker Desktopのダウンロードとインストール
最初に、WindowsでDockerを使うためにDocker Desktopをダウンロードしてインストールする必要があります。Docker Desktopには2つのリリースがあります。安定版リリースとテストリリースです。
安定版リリースは四半期ごとにリリースされ、完全にテストされたアプリケーションを提供します。この記事では安定版リリースを使用します。
注意:インストール時にDocker Desktopは、Hyper-Vハイパーバイザーをインストールするかどうかを確認します。これにより、VirtualBox、VMWareなどのユーザーモードハイパーバイザーはゲストVMの実行ができなくなります。Hyper-VのVirtualBoxおよびVMWareのサポートは限定的ですが、今後追加される予定です。
また、Docker DesktopをDocker.comから直接手動でダウンロードするか、WindowsパッケージマネージャーChocolateyを使ってダウンロードすることもできます。それぞれの方法について簡単に説明します。
Docker.comから
docker.comからDocker Desktopを直接ダウンロードするには、製品ページにアクセスしてアカウントを登録し、そこからダウンロードすることができます。これは、アカウントを登録して本番でDockerを使用する場合に推奨されます。
ただし、Dockerを初めてテストする場合は、直接ダウンロードすることも可能で、簡単です。
EXEファイルをダウンロードしたら、実行してプロンプトに従い、すべてのデフォルトを受け入れてください。
以下の画像に示すように、Linuxコンテナの代わりにWindowsコンテナを使用する予定かどうかと聞かれた場合、チェックボックスを有効化しないでください。この記事ではLinuxコンテナを使用します。

インストールが完了したら、コンピューターを再起動してください。
WindowsコンテナまたはLinuxコンテナを使用するオプションを選択することで、DockerはイメージをWindowsカーネルまたはLinuxカーネルに接続します。インストール後でも、システムトレイのDockerアイコンを右クリックし、以下に示すように「Windowsコンテナに切り替える」を選択することで、この設定をいつでも変更できます。

Chocolateyを使用する
Docker Desktopをダウンロードしてインストールする別のオプションは、Chocolateyを使用することです。 Chocolateyは、ダウンロードとインストールの多くのタスクを自動化します。これを行うには、管理者としてコマンドラインコンソール(cmdまたはPowerShellのいずれか)を開き、以下のコマンドを実行してプログラムを一括でダウンロードしてインストールします。
完了したら、Windows 10を再起動してください。
いつかテストリリースを試してみたい場合は、
choco install docker-desktop --pre
と実行してダウンロードしてインストールすることができます。
Docker Desktopのインストールの検証
インストールが完了すると、Docker DesktopはWindows上でDockerを提供するサービスとして自動的に実行されます。再起動後にWindowsにログインするとシステムトレイに表示されます。しかし、それが実際に動作していることをどのように確認しますか?
Docker Desktopが正常に動作していることを確認するには、コマンドラインコンソールを開き、docker
コマンドを実行します。インストールがうまくいった場合、Dockerのコマンドリファレンスが表示されます。
最後に、hello-worldという例のコンテナイメージをDockerにダウンロードして実行するには、docker run hello-world
コマンドを実行します。すべてがうまくいっていれば、以下のような出力が表示されます。

Dockerコンテナ内でのコマンドの実行
Docker Desktopがインストールされ、すべてが正常に動作していることを確認しましたか?それでは、Windows上でDockerを始めるために、Dockerコンテナで実行する一般的なタスクの1つはコマンドを実行することです。 docker run
コマンドを介して、ホスト(Windows 10 PC)から直接実行中のコンテナにコマンドを送信することができます。
docker run
を使用してコンテナ内でコマンドを実行するには、まずイメージ名を指定し、その後にコマンドを指定します。はじめに、Dockerに以下のようにalpineという名前のコンテナ内でhostname
コマンドを実行するように指示します。
現在、コンピュータにalpine Dockerイメージがないため、Windows上のDockerはDocker Hubからその小さなイメージをダウンロードし、そのイメージからコンテナを起動し、コマンドを直接コンテナに送信し、一括でシャットダウンします。
コンテナを実行し続ける場合は、-it
パラメータを使用することもできます。このパラメータは、コンテナを「インタラクティブモード」で維持し、コマンドの実行後もフォアグラウンドで実行し続けるようにDockerに指示します。ターミナルプロンプトが表示され、すぐに使用できることがわかります。
ターミナルで作業が完了したら、exit
と入力してWindows 10に戻ります。
コンテナ内からDockerホストのファイルにアクセスする方法
別の一般的なタスクは、コンテナからホストファイルにアクセスすることです。Windows上のDockerでは、デスクトップのフォルダパスをリンクして、そのフォルダをコンテナと共有することができます。このプロセスはバインディングと呼ばれます。
バインディングを作成するには、ローカルドライブにフォルダを作成します。この例では、E:\と呼ばれるフォルダを使用し、それをinputと呼びます。その後、フォルダ内にfile.txtという名前の新しいテキストドキュメントが作成されます。お好きなパスとファイルを使用してください。
ホストとコンテナの間で共有したいフォルダがある場合、Dockerは--mount
パラメータを使用してフォルダをマウントする必要があります。 --mount
パラメータには3つの引数が必要です。マウントタイプ、ソースホストディレクトリパス、およびターゲットディレクトリパスです。ターゲットパスはコンテナ内のシンボリックリンクになります。
以下に、Windows 10ホスト内のE:\全体をLinuxコンテナ内の/home/TESTディレクトリとして表示する例が示されています。
ホストフォルダをマウントしようとすると、Docker Desktopは以下のように、このドライブをDockerコンテナと共有するための許可を求めます。

先に説明したように、Windows 10フォルダ内にfile.txtファイルを作成した場合、cat /home/TEST/input/file.txt
を実行します。内容が表示されることがわかります。
今、作成したinputフォルダを削除し、cat ...
コマンドを再実行します。シェルがファイルが存在しないと報告するのを確認してください。

ネットワークポートのマッピング
Windows上のDockerがネットワーキングをどのように処理するかを知るためにもう一つ重要な概念を紹介します。簡単な紹介として、コンテナで実行されているウェブサービスにローカルホストからアクセスするためにはどのような手順が必要か見てみましょう。
まず、例として実行されるデモイメージをスピンアップします。ダウンロードしてDockerイメージ、dockersamples/static-siteを実行します。これにはdocker container run
を使用します。
以下のコマンドは一度に4つのアクションを行います:
- Docker Hubからstatic-siteという名前のDockerイメージをdocker-samplesディレクトリにダウンロードします。
- static-siteイメージからコンテナインスタンスを起動します。
- コンテナをターミナルのフォアグラウンドから即座に切り離します(
--detach
)。 - 実行中のコンテナのネットワークポートをWindows 10ホストからアクセス可能にします(
--publish-all
)。
実行後、Dockerは以下に示すように起動したコンテナのIDを返します。

ネットワークポートの公開
--publish-all
パラメータを使用すると、ローカルホストのポートがコンテナのネットワークスタックにマッピングされます。 docker ps
サブコマンドを使用して、実行中のすべてのコンテナとそれぞれに割り当てられたポートをリストアップすることができます。以下の例では、1つのコンテナがホストポート32777をコンテナポート80にマッピングし、ホストポート32776をコンテナポート443にマッピングしています。

Windows上のDockerは、--publish-all
パラメータを使用するとコンテナにランダムなポートを割り当てますが、明示的に指定しない限り、ポートを割り当てます。
今、ウェブブラウザを開き、http://localhost:32777に移動するか、Dockerがポート80にマッピングしたポートをdocker ps
で出力して確認してください。うまくいけば、以下のウェブページが表示されるはずです。

公開ポートの変更
今、Docker on Windowsで実行されているDockerコンテナが、シンプルなウェブページを提供しています。おめでとうございます!しかし、--publish-all
に頼らず、ランダムなポートの選択に依存せずに特定のポートバインディングを指定する必要があります。問題ありません。 -p
パラメータを使用します。
まず、コンテナの一意のIDを指定して実行中のコンテナを停止します。このコンテナIDは、docker ps
を実行して確認できます。コンテナIDを確認したら、コンテナを停止し、Dockerに特定のポートを割り当てるように指定して新しいコンテナを起動します。
ポートを指定するための構文は<外部ポート>:<コンテナポート>
です。公開したいポートごとに、以下に示すように外部ポート番号とコンテナポート番号を使用して、--publish
または-p
スイッチを使用してください。
コンテナIDを指定する場合、一意に識別するためにIDの一部のみを入力する必要があります。1つのコンテナのみを実行しており、そのIDが
f766f4ac8d66bf7
である場合、f
を含む任意の文字でコンテナを識別することができます。入力する内容は、単一のコンテナを一意に識別できることが要件です。
今、ウェブブラウザに移動してlocalhost:1337
にアクセスしてください。イメージは変更しないでください。常にポート80でリッスンしています。変更するのは、コンテナへの接続を可能にするDockerの設定でのポート変換ルールです。

すべてのコンテナの停止
docker stop
を使用してコンテナを停止できますが、複数のコンテナを一度に停止する方法はありますか?複数のコンテナIDをスペースで区切って指定する方法があります。以下に、IDがfd50b0a446e7
、36ee57c3b7da
、7c45664906ff
の3つのコンテナを停止する例を示します。
PowerShellでDockerコンテナを管理している場合、すべてのコンテナを停止するためのショートカットも利用できます。PowerShellのコマンド展開を使用して、
docker ps -q
を停止パラメータに渡すことで、コンテナIDのリストを取得します。docker stop (docker ps -q)
。
コンテナが停止していることを確認するために、docker ps
と入力してもコンテナが表示されないことを確認してください。
クリーンアップ
いくつかのコンテナイメージをダウンロードし、停止したコンテナを実行しました。それらは停止しているにもかかわらず、ローカルホストディスク上の割り当てられたストレージは消えていません。スペースを解放し、作業スペースを散らかすことを避けるために、コンテナを削除する必要があります。
単一のコンテナを削除するには、以下のようにコンテナ削除のrm
パラメータを使用します。
また、停止したすべてのコンテナを削除するには、以下のようにprune
パラメータを使用します。