WindowsでのDocker?今すぐ学習を始めましょう または…!

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と表示される必要があります。
Enabled BIOS virtualization shown in Windows Task Manager

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コンテナを使用します。

Installing Docker Desktop

インストールが完了したら、コンピューターを再起動してください。

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

Switching to Windows containers

Chocolateyを使用する

Docker Desktopをダウンロードしてインストールする別のオプションは、Chocolateyを使用することです。 Chocolateyは、ダウンロードとインストールの多くのタスクを自動化します。これを行うには、管理者としてコマンドラインコンソール(cmdまたはPowerShellのいずれか)を開き、以下のコマンドを実行してプログラムを一括でダウンロードしてインストールします。

choco install docker-desktop

完了したら、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コマンドを実行します。すべてがうまくいっていれば、以下のような出力が表示されます。

A successful test image run via Docker Desktop

Dockerコンテナ内でのコマンドの実行

Docker Desktopがインストールされ、すべてが正常に動作していることを確認しましたか?それでは、Windows上でDockerを始めるために、Dockerコンテナで実行する一般的なタスクの1つはコマンドを実行することです。 docker runコマンドを介して、ホスト(Windows 10 PC)から直接実行中のコンテナにコマンドを送信することができます。

docker runを使用してコンテナ内でコマンドを実行するには、まずイメージ名を指定し、その後にコマンドを指定します。はじめに、Dockerに以下のようにalpineという名前のコンテナ内でhostnameコマンドを実行するように指示します。

> docker run alpine hostname
b74ff46601af

現在、コンピュータにalpine Dockerイメージがないため、Windows上のDockerはDocker Hubからその小さなイメージをダウンロードし、そのイメージからコンテナを起動し、コマンドを直接コンテナに送信し、一括でシャットダウンします。

コンテナを実行し続ける場合は、-itパラメータを使用することもできます。このパラメータは、コンテナを「インタラクティブモード」で維持し、コマンドの実行後もフォアグラウンドで実行し続けるようにDockerに指示します。ターミナルプロンプトが表示され、すぐに使用できることがわかります。

> docker run -it alpine sh
/ #

ターミナルで作業が完了したら、exitと入力してWindows 10に戻ります。

コンテナ内からDockerホストのファイルにアクセスする方法

別の一般的なタスクは、コンテナからホストファイルにアクセスすることです。Windows上のDockerでは、デスクトップのフォルダパスをリンクして、そのフォルダをコンテナと共有することができます。このプロセスはバインディングと呼ばれます。

バインディングを作成するには、ローカルドライブにフォルダを作成します。この例では、E:\と呼ばれるフォルダを使用し、それをinputと呼びます。その後、フォルダ内にfile.txtという名前の新しいテキストドキュメントが作成されます。お好きなパスとファイルを使用してください。

ホストとコンテナの間で共有したいフォルダがある場合、Dockerは--mountパラメータを使用してフォルダをマウントする必要があります。 --mountパラメータには3つの引数が必要です。マウントタイプ、ソースホストディレクトリパス、およびターゲットディレクトリパスです。ターゲットパスはコンテナ内のシンボリックリンクになります。

以下に、Windows 10ホスト内のE:\全体をLinuxコンテナ内の/home/TESTディレクトリとして表示する例が示されています。

> docker run --mount type=bind,source="E:/",target=/home/TEST -it alpine

ホストフォルダをマウントしようとすると、Docker Desktopは以下のように、このドライブをDockerコンテナと共有するための許可を求めます。

Sharing a Docker drive

先に説明したように、Windows 10フォルダ内にfile.txtファイルを作成した場合、cat /home/TEST/input/file.txtを実行します。内容が表示されることがわかります。

今、作成したinputフォルダを削除し、cat ...コマンドを再実行します。シェルがファイルが存在しないと報告するのを確認してください。

Working with files in Docker containers

ネットワークポートのマッピング

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 container run --detach --publish-all dockersamples/static-site
同じことをする代替/省略構文:
## docker container run -d -P dockersamples/static-site
## docker run -d -P dockersamples/static-site

実行後、Dockerは以下に示すように起動したコンテナのIDを返します。

Docker container ID returned from running a container

ネットワークポートの公開

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

Showing port mapping of Docker container

Windows上のDockerは、--publish-allパラメータを使用するとコンテナにランダムなポートを割り当てますが、明示的に指定しない限り、ポートを割り当てます。

今、ウェブブラウザを開き、http://localhost:32777に移動するか、Dockerがポート80にマッピングしたポートをdocker psで出力して確認してください。うまくいけば、以下のウェブページが表示されるはずです。

Resulting webpage running in the Docker container

公開ポートの変更

今、Docker on Windowsで実行されているDockerコンテナが、シンプルなウェブページを提供しています。おめでとうございます!しかし、--publish-allに頼らず、ランダムなポートの選択に依存せずに特定のポートバインディングを指定する必要があります。問題ありません。 -pパラメータを使用します。

まず、コンテナの一意のIDを指定して実行中のコンテナを停止します。このコンテナIDは、docker psを実行して確認できます。コンテナIDを確認したら、コンテナを停止し、Dockerに特定のポートを割り当てるように指定して新しいコンテナを起動します。

ポートを指定するための構文<外部ポート>:<コンテナポート>です。公開したいポートごとに、以下に示すように外部ポート番号とコンテナポート番号を使用して、--publishまたは-pスイッチを使用してください。

> docker stop f766
> docker run --detach -p 1337:80 dockersamples/static-site

コンテナIDを指定する場合、一意に識別するためにIDの一部のみを入力する必要があります。1つのコンテナのみを実行しており、そのIDがf766f4ac8d66bf7である場合、fを含む任意の文字でコンテナを識別することができます。入力する内容は、単一のコンテナを一意に識別できることが要件です。

今、ウェブブラウザに移動してlocalhost:1337にアクセスしてください。イメージは変更しないでください。常にポート80でリッスンしています。変更するのは、コンテナへの接続を可能にするDockerの設定でのポート変換ルールです。

Webpage being served up on port 1337

すべてのコンテナの停止

docker stopを使用してコンテナを停止できますが、複数のコンテナを一度に停止する方法はありますか?複数のコンテナIDをスペースで区切って指定する方法があります。以下に、IDがfd50b0a446e736ee57c3b7da7c45664906ffの3つのコンテナを停止する例を示します。

> docker stop fd50 36ee 7c45

PowerShellでDockerコンテナを管理している場合、すべてのコンテナを停止するためのショートカットも利用できます。PowerShellのコマンド展開を使用して、docker ps -qを停止パラメータに渡すことで、コンテナIDのリストを取得します。 docker stop (docker ps -q)

コンテナが停止していることを確認するために、docker psと入力してもコンテナが表示されないことを確認してください。

クリーンアップ

いくつかのコンテナイメージをダウンロードし、停止したコンテナを実行しました。それらは停止しているにもかかわらず、ローカルホストディスク上の割り当てられたストレージは消えていません。スペースを解放し、作業スペースを散らかすことを避けるために、コンテナを削除する必要があります。

単一のコンテナを削除するには、以下のようにコンテナ削除のrmパラメータを使用します。

> docker container rm <container ID>

また、停止したすべてのコンテナを削除するには、以下のようにpruneパラメータを使用します。

> docker container prune

Source:
https://adamtheautomator.com/docker-windows/