ログイン新規登録

Qiitaにログインして、便利な機能を使ってみませんか?

あなたにマッチした記事をお届けします

便利な情報をあとから読み返せます

48

Windows上でDocker環境を作成する方法とその構成

最終更新日 投稿日 2023年05月01日

概要

Windows環境でDockerイメージとコンテナーを取り扱うための環境のセットアップ手順と、その構成(Docker用語の定義を含む)を説明します。

Windows 10を前提としますが、Windows 11でも同様の見込みです。

本記事は「そのセットアップ手順で何が準備されるのか?」に注目して解説するので、
「セットアップできれば良い」を目的とする場合は冗長な内容となります。

なお、「Docker Desktopの利用条件」の説明は省略します(個人利用であれば無償で利用可能です)。

目的

本記事は以下を目的とします。

  • 「Windowsコンテナー利用」と「Windows上でコンテナー利用」での意図するところ違い、などのDocker用語に関する混乱を解消すること
  • Windows環境でLinuxコンテナーを動作する際の構成概要を把握し、Linux環境との差分を理解すること
  • Windows 10環境でDockerコマンドを利用できるようにセットアップすること

想定読者

  • Dockerとはなにか?は何となく理解しているが、実際にイメージ作成などはしたことがない方
    • 「Dockerとは、イメージを作成してコンテナーを起動できる環境」くらいの理解を想定
  • Windows 10環境でDocker開発をしたい方
  • Linux環境との差分が気になる方

動作環境(検証環境)

  • HW
    • Windows 10 Pro 22H2 (OSビルド19045) / Home 22H2 (OSビルド19045)
    • メモリ:16GB / 4GB
  • SW
    • Docker Desktop v4.16.3
    • WSL Ubuntu 22.04 LTS

(参考)Docker Desktop WSL2バックエンドのシステム要件

  • Windows 11 64ビット: HomeかProバージョン21H2以上、EnterpriseかEducationバージョン21H2以上
  • Windows 10 64ビット: HomeかPro 2004(ビルド19041)以上、EnterpriseかEducation 1909(ビルド18363)以上

ref. https://docs.docker.jp/desktop/windows/install.html#id3

Windows環境でのDockerの構成

Windows 10環境でDockerを利用するには、次のものを準備します。

  • Windows Subsystem for Linux 2(以降、WSL2と略記)
    • Docker Hostが動作するためのホストOS環境
  • Docker Host
    • Dockerイメージ作成やコンテナー起動するための基盤
  • Docker Client
    • Dockerイメージやコンテナーを操作するためのI/F

WSL2はWindows 10のオプション機能(設定で有効化する)として導入でき、
Docker HostとDocker Clientは「Docker Desktop for Windows」を用いて導入できます。

Dockerの構成要素とは?

本節では、Docker周りの用語の整理をします。

単純に、Docker環境をセットアップすることが目的の場合は、
後半の節「Docker環境のセットアップ手順」まで読み飛ばしてください。

言葉の整理

本記事では、次の左列の用語はぞれぞれ右列を意図する、とします。

用語 意味するところ
Dockerで開発 DockerのLinuxコンテナーを利用して開発
Dockerコンテナー DockerのLinuxコンテナー
Docker Desktop Docker Desktop WSL2バックエンド

わざわざ断ったのは、これらの用語に次のような揺れがあるためです。

  • 「Dockerコンテナー」には、「DockerのLinuxコンテナー」と「DockerのWindowsコンテナー」がある
  • 「Docker Desktop」は「Windows向け」と「Mac向け」があり、且つ「Windows向け」には「Windows Hyper-V向け」と「WSL2向け」がある

「Docker」とは「Docker社(旧dotCloud)が開発するコンテナーのアプリケーション実行環境を管理するオープンソースソフトウェア(OSS)」1です。
「Dockerコンテナー」とは「Dockerにおけるコンテナー実装」であり、「コンテナー」は「コンテナー型仮想化技術」のことです。
「コンテナー」はWindowsにおける実装である「Windowsコンテナー」とLinuxにおける実装である「Linuxコンテナー」があり2、一般には「Linuxコンテナー」のことを指す場合が多いです。多いですが、両者があり得るため上述のように整理しました。なお、Docker自体は「Linuxコンテナー」だけなく「Windowsコンテナー」もサポートしています。
「Linuxコンテナー」は、UNIX系のOS3が有する「namespaces」と「cgroups」という機能に基づいたコンテナー実装であり、その実装形式はいくつの種類があります。
「Dockerコンテナー」は「DockerによるLinuxコンテナー実装」を意味します。

Windows上でLinuxコンテナーを動作させるには?

次の2つのいずれかの方法を用いることで、Windows上で「Dockerコンテナー」(Linuxコンテナー)を動作できます。

  • Hyper-Vの上にLinux OSをインストールしたうえで、そのLinux OS環境にDockerをインストールする
  • WSL2の上にLinux OSをインストールしたうえで、そのLinux OS環境にDockerをインストールする

「Docker Desktop」は双方の形式へのセットアップをサポートしています。
前者はHyper-Vが必須となるため、Proエディション以上が必須です。
後者はWSL2が必須ですが、WSL2はWindows 10 Homeでも利用可能であるためエディションを問わずに利用可能です。
本記事では、Windows 10 Pro版に限らずWindows 10 Home版でも動作な後者の「Docker Desktop WSL 2バックエンド」を採用するものとします。

Docker環境の構成

「Docker」は「コンテナーの実行環境とその管理ツール」の一式です。
クライアント・サーバーアーキテクチャを有しており、Dockerコンテナーの起動やその元となるDockerイメージの作成と管理等を行う基盤である「Docker Host」と、Dockerイメージの配布のための格納場所である「Registry」、そしてDocker Hostに対して操作の指示をするためのコマンドライン・インターフェイスである「Docker Client」と言う構成を取ります。

  • Docker Host
    • Docker daemon
      • Docker Clientからの指示を受けて、Docker Objectsの操作と管理を行う
      • Docker Clientからの指示に従い、Docker ImageをRegistryへ格納する
    • Docker Object
      • Docker Image
      • Docker Container
  • Docker Client
    • Docker CLIコマンド
      • docker build
      • docker image [コマンド]
      • docker container [コマンド]
      • docker compose [コマンド]
      • ・・・
    • 定義ファイル
      • dockerfile
      • compose.yml
  • Registry
    • Docker Hub
    • (AWS ECR)
    • (Azure Container Registory)

Windows 10環境でDockerを用いた開発を行うには、上記のうち「Docker Host」と「Docker Client」をセットアップします。4

Docker HostとDocker Clientの導入方法

Docker Desktopを用いると、Windows 10環境へ容易に「Docker Host」と「Docker Client」の一式をセットアップできます5。一式には次のものが含まれています。

  • Docker daemon
  • Docker CLI
  • Docker Composeプラグイン
  • Kubernetes
  • ・・・

したがって、Dockerイメージの作成とコンテナーの起動といった基本操作だけでなく、複数コンテナーの起動管理(Compose)や、コンテナーの運用管理(Kubernetes)も行えるようになります6

また、Windowsコマンドライン上で動作する「Docker CLI」も提供してくれるため、「WSL2環境で動作しているDocker Host(Docker daemon)」にたいして「Windows 10コマンドラインで動作するDocker Client」から操作を行えるようになります。WSL2を意識せずに行えるため、便利です。

windows-wsl2-docker.png

Docker Desktopを用いず、WSL2環境へ直接Docker HostとDocker Clientをセットアップすることもできますが、その場合は「Linux上でコマンドラインからDockerをセットアップする」ことと同義となります。したがって、複数のモジュールを順にインストールしサービスの開始処理する等の手間がかかります7。Windows 10での利用に際して、開発に必要なモジュール一式をまとめてセットアップしてくれるDocker Desktopを用いる方法を、本記事では採用します。

Docker環境のセットアップ手順

次の順に、必要モジュールのセットアップを行います。

  1. WSL2を有効化し、Ubuntuをダウンロードしてセットアップする
  2. Docker Desktop (Docker Desktop for Windows) をインストールする

セットアップ途中で、Ubuntuでのログインユーザー名称とパスワードの設定を求められますので、あらかじめ準備しておいてください(任意のユーザー名とパスワードで構いません)。

WSL2の有効化とUbuntuのセットアップ

※すでに「WSL1を利用中」の環境の場合は手順が異なります。節「(補足)WSL1をすでに利用中の場合のWSL2有効化の方法」を参照してください。

Docker Desktopのインストールを行う前にWSL2を有効化し、Linuxのディストリビューションをセットアップします8。具体的には次のようにします。

1. 管理者権限のコマンドラインを開き、次のコマンドを実行します9

wsl --install

2. LinuxのUbuntuディストリビューションのダウンロードとインストールまでが自動で実行され、OS再起動を要求されます。要求メッセージに従いOSを再起動します。

C:\Windows\system32>wsl --install
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム  はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム  はインストールされました。
インストール中: Ubuntu
Ubuntu はインストールされました。
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。

C:\Windows\system32>

3. OS再起動後、自動でUbuntuインストールの続きが始まります(数分かかります)。完了するとUbuntuで利用するユーザー名とパスワードの設定を求められるので、任意の値を入力します。

  • ここで設定したユーザー名とパスワードは忘れないようにしてください(本記事の解説の範囲内では利用しませんが、その後のDocker開発でWSL2上で操作をする際には必要となることがあります)
    Ubuntuでのユーザー名とパスワードを設定

4. 「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」をダウンロードして実行します。

5. (念のため)OSを再起動しておきます。

以上でWSL2側の準備は完了です。次は節「Docker Desktopのインストール」に進みます。

(補足)「wsl --install」コマンドで実施されること

コマンド「wsl --install」によって実行される内容は次の3つです10

a) Linux用Windowsサブシステムの有効化
b) 仮想マシンの機能の有効化
c) Ubutunのダウンロードとインストール

最初の2つの設定変更の操作は、管理者権限のコマンドラインから次のように行うことができます。

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

この2つのコマンド操作は、以前はコントロールパネルから次の設定で操作を案内されていた内容と等しいです。

Windowsの機能でWSLとVMを有効化する

(補足)WSL1をすでに利用中の場合のWSL2有効化の方法

すでにWSL1を利用中の場合(インストール済みの場合)、コマンド「wsl --instal」でのインストールは動作しません。実行すると「WSLヘルプ」のテキストが表示されてしまいます。

この場合は、この場合は、次の節「WSL1利用中の環境にWSL2を追加する(有効化する)」から説明する手順でWSL2に必要な設定を明示的に有効化したのちにWSL2用のUbuntuをインストールします11 12

なお、WSL1とWSL2は共存が可能です(WSL2有効化後の、WSL1の起動方法は後述)。ただしWSL1でのDocker動作は保証されないので注意ください(少なくとも当方の環境では、WSL2追加後は動作しなくなりました)。

WSL1利用中の環境にWSL2を追加する(有効化する)

WSL1が存在する環境に、WSL2用の設定を追加する手順は次です。

  1. 仮想マシンの機能を有効にする(WSL1では不要だったので改めて有効化)13
  2. 「x64マシン用WSL2 Linuxカーネル更新プログラム パッケージ」をインストール14
  3. WSL 2を既定のバージョンとして設定する15

具体的には次のようにします。

管理者権限のコマンドラインから次のコマンドを実行します。

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

続いて、x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージをダウンロードして実行後、OSを再起動します。

再起動を終えたら、コマンドラインから次のコマンドを実行します。

wsl --set-default-version 2

以上で、WSL2の有効化は完了です。
次のコマンドを実行すると、セットアップされているディストリビューションの一覧を確認できます。

wsl --list -v

WSL2用のディストリビューションのセットアップ前なので、WSL1の既存のディストリビューションのみが表示されるはずです。WSL1のディストリビューションが仮に「Ubuntu-16.04」の場合は、次のコマンドで「WSL1としての起動」が可能です。

wsl -d Ubuntu-16.04

続いて、WSL2用ディストリビューションの追加へ進みます。

WSL2用のUbuntuを手動セットアップ

コマンドラインから次のコマンドを実行して、UbuntuのWSL2向けディストリビューションをインストールします。

wsl --install -d Ubuntu

ダウンロード処理が走るので、しばらく待ちます。
WSL2用のUbuntuインストール処理

完了すると、WSL1とWSL2が同居した状態になります。

C:\WINDOWS\system32>wsl --list -v
  NAME            STATE           VERSION
* Ubuntu-16.04    Stopped         1
  Ubuntu          Stopped         2

コマンドラインで単純に「wsl」と打った場合は、「*」がついているデフォルトのディストリビューションが起動します16
次のコマンドを実行して、デフォルトを先ほどインストールしたWSL2モードのUbuntuへ変更しておきます。

wsl --set-default Ubuntu

最後に、WSL2で利用するディストリビューションを最新化するために、次のコマンドを実行します(この「最新化」はWSL2が対象です)。

wsl --update

Docker Desktopのインストール

次のURLページの案内(節「ダウンロード」のところ)にしたがって飛んだ先のページから
「Docker Desktop for Windows」をダウンロードします。

先のページ内に記載の

インストールする前に、以下の手順を完了している必要があります

の内容は、先の節「WSL2の有効化とubuntuのセットアップ」で実施済みの内容です。なので、ダウンロードしたexeファイルをそのまま実行してインストールに進みます17

Docker Desktopのインストール中に「WSL2を有効化するか?(WSL2を利用するか?)」を聞いてくる画面が出たら画面の案内にしたがってWSL2の利用を選択します(Home等で選択の余地がない場合は選択肢は出ません)18

次の画面が出ればインストールは完了です。画面の要求にしたがってログアウトした後、再ログインします。

Docker Desktopインストール完了

このあとに、利用規約への同意確認ダイアログが表示させるので、内容を読んで同意します。

Docker Desktopのメニューから「Setting > General > Start Docker Desktop when you log in」を確認します。この設定のデフォルトが「On(OSアカウントへログイン時にDocker Desktopを起動する)」になっていることがあります。普段から恒常的にDockerコンテナーを起動することが目的でない限りは、普段は「起動しない」設定が望ましいでしょう19。このチェックを外すことで、「起動しない」設定にできます。最初から外れている場合はそのままで設定を閉じます。

以上で、Docker Desktopのセットアップは完了です。
これで、WindowsのコマンドラインからDockerコマンドを叩けるようになりました。

Docker環境の動作確認

Dockerイメージ「docker/getting-started」からDockerコンテナーを起動することで、環境の動作確認をします。具体的には、Docker Desktopのトップ画面に案内のある次のコマンドをコピーして、コマンドラインで実行します。

docker run -d -p 80:80 docker/getting-started

Docker DesktopのHello World

初回はイメージのダウンロードが走ります(60MBくらい)。

C:\Users>docker run -d -p 80:80 docker/getting-started
Unable to find image 'docker/getting-started:latest' locally
latest: Pulling from docker/getting-started
c158987b0551: Pull complete
1e35f6679fab: Pull complete
cb9626c74200: Pull complete
b6334b6ace34: Pull complete
f1d1c9928c82: Pull complete
9b6f639ec6ea: Pull complete
ee68d3549ec8: Pull complete
33e0cbbb4673: Pull complete
4f7e34c2de10: Pull complete
Digest: sha256:d79336f4812b6547a53e735480dde67f8f8f7071b414fbd9297609ffb989abc1
Status: Downloaded newer image for docker/getting-started:latest
c6cbdb95486e2447d0628dcc8f5af8a5c330df2c19bde38a24e30fa4b0ddf9f0

ブラウザで次のURLへアクセスすると、先のコマンドで実行したコンテナー「docker/getting-startd」で提供されるWebサイトが表示されます。

http://localhost/

起動中のコンテナーはDocker Desktopの「コンテナー」タブに表示されます。「■」ボタンを押して停止することが出来ます。

Docker Desktopからコンテナーを停止

以上です。

トラブルシューティング

Docker Desktop起動時に次のようなエラーダイアログが出て起動しないことがあります。

A timeout occured while waiting for a WSL integration agent to become ready.
Docker.Core.HttpBadResponseException:

Docker Desktop起動しない

この現象となる原因は様々らしいですが、当方の環境では次の手順を実施すると解決できたので、記載しておきます20

  1. Docker Desktopを終了する
  2. WSL2をコマンド「wsl --shutdown」で明示的に終了する
  3. 管理者権限のコマンドラインから「netsh winsock reset」を実行して、Windows Sockets APIの設定情報を初期化
  4. 念のためOSを再起動
  5. Docker Desktopを改めて起動

ref. https://github.com/docker/for-win/issues/13236

  1. Docker is an open platform for developing, shipping, and running applications. https://docs.docker.com/get-started/overview/

  2. より正確には、「LinuxやFreeBSDにおける実装があり」と言う記載すべきだが、基づく技術が同一のため略する。

  3. Linux、FreeBSD、macOS、SolarisなどOSのこと。

  4. サーバークライアント型アーキテクチャのため「Docker Host」と「Docker Client」は同一環境にある必要はありません。両者はREST APIで通信する仕様であり、通信が可能であれば異なる環境に導入できます。今回はとくに分ける必要もないので、同一の環境に導入します。 - https://docs.docker.com/get-started/overview/#docker-architecture

  5. Docker Desktop is a one-click-install application for your Mac, Linux, or Windows environment that enables you to build and share containerized applications and microservices. - https://docs.docker.com/desktop/

  6. Docker Desktop includes the Docker daemon (dockerd), the Docker client (docker), Docker Compose, Docker Content Trust, Kubernetes, and Credential Helper. - https://docs.docker.com/get-started/overview/#docker-desktop

  7. sudo apt-get install docker-engineでDocker daemonとDocker CLIのCore部分をインストールし、sudo apt-get install docker-compose-pluginでDocker CLIのCompose機能をインストールし、、、とDockerの機能構成を理解して進める必要があります。- https://docs.docker.jp/compose/install/compose-plugin.html

  8. Docker Desktop WSL 2バックエンドをインストールする前に、以下の手順を完了している必要があります。- https://docs.docker.jp/docker-for-windows/wsl.html

  9. このコマンドにより、WSL2動作に必要な設定が行われ、LinuxのUbuntuディストリビューションがインストールされます - https://learn.microsoft.com/ja-jp/windows/wsl/install

  10. コマンド「wsl --install」を使用する代わりに、以前のバージョンのWSLの手動インストール手順を行う場合。 - https://learn.microsoft.com/ja-jp/windows/wsl/install-manual

  11. wsl --installコマンドが利用できるようになる前にWSLを手動でインストールした場合は、WSL2で使用される仮想マシンのオプション コンポーネントを有効に - https://learn.microsoft.com/ja-jp/windows/wsl/install#upgrade-version-from-wsl-1-to-wsl-2

  12. 【検索して】WSL1とWSL2の共存【なぞっただけ】 - https://qiita.com/query1000/items/04409b8e28793a9407d0

  13. https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-3---enable-virtual-machine-feature

  14. https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

  15. https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-5---set-wsl-2-as-your-default-version

  16. 任意のディストリビューションを起動するには、「wsl -d Ubuntu-16.04」などのように「NAME」を明示的に指定する。

  17. 稀に?インストーラーが起動エラーする場合がある。その場合は、すこし古いバージョンに遡って取得して実施する。

  18. インストール完了後に変更することも可能。Docker Desktopのメニューから「Setting > General > User WSL 2 based engine(WSL2対応エンジンを使う)」で切り替える。

  19. WSL2のLinux OSが意図せずメモリを確保してしまい、他の作業が圧迫される、ようなことが起こるためです(デフォルト設定では、実装メモリの80%まで確保し得る)。適切に設定でガードはできますが、使う時だけ明示的に起動する運用を筆者はしています。

  20. 「WSL2バックエンドへのAgent構築がタイムアウト」というエラー内容なので、WSL2とWindows側のモジュールとの通信エラーと推定される。Host/Client間の通信がREST APIであるので恐らく他も順じているだろうと推測できるので、Windows Sockets APIの設定初期化と言うアプローチは、まぁ妥当?

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
  3. ダークテーマを利用できます
ログインすると使える機能について

コメント

この記事にコメントはありません。

いいね以上の気持ちはコメントで

Qiita Conference 2024 4月17日(水)~19(金)開催!

Qiita Conferenceは、Qiita最大規模のテックカンファレンスです!

基調講演ゲスト(敬称略)

牛尾剛、 けんすう、 ゆる言語学ラジオ、 田中邦裕、小城久美子、 飯沼亜紀

48

新規登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる

ソーシャルアカウントでログイン・新規登録

メールアドレスでログイン・新規登録