Open6

Windows10のDockerでprocess分離モードが動いた

okuokuokuoku

なんかMSのドキュメントを読むと:

Windows 10 2018 年 10 月アップデート以降では、プロセス分離を使用して Windows コンテナーを実行できますが、まず、docker run でコンテナーを実行するときに --isolation=process フラグを使用してプロセス分離を直接要求する必要があります。 プロセス分離は、 Windows 10 11 Pro (以降)、Windows 10 Enterprise (以降)、Windows 10 IoT Core および Windows 10 IoT Enterprise (以降) と互換性があります。

(日本語訳の都合ではなく、英語版にも同様の記述がある)

Windows 10 11 Pro (以降) って何だよ。。。というのを置いておくとしても、ここではWindows 10ではプロセス分離モードが使えそうな事が書かれている。

... が、MSがリリースしているContainer imageにはWindows 10のカーネルを想定したものが存在しない。手元のWindows 10は Microsoft Windows [Version 10.0.19045.4355] で、MSが提供しているイメージは https://hub.docker.com/_/microsoft-windows-servercore の通り 19045 より微妙に大きかったり小さかったりするイメージしか無い。

okuokuokuoku

別のドキュメントではちゃんと外してある

ただ、この表の下には:

Process isolation on Windows client is available in preview for Windows 11 with Windows Server 2022 images - with build number mismatch.

If you have a requirement to run process isolated containers on a Windows 10, please let us know in our GitHub issues.

という但し書きがある。 ...つまり、デスクトップWindowsにおけるプロセス分離モードは(サポートされているWindows11であっても)バージョン違いに目をつぶる方向で実装されているんだろうか。

okuokuokuoku

試してみる

Docker Desktopはライセンスで色々あったが、 dockerd とか docker コマンドが有料になったわけではないので、そのままDLしてくれば使える。

管理者権限のコマンドプロンプトで、

dockerd -D --data-root d:/docker/

のようにしてフォアグラウンドにdockerdを起動し、

docker run -it --isolation process mcr.microsoft.com/windows/servercore:2004

... 普通に動くな。。Cygwinもインストールできた。

安定して動かすにはASLRを切る必要があった:

つまりコレ2段ロケット方式にする必要があるのか。。(ホストにCygwinを導入し、Docker内でCygwinを導入後、ホストで生成したASLR off版に置き換える)

okuokuokuoku

Adminしか使えない問題

デフォルトではpipeを使う。このpipeにはAdministratorsしか接続できない。

PS C:\prog\docker> [System.IO.Directory]::GetAccessControl("\\.\pipe\docker_engine") | Format-Table -wrap

Path Owner                  Access
---- -----                  ------
     BUILTIN\Administrators NT AUTHORITY\SYSTEM Allow  FullControl
                            BUILTIN\Administrators Allow  FullControl

Docker Desktopはたぶん手動でpipeのACLを設定してるんではないか説。まぁTCPで良いかな。。

EDIT: -G オプションで良かった。

.\dockerd -G stripe\oku -D --data-root d:/docker/

まぁグループを作るのが本来の使いかただろう。。

okuokuokuoku

ビルドテストしてみる

VisualStudioを適当に導入、commitしておく。

./vs_buildtools --quiet --wait --norestart --nocache --installPath c:\BuildTools.17 `
    --add Microsoft.VisualStudio.Workload.UniversalBuildTools `
    --add Microsoft.VisualStudio.Component.Windows11SDK.22621 `
    --add Microsoft.VisualStudio.Workload.VCTools `
    --add Microsoft.Component.VC.Runtime.UCRTSDK `
    --add Microsoft.VisualStudio.Component.VC.ASAN `
    --add Microsoft.VisualStudio.Component.VC.CMake.Project 
C:\BuildTools.17\Common7\Tools\vsdevcmd -arch=amd64

Git入れ忘れたのでCygwinでclone。 ...これはvolumeで共有した方が良いかな。

git clone --jobs 10 --depth 1 --recursive --shallow-submodules https://github.com/okuoku/ribbon-integ

Yuniframeはビルドにpythonが必要なのか。。とりあえずRibbonはビルドできてテストも普通に通った(失敗するのはあるけどそれは元から)。

okuokuokuoku

20H2 はダメだった

PS C:\prog\docker> .\docker run -it --isolation process mcr.microsoft.com/windows/servercore:20H2
Unable to find image 'mcr.microsoft.com/windows/servercore:20H2' locally
20H2: Pulling from windows/servercore
18ae6bebe21d: Pull complete
99cf2a8aa05b: Pull complete
Digest: sha256:54efd0120171d9afaba254e72bbe5b6f6a9eac148c3154a98006220601666477
Status: Downloaded newer image for mcr.microsoft.com/windows/servercore:20H2
docker: Error response from daemon: hcs::CreateComputeSystem c82c76795bc184949ca32e1d0b05eac003446bfcfec4100d0299c29cad009e2e: The container operating system does not match the host operating system.

OSバージョンは1しか違わないのに。。