0. 前置き
本稿は Windows Server で「Windows コンテナ」の実行環境を構築します。
実行するコンテナを作成するために、Windows コンテナの作成環境も構築します。
Linux コンテナなら Linux / MacOS / Windows のどこでも実行できますが、
Windows コンテナは Windows / Windows Server だけが実行環境になります。
Windows コンテナは GUI を扱えません。実装するとしたら下記のようなものに使用できます。
Python や PHP を動作させるなら Linux を使用するので、Windows コンテナを動作させる場合は Microsoft のアプリに限定されます。
- Microsoft SQL Server
- PowerShell
- CUI アプリ (コマンドライン)
- IIS
- …その他、GUI を使用しない Windows 専用アプリ (NTLM 認証に密結合した CUI アプリ等 ← あるんかいな)
コンテナ機構は主にサービスとして提供されるものであり、Windows でサービスを提供することが前提となるので、Windows Server を使用します。
一方、コンテナ作成は主にクライアント PC で実施するため、作成と実行を分離して開発します。
したがって、以下の構成を想定しています。
注意:Windows Server では、いつもの GUI インストールは使用できません。
- コンテナ実行:Windows Server 2025
- コンテナ作成:Windows11
GUI 管理コンソールとして Portainer を動作させます。(Portaner もコンテナのひとつ)
デファクトである Docker が Windows Server 用の Docker Desktop を提供していない。
実行環境
項目 内容 備考 基本ソフト コンテナ実行 Windows Server 2025 Standard 24H2 本稿記述時の最新版 コンテナ作成 Windows11 Pro 25H2 コンテナエンジン Docker Engine - Community 29.7.2 確認用
コンテナイメージIIS (Web サーバ) iis:windowsservercore-ltsc2025 Windows コンテナは環境依存が強いためバージョンを指定している
LTSC: Long-Term Servicing ChannelPowerShell (REPL) powershell:nanoserver-ltsc2022
1. コンテナ作成・実行環境 (Docker Engine) をインストールする。
1-1. コンテナ機能を有効にするため、下記のどちらかを実行する。
1-1-a. … Windows Server 20251-1-a. コンテナ機能を有効にする。(Windows Server 2025 の場合)
1-1-b. … Windows11
1-1-b. コンテナ機能を有効にする。(Windows11 の場合)
− □ × >_ 管理者: Windows PowerShell × + | ∨
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows PS C:\> # コンテナ機能を有効化する PS C:\> Install-WindowsFeature -Name Containers ⏎ Success Restart Needed Exit Code Feature Result ------- -------------- --------- -------------- True Yes SuccessRest... {コンテナー} 警告: インストール処理を完了するには、このサーバーを再起動する必要があります。 PS C:\> # PC を再起動させる PS C:\> shutdown /r /t 0 ⏎
1-2. Docker の環境をインストールする。
− □ × >_ 管理者: Windows PowerShell × + | ∨
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows PS C:\> # コンテナ機能を有効化する PS C:\> Enable-WindowsOptionalFeature -All -Online ` -FeatureName Containers, Microsoft-Hyper-V ⏎ この操作を完了するために、今すぐコンピューターを再起動しますか? [Y] Yes [N] No [?] ヘルプ (既定値は "Y"): y ⏎ここで再起動する
Windows Server 2025 / Windows11 の両方で実施する。1-3. 動作確認をする。
− □ × >_ 管理者: Windows PowerShell × + | ∨
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows PS C:\> # Docker Engine をダウンロードする PS C:\> Invoke-WebRequest ` -UseBasicParsing "https://download.docker.com/win/static/stable/x86_64/docker-29.7.2.zip" ` -OutFile "docker.zip" ⏎ PS C:\> # Docker Engine を展開・設置する PS C:\> Expand-Archive -Path "docker.zip" -DestinationPath "C:\Program Files\" -Force ⏎ PS C:\> # Docker Engine のパスを設定する PS C:\> $env:Path += ";C:\Program Files\docker" ⏎ PS C:\> [Environment]::SetEnvironmentVariable("Path", $env:Path, [EnvironmentVariableTarget]::Machine) ⏎ PS C:\> # Docker Engine のバージョンを確認する (まだ Client だけ確認) PS C:\> docker version ⏎ Client: Version: 29.7.2 API version: 1.55 Go version: go1.26.5 Git commit: a7dcaa6 Built: Wed Aug 5 18:31:33 2026 OS/Arch: windows/amd64 Context: default failed to connect to the docker API at npipe:////./pipe/docker_engine; check if the path is correct and if the daemon is running: open //./pipe/docker_engine: The system cannot find the file specified. ↑ Docker Engine の起動前なので failed が表示されている PS C:\> # Docker Engine をサービスとして登録する PS C:\> & "C:\Program Files\docker\dockerd.exe" --register-service ⏎ PS C:\> # Docker Engine サービスを起動する PS C:\> Get-Service docker ⏎ Status Name DisplayName ------ ---- ----------- Stopped docker Docker Engine ← Stopped: 未起動 PS C:\> Start-Service docker ⏎ PS C:\> Get-Service docker ⏎ Status Name DisplayName ------ ---- ----------- Running docker Docker Engine ← Running: 起動した PS C:\> # Docker Engine のバージョンを確認する (Docker Engine も確認) PS C:\> docker version ⏎ Client: Version: 29.7.2 API version: 1.55 Go version: go1.26.5 Git commit: a7dcaa6 Built: Wed Aug 5 18:31:33 2026 OS/Arch: windows/amd64 Context: default Server: Docker Engine - Community Engine: Version: 29.7.2 API version: 1.55 (minimum version 1.40) Go version: go1.26.5 Git commit: 6a43e3d Built: Wed Aug 5 18:28:13 2026 OS/Arch: windows/amd64 Experimental: false PS C:\> exit ⏎
Windows Server 2025 / Windows11 の両方で実施する。
*1--isolation の互換性はここを参照。
− □ × >_ 管理者: Windows PowerShell × + | ∨
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows PS C:\> # コンテナの動作確認をする (Windows Server 2025 は --isolation=hyperv も可*1) PS C:\> docker pull hello-world ⏎ PS C:\> docker run --isolation=process --pull never --name hello-container hello-world ⏎PS C:\> docker rm hello-container ⏎ PS C:\> docker rmi hello-world ⏎ PS C:\> exit ⏎
Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (windows-amd64, nanoserver-ltsc2025) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run a Windows Server container with: PS C:\> docker run -it mcr.microsoft.com/windows/servercore:ltsc2025 powershell Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
物理サーバや仮想化がネストされている場合に =hyperv を指定可能。
=process ならネストされていない仮想 Windows でも動作する上に軽量かつ高速。
2. Windows コンテナを実行する。
Windows Server 2025 で実施する。
− □ × >_ 管理者: Windows PowerShell × + | ∨
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows PS C:\> # IIS コンテナを pull する (約 1.5GB: ダウンロードに 45 分間程度を要する) PS C:\> docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2025 ⏎ PS C:\> # IIS コンテナを 実行する (-d でバックグラウンド実行) PS C:\> docker run -d --isolation=process --pull never -p 80:80 --name iis-container ` mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2025 ⏎ PS C:\> # IIS コンテナの起動を確認する PS C:\> docker ps --format "{{.Names}}, {{.CreatedAt}}" ⏎ iis-container, 2026-08-07 08:16:07 +0900 JST PS C:\> # Web コンテンツから Web サーバが IIS であることを確認する PS C:\> (Invoke-WebRequest -UseBasicParsing http://localhost/).Headers ⏎ Key Value --- ----- Accept-Ranges bytes Content-Length 703 Content-Type text/html Date Thu, 06 Aug 2026 23:16:07 GMT ETag "3ac1630cc13dd1:0" Last-Modified Tue, 14 Jul 2026 20:04:39 GMT Server Microsoft-IIS/10.0 ← IIS になっている PS C:\> # バックグラウンドの Windows コンテナを停止させる PS C:\> docker stop iis-container ⏎ PS C:\> # コンテナインスタンスとコンテナイメージを削除する PS C:\> docker rm iis-container ⏎ PS C:\> docker rmi mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2025 ⏎ PS C:\> exit ⏎
3. Portainer のインストール
Windows Server 2025 で実施する。
3-1. Portaner をインストールする。
3-2. Portainer の画面を確認する。
− □ × >_ 管理者: Windows PowerShell × + | ∨
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows PS C:\> # コンテナごとのデータ保存領域を確保する PS C:\> docker volume create portainer-data ⏎ PS C:\> # Portainer を pull する (Community Edition: Long Term Support) PS C:\> docker image pull portainer/portainer-ce:lts ⏎ PS C:\> # Portainer を起動する PS C:\> docker run -d -p 9000:9000 --name portainer --restart=always ` -v \\.\pipe\docker_engine:\\.\pipe\docker_engine ` -v portainer-data:C:\data portainer/portainer-ce:lts ⏎ PS C:\> # Setup token をログから抽出する (初回ログイン時にこの 64 文字が必要)*2 PS C:\> (docker logs portainer 2>&1 | Select-String "setup_token=.*").Matches.Value ⏎ setup_token=7eed123456c98659e11edf8311ed66ffdbbb1df115a4ab46f0366ebe9b09189c PS C:\> # ログの実体を表示する PS C:\> $contId = docker inspect --format='{{.Id}}' portainer ⏎ PS C:\> Get-Content -Tail 2 ` C:\ProgramData\docker\containers\$contId\$contId-json.log ⏎PS C:\> exit ⏎
{"log":"\u001b[90m2026/08/07 11:31AM\u001b[0m \u001b[32mINF\u001b[0m \u001b[1mgithub.com/ portainer/portainer/api/http/server.go:371\u001b[0m\u001b[36m \u003e\u001b[0m starting HT TPS server | \u001b[36mbind_address=\u001b[0m:9443\n","stream":"stderr","time":"2026-08-0 7T02:31:00.5120652Z"}{"log":"\u001b[90m2026/08/0 7 11:31AM\u001b[0m \u001b[32mINF\u001b[0m \u001b[1mgithub.com/ portainer/portainer/api/http/server.go:355\u001b[0m\u001b[36m \u003e\u001b[0m starting HT TP server | \u001b[36mbind_address=\u001b[0m:9000\n","stream":"stderr","time":"2026-08-07 T02:31:00.5120652Z"}
ブラウザで http://localhost:9000/ を表示する。
初回アクセス時は管理者アカウントを作成しなければならない。
「Setup token」には上記 3-1*2 で抽出した文字列を記入する。
⇓
4. Windows コンテナの作成と実行
4-1. Windows11 でコンテナを作成する。(Windows Server 2025 でも作成可能)
4-2. Windows Server 2025 でコンテナを実行する。*3 :latest はバージョンタグ。省略可能だが、ここでは明示している。
− □ × >_ 管理者: Windows PowerShell × + | ∨
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows PS C:\> # Dockerfileを作成する PS C:\> mkdir .\poor\ -Force PS C:\> @" # ベースイメージとして nanoserver を指定 FROM mcr.microsoft.com/powershell:nanoserver-ltsc2022 # ユーザとして Windows の既存管理者 ID を指定 USER ContainerAdministrator # ワークディレクトリを指定 WORKDIR C:/workdir # デフォルトシェルは省略可能 CMD ["pwsh.exe", "-NoExit", "-Command", \ "Write-Host '===================' -ForegroundColor Cyan; \ Write-Host ' Windows Container ' -ForegroundColor Yellow; \ Write-Host '===================' -ForegroundColor Cyan"] "@ | % { [System.IO.File]::WriteAllText(".\poor\Dockerfile", $_, (New-Object System.Text.UTF8Encoding $false)) } ⏎ PS C:\> # Docker イメージをビルドする*3 PS C:\> docker build --isolation=process -t windows-poor-app:latest .\poor\ ⏎
PS C:\> # Windows コンテナを起動する (-i:interactive -t:tty) PS C:\> docker run -it --isolation=process --name windows-poor windows-poor-app:latest ⏎PS C:\> # Windows コンテナを停止する PS C:\> docker stop windows-poor ⏎ PS C:\> docker rm windows-poor ⏎ PS C:\> # Docker アーカイブファイルを作成する (.tar ファイルは実行環境へ転送する*4) PS C:\> docker save windows-poor-app -o windows-poor-app.tar ⏎
=================== Windows Container =================== PS C:\workdir> exit
PS C:\> # イメージを削除する (必要なら) PS C:\> docker rmi windows-poor-app:latest ⏎ PS C:\> exit ⏎
− □ × >_ 管理者: Windows PowerShell × + | ∨
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows PS C:\> # Docker アーカイブファイルをロードする (上記 4-1*4で作成した .tar ファイル) PS C:\> docker load -i windows-poor-app.tar ⏎
PS C:\> # Windows コンテナを起動する PS C:\> docker run -it --isolation=process --name windows-poor windows-poor-app:latest ⏎PS C:\> # Windows コンテナを停止する PS C:\> docker stop windows-poor ⏎ PS C:\> docker rm windows-poor ⏎ PS C:\> exit ⏎
=================== Windows Container =================== PS C:\workdir> exit