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 … を実行するときに管理者権限が必要。
*1ここで作成したアーカイブファイルは下記 2-2 と 2-3 で使用するので、実行 PC (Windows Server 2025) へコピーすること。
− □ × >_ 管理者: 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 ⏎
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 ⏎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 ⏎
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
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 を入力すると、コンテナも終了する)