Windows コンテナとアプリ
〜 Window 専用コンテナの実際 〜
2026-08-26 作成 福島
TOP > tips > docker-wapp
[ TIPS | TOYS | OTAKU | LINK | MOVIE | CGI | AvTitle | ConfuTerm | HIST | AnSt | Asob | Shell | GBC | LLM ]

0. 前置き

Windows 専用コンテナ内で C コンパイラを使用して CUI アプリを作成します。

コンテナの中からエディタでファイル作成をしたいけど、どうやっても画面が崩れるので諦めました。
(sshd を実装すれば可能になるけど、本題から逸脱しすぎるのは良くない)

その代わり、ホスト側に用意したディレクトリをコンテナ側からも操作できるようにしたので、
ホスト側で画面の崩れを気にすることなく、自由にエディタを使用することができます。

また、前項でインストールした Portainer から実際に Windows 専用コンテナを起動します。


1. C コンパイラの用意と Docker イメージの作成

Windows11 で実施する。
(Windows Server 2025 でも実施可能)

1-1. C コンパイラの設置
− □ × 
 >_ Windows PowerShell ×   + |
 
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows  

PS C:\> # C コンパイラ (Clang) をダウンロードする
PS C:\> curl.exe -LO (`
"https://github.com/mstorsjo/llvm-mingw/releases/download/" `
+ "20260616/llvm-mingw-20260616-ucrt-x86_64.zip") 

PS C:\> # Clang を解凍する (名前が長すぎるので短縮する)
PS C:\> mkdir .\poor\ -Force 
PS C:\> tar -C .\poor\ -xf .\llvm-mingw-20260616-ucrt-x86_64.zip 
PS C:\> ren .\poor\llvm-mingw-20260616-ucrt-x86_64\ llvm 

PS C:\> # x86_64 以外の CPU アーキテクチャを削除する
PS C:\> cd .\poor\llvm\ 
PS C:\poor\llvm\> Remove-Item -Recurse -Force aarch64*, arm*, i686* 
PS C:\poor\llvm\> Remove-Item -Force .\bin\aarch64*, .\bin\arm*, .\bin\i686* 
PS C:\poor\llvm\> dir 

    ディレクトリ: C:\poor\llvm

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2026/08/17     21:30                bin
d-----        2026/06/17     11:23                busybox
d-----        2026/06/17      4:03                include
d-----        2026/06/17     11:20                lib
d-----        2026/06/17      7:52                python
d-----        2026/06/17     11:21                share
d-----        2026/06/17     11:21                x86_64-w64-mingw32
-a----        2026/06/17     11:19          15141 LICENSE.TXT

PS C:\poor\llvm\> cd ..\.. 


PS C:\> # テストプログラムを作成する PS C:\> @" #include <stdio.h> int main(int argc, char* argv[]) { printf("ハロー ウインドウズ専用コンテナ\n"); } "@ | Set-Content -Encoding utf8 hello.c PS C:\> # テストプログラムをコンパイルする PS C:\> .\poor\llvm\bin\clang.exe -o hello.exe hello.c PS C:\> .\poor\llvm\bin\strip.exe hello.exe PS C:\> # テストプログラムを実行する PS C:\> [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 PS C:\> .\hello.exe ハロー ウインドウズ専用コンテナ PS C:\> exit

1-2. Docker イメージの作成
docker build … を実行するときに管理者権限が必要。

− □ × 
 >_ 管理者: Windows PowerShell ×   + |
 
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows  

PS C:\> # Dockerfile を作成する
PS C:\> @"
FROM mcr.microsoft.com/windows/nanoserver:ltsc2022
#  作業ディレクトリを指定
WORKDIR C:/workdir
#  C コンパイラ (Clang) を用意
COPY ./llvm     C:/poor/llvm
#  Clang のパスを設定
ENV PATH="C:\\poor;C:\\poor\\llvm\\bin;${PATH}"
#  コマンドを指定 (nanoserver で pwsh.exe は選択できない)
ENTRYPOINT ["cmd.exe", "/K", "prompt `$p`$g`$s"]
"@ | Set-Content -Encoding utf8 .\poor\Dockerfile 

PS C:\> # Docker イメージをビルドする
PS C:\> docker build -t windows-poor-c:latest .\poor\ 

PS C:\> # Docker イメージをアーカイブする*1
PS C:\> docker save windows-poor-c -o windows-poor-c.tar 

PS C:\> exit 

*1ここで作成したアーカイブファイルは下記 2-2 と 2-3 で使用するので、実行 PC (Windows Server 2025) へコピーすること。


2. Windows 専用コンテナの実行

Windows Server 2025 で実施する。
(Windows11 でも実施可能)

2-1. 共有ディレクトリとテストプログラムの作成
• ここで作成するのは下記 2-2 と 2-3 で利用するディレクトリとプログラム。コンテナを実行する PC で作成する。

− □ × 
 >_ 管理者: Windows PowerShell ×   + |
 
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows  

PS C:\> # 共有ディレクトリを作成する (Everyone にフルコントロールの権限)
PS C:\> mkdir .\workdir\ -Force 
PS C:\> icacls .\workdir\ /grant "Everyone:(OI)(CI)F" 


PS C:\> # 共有ディレクトリにテストプログラムを作成する PS C:\> @" #include <stdio.h> #define CYAN "\033[36m" #define NORM "\033[m" int main(int argc, char* argv[]) { printf(CYAN "ハロー, Windows専用コンテナ" NORM "\n"); } "@ | Set-Content -Encoding utf8 .\workdir\hello.c PS C:\> exit

2-2. Windows 専用コンテナを実行 - Docker コマンドで実行
docker run … を実行するときに管理者権限が必要。

• 上記 2-1 で作成した共有ディレクトリとプログラムを使用する。

− □ × 
 >_ 管理者: Windows PowerShell ×   + |
 
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows  

PS C:\> # Docker イメージのアーカイブをロードする (上記 1-2 で作成したファイル *1)
PS C:\> docker load -i .\windows-poor-c.tar 

PS C:\> # Windows コンテナを起動する (-i:interactive -t:tty)
PS C:\> # 共有ディレクトリを指定している (--mount type=bind,…)
PS C:\> docker run --rm -it --isolation=process `
--mount type=bind,source=${PWD}\workdir,target=C:\workdir `
--name windows-c windows-poor-c:latest 

C:\workdir> REM 共有ディレクトリの内容を確認する C:\workdir> dir Volume in drive C has no label. Volume Serial Number is 1EEA-1A07 Directory of C:\workdir 08/18/2026 11:14 PM <DIR> . 08/18/2026 10:59 PM <DIR> .. 08/18/2026 11:07 PM 176 hello.c ← 上記で作成したファイルが見えている 1 File(s) 176 bytes 2 Dir(s) 17,080,504,320 bytes free C:\workdir> REM コンパイルする (実行ファイルを作成) C:\workdir> clang -o hello.exe hello.c C:\workdir> strip hello.exe C:\workdir> REM 実行する C:\workdir> hello.exe ハロー, Windows専用コンテナ C:\workdir> REM Windows コンテナから脱出する (終了する) C:\workdir> exit
PS C:\> # 共有ディレクトリの内容を確認する PS C:\> dir .\workdir\ ディレクトリ: C:\\workdir Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2026/08/18 23:07 176 hello.c -a---- 2026/08/18 23:18 13824 hello.exe ← コンテナ内で作成した実行ファイル PS C:\> # コンテナ内で作成した実行ファイルを実行してみる PS C:\> [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 PS C:\> .\workdir\hello.exe ハロー, Windows専用コンテナ PS C:\> exit


2-3. Windows 専用コンテナを実行 - Portainer で実行

• Docker イメージは上記 1-2(*1) で作成したものを使用する。
アーカイブした windows-poor-c.tar を当該 PC にコピーしておくこと。

• 共有ディレクトリは上記 2-1 で作成したものを使用する。

2-3-1. Docker エンジンに接続する。
2-3-1-1. Portainer にログインする。



2-3-1-2. Docker エンジンに接続する。



2-3-2. Docker イメージをアップロードする。
2-3-2-1. イメージリスト画面を選択する。



2-3-2-2. インポート画面へ移動する。



2-3-2-3. Docker イメージを選択する。



2-3-2-4. レジストリに Docker イメージをアップロードする。



2-3-3. コンテナインスタンスを作成する。
2-3-3-1. コンテナリスト画面を選択する。



2-3-3-2. 動作環境設定画面へ移動する。



2-3-3-3. コンテナの動作条件を指定する。(1)
 以下を記入する。
 • コンテナ名 (好きな名称)
 • イメージ名 (アップロードしたコンテナ名: windows-poor-c:latest)

 当該コンテナはコンソールを使用するので以下を選択する。
   Interactive & TTY (-i -t)


2-3-3-4. コンテナの動作条件を指定する。(2)
 当該コンテナは共有ディレクトリを使用するため
 ボリューム追加オプションを選択する。


2-3-3-5. コンテナの動作条件を指定する。(3)
 下記を記入して ボタンをクリックする。
 • コンテナ側マウントポイント ( を選択)
 • エンジン側共有ディレクトリ ( を選択)
(エンジン側共有ディレクトリは、上記 2-1 で作成したものを指定)


→ ここでコンテナが自動的に起動し、コンテナリスト画面に戻る。

2-3-4. コンソールからコンテナにアクセスする。
2-3-4-1. コンテナのコンソールに接続する。
 クリップ (🧷) のアイコンをクリックする。


2-3-4-2. Windows コンテナを操作する。
 上記 2-2 と同様に、C 言語のソースファイルをコンパイル&実行している。
 閉じるときは をクリックする。
( exit  を入力すると、コンテナも終了する)