「Docker run」で、Windowsが起動する世界へようこそ。
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
全8回にわたるWindows Server入門講座、ついに最終回です。
これまで、AD、ファイルサーバー、IIS、WSUSと、Windows Serverの「伝統的な役割」を学んできました。
しかし、時代は「コンテナ」です。
Linuxの世界では、WebサーバーもDBも当たり前のようにDockerコンテナで動かしていますよね。
「Windowsアプリもコンテナになればいいのに……」と思ったことはありませんか?
先生、それが一番の悩みです!
社内の古いASP.NETアプリ、VM(仮想マシン)で動かしてるんですけど、OSのパッチ当てとか再起動が面倒すぎて。
Linuxみたいに docker run 一発でIISが立ち上がれば、CI/CDパイプラインに乗せられるし、K8sで管理できるのに。
やっぱりWindowsは「重厚長大」なVMで運用するしかないんですか?
コウ君、諦めるのはまだ早いわ。
実はWindows Server 2016以降、OSレベルで「コンテナ」に対応しているの。
Linux上のDockerと同じコマンドで、Windowsアプリをコンテナ化できるのよ。
でも、Linuxコンテナとは「カーネルの扱い」が決定的に違うから、そこを理解しないと大怪我をするわ。
最後もウィンドウズ先生に締めてもらいましょう!
はい、ウィンドウズ先生です。
Linuxエンジニアの皆さんが大好きなDocker、実はWindowsでも(ほぼ)そのまま使えます。
しかし、Windowsコンテナには「プロセス分離」と「Hyper-V分離」という2つのモードがあり、さらに「OSバージョンの厳密な一致」という厳しい制約があります。
最終回は、これらWindowsコンテナ特有の落とし穴を回避し、レガシーなWindowsアプリをモダンなコンテナ基盤へと昇華させる技術を伝授します。
本記事では、Hyper-Vの基礎から、Windowsコンテナのアーキテクチャ、Dockerfileの書き方、そしてKubernetesでのハイブリッド運用までを徹底解説します。
🟦 Windows Server入門講座(全8回)完結!
現在地:【第8回】Hyper-Vとコンテナ。WindowsコンテナとDockerの共存戦略
- 【第1回】Linux脳を解き放て。GUIの誘惑とPowerShellという「武器」
- 【第2回】Active Directory (AD) 構築。世界を支配する認証基盤の仕組み
- 【第3回】ファイルサーバーと権限管理。chmod 777が存在しない世界(NTFS/ReFS)
- 【第4回】Windows版Webサーバー「IIS」入門。Nginx使いが知るべき作法の違い
- 【第5回】WSL2とWindows Terminal。Windows上でLinuxを飼い慣らすハイブリッド開発環境
- 【第6回】更新プログラムとの戦い。WSUS構築とWindows Updateの完全制御
- 【第7回】トラブルシューティングとイベントビューア。grepできないログをどう読むか
- 【第8回】Hyper-Vとコンテナ。WindowsコンテナとDockerの共存戦略
第1章:Hyper-Vの基礎。「Type 1」の威力
Windowsコンテナの話をする前に、その土台となる仮想化技術「Hyper-V」について理解しておく必要があります。
ホスト型 vs ハイパーバイザー型
- VirtualBox / VMware Workstation (ホスト型): OSの上にアプリとして仮想化ソフトが乗ります。手軽ですがオーバーヘッドが大きいです。
- Hyper-V (Type 1 ハイパーバイザー型): ハードウェアの直上でハイパーバイザーが動き、その上で「親パーティション(管理用Windows)」と「子パーティション(ゲストVM)」が動きます。
実は、Hyper-Vを有効にした時点で、あなたが操作しているWindows OS自体も、ハイパーバイザーの上で動く「特権的な仮想マシン」になっているのです。
これが、Hyper-Vが高性能である理由です。
ネストされた仮想化 (Nested Virtualization)
「VMの中でさらにHyper-Vを動かす」技術です。
これにより、Azure上のWindows VMの中でさらにDockerを動かしたり、WSL2を動かしたりすることが可能になります。
開発環境や検証環境では必須の技術です。
# PowerShellでネスト仮想化を有効にする(ホスト側で実行) Set-VMProcessor -VMName "Dev-VM" -ExposeVirtualizationExtensions $true
第2章:Windowsコンテナとは何か? Linuxコンテナとの違い
「Dockerコンテナ」と言った場合、通常はLinuxコンテナ(LCOW)を指しますが、Windowsコンテナ(WCOW)は中身が全く異なります。
| 項目 | Linuxコンテナ | Windowsコンテナ |
|---|---|---|
| カーネル | ホストのLinuxカーネルを共有 | ホストのWindowsカーネルを共有(またはHyper-Vで分離) |
| ベースイメージ | Alpine, Ubuntu (数MB〜数百MB) | Nano Server, Server Core (数百MB〜数GB) |
| 実行可能アプリ | Linuxバイナリ (ELF) | Windowsバイナリ (EXE, DLL) |
| 管理コマンド | docker, kubectl |
docker, kubectl (同じ!) |
つまり、Windowsコンテナの中身は「ミニマムなWindows OS」です。
そのため、IISや.NET Framework(非Core)、PowerShellなどがそのまま動作します。
第3章:2つの分離モード。「プロセス分離」と「Hyper-V分離」
Windowsコンテナには、Linuxにはない独自の概念「分離モード(Isolation Mode)」があります。
ここが最大のハマりポイントです。
1. プロセス分離モード (Process Isolation)
Linuxコンテナと同様に、ホストOSのカーネルを共有します。
メリット: 軽量、高速、メモリ効率が良い。
デメリット: ホストOSとコンテナイメージのビルド番号(例:10.0.20348)が完全に一致していなければ動かない。
この制約が極めて厳しいです。
ホストがWindows Server 2019なら、コンテナも2019でなければなりません。2022のコンテナは動きません。
2. Hyper-V分離モード (Hyper-V Isolation)
各コンテナを軽量なHyper-V仮想マシン(Utility VM)の中で動かします。
独自カーネルを持つため、ホストOSとのバージョン不一致が許容されます。
メリット: カーネルバージョンが違っても動く。セキュリティが高い。
デメリット: VMを立ち上げるため、起動が遅くメモリを食う。
💡 プロの選択基準
Windows Server上: デフォルトは「プロセス分離」。パフォーマンス重視ならこれ一択。ただしOSバージョンの管理が必要。
Windows 10/11上: デフォルトは「Hyper-V分離」。開発環境ではこちらが使われる(カーネル不一致が前提のため)。
第4章:Windows ServerへのDockerインストール
Windows ServerにDockerを入れる場合、「Docker Desktop」は使いません(GUIが必要で、サーバー向きではないため)。
Microsoftが提供するPowerShellモジュールを使って、エンジン(Docker EE/CE)のみをインストールします。
インストール手順(PowerShell)
# 1. コンテナ機能の有効化 Install-WindowsFeature -Name Containers Restart-Computer -Force # 2. Dockerプロバイダーのインストール Install-Module -Name DockerMsftProvider -Repository PSGallery -Force # 3. Dockerエンジンのインストール Install-Package -Name docker -ProviderName DockerMsftProvider Restart-Computer -Force # 4. 確認 docker version
これで、Linuxと同じ docker コマンドが使えるようになります。
第5章:実践!IISコンテナのビルドと実行
それでは、IISが動くWebサーバーコンテナを作ってみましょう。
ベースイメージには、GUIを含まない軽量な「Server Core」を使います。
Dockerfileの作成
Linuxでは RUN apt-get ... ですが、Windowsでは RUN powershell ... になります。
# ベースイメージ(ホストOSとバージョンを合わせる) FROM mcr.microsoft.com/windows/servercore:ltsc2022 # PowerShellをデフォルトシェルに設定 SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] # IISのインストール RUN Install-WindowsFeature -Name Web-Server # コンテンツの配置(index.htmlを書き換え) RUN Set-Content -Path "C:\inetpub\wwwroot\index.html" -Value "<h1>Hello from Windows Container!</h1>" # ポート公開 EXPOSE 80 # サービス監視(コンテナが終了しないようにする) CMD ["C:\\ServiceMonitor.exe", "w3svc"]
ビルドと実行
docker build -t my-iis . docker run -d -p 8080:80 --name iis-test my-iis
ブラウザで http://localhost:8080 にアクセスし、「Hello from Windows Container!」と表示されれば成功です。
VMを立てるよりも圧倒的に速く、IIS環境が手に入りました。
第6章:ベースイメージの罠。「Nano Server」vs「Server Core」
Windowsコンテナには主に2種類のベースイメージがあります。
1. Nano Server
- サイズ: 極小(圧縮後 100MB程度)。
- 特徴: 32bitアプリ非対応。.NET Core (modern .NET) アプリ専用。PowerShell Coreのみ搭載。
- 用途: Go, Node.js, .NET 6/7/8 などのモダンアプリ。
2. Server Core
- サイズ: 巨大(圧縮後 1.5GB〜3GB)。
- 特徴: 従来のWindows APIの大部分をサポート。IISや完全な.NET Frameworkが動く。
- 用途: 既存のレガシーアプリ(ASP.NET MVCなど)のコンテナ化。
💡 ウィンドウズ先生の注意喚起
Linuxエンジニアは「Alpine Linux(5MB)」の感覚でいると、Windowsコンテナのサイズ(GB単位)に腰を抜かします。docker pull が終わるまで数分かかることもザラです。
レガシー移行なら「Server Core」、新規開発なら「Nano Server」と使い分けることが、ディスク容量とデプロイ時間を守る鍵です。
第7章:Kubernetesでのハイブリッド運用
Windowsコンテナは、Kubernetesクラスターに参加できます。
これにより、LinuxノードとWindowsノードが混在する「ハイブリッドクラスター」が構築可能です。
TaintsとTolerations、NodeSelector
Linux用コンテナが間違ってWindowsノードにスケジューリングされないように(逆もしかり)、K8sのマニフェストで制御する必要があります。
apiVersion: v1
kind: Pod
metadata:
name: win-web
spec:
containers:
- name: iis
image: my-iis:latest
# Windowsノードでのみ実行する指定
nodeSelector:
kubernetes.io/os: windows
# WindowsノードのTaint(汚れ)を許容する設定
tolerations:
- key: "os"
value: "windows"
effect: "NoSchedule"
これにより、LinuxアプリはLinuxノードへ、WindowsアプリはWindowsノードへと、K8sが自動的に振り分けてくれます。
管理画面(Web UI)やDBはLinux、業務ロジックだけWindows、といった柔軟な構成が可能になります。
講座総まとめ:LinuxエンジニアがWindowsを知る意味
全8回の講座、本当にお疲れ様でした!
これまでの学びを振り返りましょう。
- 第1回: Windowsは「APIとオブジェクト」のOSであり、PowerShellが最強の武器であることを学びました。
- 第2回: 世界の認証基盤、Active Directoryの仕組みをLinux用語で解読しました。
- 第3回: NTFS権限とAGDLP戦略で、堅牢なファイルサーバーを構築しました。
- 第4回: IISのアプリケーションプールを知り、Webサーバーを自動構築しました。
- 第5回: WSL2によって、Windowsが最高のLinux開発機になることを体験しました。
- 第6回: WSUSとGPOで、勝手なアップデートを封じ込めました。
- 第7回: イベントビューアとパフォーマンスモニターで、障害の原因を突き止めました。
- 第8回: そして今回、Windowsコンテナでレガシー資産をモダンな基盤へ移行する道筋が見えました。
コウ君、そして読者の皆さん。
「Windowsは分からないから嫌い」という食わず嫌いは解消されましたか?
クラウド全盛の今でも、企業のオンプレミス環境にはWindows Serverが残り続けます。
LinuxもWindowsも両方分かり、それらを繋ぐことができるエンジニアこそが、これからの時代に求められる「真のフルスタックエンジニア」です。
この講座が、皆さんのキャリアの新しい武器になることを願っています。
先生たち、ありがとうございました!
もうWindows画面を見ても蕁麻疹が出なくなりました。
むしろPowerShellで自動化するのが楽しくなってきました!
これからはLinuxとWindows、二刀流で頑張ります!
これで「LinuxエンジニアのためのWindows Server入門講座」は完結です。
しかし、技術の進化は止まりません。Windows Server 2025、Azure Stack HCI、そしてAIとの統合。
学び続けることを止めないでください。
Happy Hacking Windows!
▼ Windowsコンテナを動かしてみる ▼
Docker環境を構築する
「おすすめVPS」
コンテナ技術を活かす
「ITエンジニア転職」



コメント