急に気になったので調べた。
結論
ref. DockerのWindows対応についての整理#2-windowsベースイメージのコンテナを使うことができるか
元々のDockerはLinuxカーネルに依存したものでしたが、Docker Windows Containersの登場により可能になりました。
結論使えそう。その場合ホスト OS は Windows になるっぽい。(つまり Linux のカーネル共有みたいな感じで Windows カーネルを共有する)
Windows 系 OS のコンテナたち ----- Docker Desktop for Windows の Engine ----- Windows OS(Windows Server or Windows 10) ← ホスト OS
⚠️ 実際に試せておらず、ドキュメント読んで得た情報からの結論です
結論にいたるまでの軌跡
前提(という名の勘違い)
Docker は Linux コンテナという機能により、プロセスやユーザを隔離することで、アプリケーションをあたかも別のマシンで動かしてるようにみせており、ホスト OS のカーネルを共有するので、個別にゲスト OS を一から立ち上げる必要がないためホスト型仮想化 OS に比べて起動が速いのがメリット、その代わりに Linux 系の OS(UbuntuやCentOS)のイメージしか動かすことができないのがデメリットと思ってた。
つまり Windows 系 OS のイメージは Docker で動かせないと思ってた。
調べた
大体以下の辺り読んだ。
- Docker overview | Docker Documentation (日本語版)
- Can Windows Containers be hosted on linux? - Stack Overflow
- DockerのWindows対応についての整理 - Qiita
- Windows 上の Docker エンジンDocker Engine on Windows
- Windows コンテナーについて | Microsoft Docs
- Docker Windows Containers for Server and Desktops | Docker
Windows の土地勘がなく、ドキュメント読んでもわからなさすぎたので途中から Docker のソースコードを読もうとしてた。(結局イメージの生成部分だけ読んで満足した)
- Dockerのコードを読む -イメージ生成編- - Qiita
- Container Image Architecture - Speaker Deck
- opencontainers/image-spec: OCI Image Format - GitHub
結局何を最後まで勘違いしてたかというと、自分の Docker の知識が会社にあった Docker実践入門――Linuxコンテナ技術の基礎から応用まで という 2015 年出版の本をベースにしてたもので、この本では「Docker は Linux コンテナという機能を使って実現されてる」という風に書いてあり、Docker のホスト OS は Linux でないとダメと勘違いしていたが、この情報が古かった。
確かに以前は Linux コンテナ(LXC) を使っていたが、現在は Go で実装された libcontainer によってコンテナ仮想化が行われているらしい。 see. https://ja.wikipedia.org/wiki/Docker#コンテナ仮想化
だから Linux カーネルへの依存がなくなり、上記の結論のようなことが可能になってるのだと思う。(自信ないけど)
libcontainer の実装見た感じ、Windows 対応はまだできてなさそうに見えるので今のところ 👆 は因果関係ないかもしれない。(だとすると Docker Desktop for Windows では libcontainer を使わずに別のソフトウェアでコンテナ仮想化を実現してるのかな :thinking_face_google: )