はじめに
Windows で Docker を使うと、なぜ Linux コンテナが動くのか
この記事では、Docker Desktop for Windows の内部構造を解説し、実際にDocker Desktopのセットアップ、nginx コンテナを使って Web サイトを公開するまでの流れを紹介します
この記事で分かること
- Docker Desktop for Windows が Linux カーネルを使う仕組み
- WSL2 の役割と内部構造
- Docker Desktop のインストール手順
- nginx コンテナを使った Web サイト公開の実践
Windows で Docker を使うと、なぜ Linux コンテナが動くのか
結論:Linux カーネルは含まれている
Docker Desktop for Windows には Linux カーネルが含まれています
ただし、それは Windows カーネルとは別に、WSL2(Windows Subsystem for Linux 2) の中で動作する軽量仮想マシンの一部として存在します
全体構造
[物理マシン]
│
├─ [Windows 10/11 カーネル]
│ └─ WSL2(軽量VM)を管理
│
└─ [WSL2 環境]
├─ Linux カーネル(Microsoft 提供)
├─ docker-desktop(Docker Engine 実行環境)
├─ docker-desktop-data(イメージ・ボリューム保存)
└─ Ubuntu / Alpine などの Linux ディストリビューション
つまり、Windows 上で docker run ubuntu を実行すると、内部的には WSL2 の Linux カーネル上でコンテナが動いている のです
WSL2 の Linux カーネル
WSL2 は 本物の Linux カーネル をマイクロ VM 上で実行しています
このカーネルは Microsoft が独自にビルド・署名しており、Windows Update で自動更新されます
カーネルバージョンの確認方法
wsl --status
出力例:
Default Version: 2
Kernel version: 5.15.153.1-microsoft-standard-WSL2
これが Docker Desktop が利用している 実際の Linux カーネル です
※wslのインストール(wsl --install)が必要
Docker Desktop の内部構成
コンポーネント一覧
| コンポーネント | 役割 |
|---|---|
docker-desktop |
Docker Engine (Linux版) を実行する WSL2 環境 |
docker-desktop-data |
イメージ・ボリューム・設定データを保存 |
| Windows Docker CLI |
docker.exe コマンドを Windows 上から実行。内部的には WSL2 の Docker Engine にリクエストを送る |
実行フロー
[Windows PowerShell]
↓ docker run ubuntu
[docker.exe (Windows CLI)]
↓ API リクエスト
[Docker Engine (WSL2 内の Linux)]
↓ コンテナ起動
[Linux カーネル (WSL2)]
↓ namespace, cgroup で隔離
[Ubuntu コンテナ実行]
WSL1 と WSL2 の違い
| バージョン | 動作方式 | Linux カーネル | Docker 対応 |
|---|---|---|---|
| WSL1 | Linux API を Windows カーネルでエミュレート | なし | 非対応 |
| WSL2 | 本物の Linux カーネルを VM 内で起動 | あり | 対応(推奨) |
Docker Desktop のインストール
前提条件
- Windows 10 バージョン 2004 以降、または Windows 11
- BIOS で仮想化が有効になっていること
- 管理者権限
インストール手順
1. インストーラーのダウンロード
Docker Desktop 公式サイト から Windows 版をダウンロードします。
2. インストール実行
- ダウンロードした
Docker Desktop Installer.exeを実行 - 「Use WSL 2 instead of Hyper-V」にチェックが入っていることを確認
- 「OK」をクリックしてインストール開始
- インストール完了後、再起動を求められたら再起動
3. Docker Desktop の起動
- スタートメニューから「Docker Desktop」を起動
- 初回起動時、利用規約に同意
- タスクバーに Docker アイコン(🐳)が表示され、「Docker Desktop is running」となれば成功
参考:KAGOYA 公式ガイド
PATH の確認
Docker のバイナリは以下に配置されます:
C:\Program Files\Docker\Docker\resources\bin
通常、インストール時に自動的に PATH が設定されます
動作確認
PowerShell または VSCode のターミナルで以下を実行:
# Docker のバージョン確認
docker --version
正常に動作すると、以下のようなメッセージが表示されます:
Docker version 28.5.1, build e180ab8
Linux カーネルの実体
カーネルファイルの場所
デフォルトでは以下に格納されています:
C:\Windows\system32\lxss\tools\kernel
カスタムカーネルの指定
独自ビルドの Linux カーネルを使用する場合、.wslconfig で指定できます
ファイル: C:\Users\<ユーザー名>\.wslconfig
[wsl2]
kernel=C:\\custom\\path\\vmlinux
memory=4GB
processors=2
設定後、WSL2 を再起動:
wsl --shutdown
Windows コンテナモードとの違い
Docker Desktop には 2つのモード があります
| モード | 動作カーネル | コンテナの種類 | 主な用途 |
|---|---|---|---|
| Linux コンテナモード(デフォルト) | WSL2 の Linux カーネル | nginx, mysql, ubuntu など | 一般的な開発環境 |
| Windows コンテナモード | Windows カーネル | Windows Server Core / Nano Server | .NET Framework アプリなど |
モード切り替え方法
- タスクバーの Docker アイコン(🐳)を右クリック
- 「Switch to Windows containers」を選択
- 再度切り替えで「Switch to Linux containers」
なぜ Linux カーネルが必要なのか?
Docker コンテナは以下の Linux カーネル機能 に依存しています:
- namespace: プロセス・ネットワーク・ファイルシステムの隔離
- cgroup: CPU・メモリなどのリソース制限
- overlayfs: レイヤー型ファイルシステム
これらは Windows カーネルには存在しないため、WSL2 の Linux カーネル が必要になります。
実践:nginx コンテナで Web サイトを公開
ここからは、実際に Docker Hub から nginx イメージを取得し、Web サイトを公開する手順を解説します
1. nginx イメージの取得
Docker Hub から公式の nginx イメージをダウンロードします
docker pull nginx
ダウンロード状況が表示され、完了すると以下で確認できます
docker images
出力例:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest a72860cb95fd 2 weeks ago 188MB
2. nginx コンテナの起動
nginx コンテナを起動し、ポート 8080 で公開します
docker run -d -p 8080:80 --name my-nginx nginx
オプションの意味
-
-d: バックグラウンドで実行(デタッチモード) -
-p 8080:80: ホストの 8080 ポートをコンテナの 80 ポートにマッピング -
--name my-nginx: コンテナに名前を付ける -
nginx: 使用するイメージ名
3. 動作確認
ブラウザで以下にアクセス
http://localhost:8080
次のようにnginx のデフォルトページ「Welcome to nginx!」が表示されれば成功です
4. カスタム HTML の配置
独自の HTML ファイルを表示させる方法を2つ紹介します
方法1:ボリュームマウント
ホストの HTML ファイルをコンテナにマウントします
# 作業ディレクトリを作成
mkdir C:\docker-nginx
cd C:\docker-nginx
# index.html を作成
echo "<h1>Hello from Docker!</h1>" > index.html
# コンテナを起動(ボリュームマウント)
docker run -d -p 8080:80 --name my-nginx -v C:\docker-nginx:/usr/share/nginx/html nginx
※コンテナ起動中であれば停止後、削除すること
docker stop my-nginx
docker rm my-nginx
方法2:実行中のコンテナにファイルをコピー
# HTML ファイルを作成
echo "<h1>Hello from Docker!</h1>" > index.html
# 実行中のコンテナにコピー
docker cp index.html my-nginx:/usr/share/nginx/html/index.html
# nginx をリロード(必要に応じて)
docker exec my-nginx nginx -s reload
ブラウザをリロードすると、次のようにカスタム HTML が表示されます
5. コンテナの管理
コンテナの一覧表示
docker ps
コンテナの停止
docker stop my-nginx
コンテナの再起動
docker start my-nginx
コンテナの削除
# 停止してから削除
docker stop my-nginx
docker rm my-nginx
イメージの削除
docker rmi nginx
6. ログの確認
コンテナのログを確認する方法
# 全ログを表示
docker logs my-nginx
# リアルタイムでログを表示
docker logs -f my-nginx
まとめ
- Docker Desktop for Windows は WSL2 上の Linux カーネル を使用
- Windows カーネルとは別に、本物の Linux カーネル が動いている
- Linux コンテナは WSL2 の Linux カーネル上 で実行される
- Windows コンテナモードに切り替えると Windows カーネル を使用
トラブルシューティング
Docker が起動しない
# WSL2 が有効か確認
wsl --status
# WSL2 を再起動
wsl --shutdown
WSL2 が無効になっている
# WSL を有効化
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 仮想マシンプラットフォームを有効化
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# 再起動後、WSL2 をデフォルトに設定
wsl --set-default-version 2
Docker コマンドが見つからない
PATH が通っているか確認
$env:Path -split ';' | Select-String docker
通っていない場合、以下を追加
C:\Program Files\Docker\Docker\resources\bin
次のステップ
Docker Compose で WordPress 環境を構築する方法【複数コンテナ構成】

