【イラストで分かる】windowsで動くDockerの仕組み
はじめに
こんにちは。ソフトウェアエンジニアをしています、Koyaです。
筆者がDockerについて調べていると、こんな文言が飛び込んできました。
「DockerはLinux上でしか動かない」
私はココで混乱しましたね。
いやいや、PCのOSはwindowsですが動いてますよ?
公式が間違ってるんか?他の記事やサイトが間違ってんのか?
本気でそう思って、しばらくDockerがよくわからない状態が続きました(笑)
今回はこの問題を解決するために調べた内容をまとめました。
したがって、本記事では特にwindows上で動かす際の仕組みについて説明します。
また筆者は視覚優位な特徴(*1)を持ちます。
同じ視覚優位な特徴を持つ人たちに向けて、わかりやすいように可能な限りイラスト・図を使って説明したいと思います。
よろしくお願いします!
*1 : 物事の理解の仕方は人によって異なると言われています
本題
上述したように、この文言が私を混乱させました😅
「DockerはLinux上でしか動かない」
私以外にもこのように感じた人がいたみたいです。安心しました。
では、これを解決するために具体的にDockerの仕組みを深堀していこうと思います。
DockerはLinux上でしか動かない、とは?
見出しにあるように、大前提としてDockerはLinux上でしか動きません!
公式ドキュメントでは、以下のように説明されています。
「Linuxカーネル活用」=「Linux上でしか動かない」に近い意味と思っています。
Docker は Go プログラミング言語 で書かれており、Linux カーネルの機能をうまく活用して、さまざまな機能性を実現しています。 Docker-docs-jaより
ハイパーバイザー, WSLで解決
まず大前提の「DockerはLinux上でしか動かない」、ココは変わりません。
では、なぜWindows上でDockerを動作させることができるのでしょうか?
これを解決するには2つの技術が絡んできます。
- ハイパーバイザー
- wsl
ひとつずつ説明します。
ハイパーバイザー
ハイパーバイザーとは、仮想マシン(VM)の作成と実行を担うプロセスです。(中略)2つのタイプがあります。
1つはホストハードウェア上で直接動作する「ベアメタル」と呼ばれるハイパーバイザーです。
もう1つは「ホスト型」と呼ばれ、通常のコンピュータープログラムのように、オペレーティングシステム上でソフトウェアレイヤーとして動作します。 vmware公式
イメージはこんな感じです。
違いはハイパーバイザーが入る位置です。
windows上でDockerを構築する際は「ベアメタル型」が使用されています。
※ホスト型でもできると思いますが、一般的にベアメタル型が多いと思います。
ここで重要なのはこの文言「ホストのハードウェア上で直接動作する」です。
普段のPCでは、ハード→カーネル→OS→APPですが、ハードの上にハイパーバイザーが入ることで、複数のOSを構築できるようになります。
これにより、私たちのwindowsPCで、windowsとLinuxといった他のOSを動かせられるようになるわけです。
ただし、これではまだLinuxは動かせません。Linuxのカーネルが無いからです。
ここでWSLの出番です。
WSL
Linux 用 Windows サブシステムを使用すると、開発者は、従来の仮想マシンまたはデュアルブート セットアップのオーバーヘッドなしで、ほとんどのコマンド ライン ツール、ユーティリティ、アプリケーションを含む GNU/Linux 環境を変更せずそのまま Windows 上で直接実行できます。 Microsoft公式
簡単に要約すると、「開発者向けに作られたwindows上でもLinux環境を準備できるツール」です。
WSL1とWSL2があります。詳細は省きますが、簡単に言うと
・WSL1 → Linuxカーネルに似た動きをするもの
・WSL2 → Linuxカーネルとほぼ同じ
現在ではWSL2が主流だと思いますので、WSL=WSL2という前提で話を進めます。
WSL2をインストールすることで、Linux用のカーネルを装備でき、ハイパーバイザー上で動くOSの一つをLinuxにすることができます。
これでwindowsPCでも、前提である「DockerはLinux上で動く」ための条件を満たしましたね。
まとめ
最終的には以下のイラストのようになります。
ハイパーバイザーを使用することで、異なるOSを起動できる土台ができ、WSLをインストールすることでLinuxが動かせるようになるわけです。
参考
・https://www.edu-c.pref.miyagi.jp/midori/tokushi/tomomanabi/tokuseirikai/tokusei_all.pdf
・https://docs.docker.jp/get-started/overview.html#isolated
・https://udemy.benesse.co.jp/development/system/docker.html
・https://zenn.dev/longbridge/articles/d9f544f5b4cb82
・https://docs.docker.com/engine/install/
・https://www.vmware.com/jp/topics/glossary/content/hypervisor.html
・https://learn.microsoft.com/ja-jp/windows/wsl/about
Discussion
イラストとても分かりやすかったです。
一つ質問させてください。
Windows上でDockerを構築した場合、ハードウェア上に
ハイパーバイザーが積まれるイメージになるということですが、
この場合、Dockerをインストールした(Hyper-Vを有効にした)際のWindowsは、
ホストOSではなくなるのでしょうか?
その辺のイメージが付きづらかったです。
ご教授いただけると幸いです。
遅くなりすみません。
コメント、ありがとうございます。
(私の理解ではありますが)windowsはホストOSのままの認識です。
Hyper-Vを有効にしたからと言って、ホストOSの機能を失うのではなく、あくまでLinuxOSも実行できる土台が構築されるイメージを持っていただければ大丈夫かと思います。
とても分かりやすい記事で参考になりました!
一つ疑問なのが、
という箇所なのですが、
という説明と矛盾しているように感じました。
自分もwindowsがホストOSじゃなくなることはないと思うので、windows上でDockerを構築する際はベアメタル型ではなくホスト型なんじゃないですかね?
ご質問ありがとうございます!
確かに矛盾しているような表現になっていますね。失礼しました。記事は修正します。
上記の回答として、この記事では分かりやすさを優先し説明を省いていましたが、windows上でDockerを構築する際は 準ベアメタル型 になります。(後出しになり申し訳ございません。)
どういうことかといいますと、
WSL2を有効にした際、カーネルの実行環境としてHyper-V ( 準仮想化ハイパーバイザ) を使用して、ホストOSとなるWindows10もHyper-Vの有効化時と同様に、仮想化環境の中に入ります。
つまり、(筆者の認識として)WSL2によって完全なベアメタル型に移行するのではなく、windowsOSにはホストOSとしての機能を持ちつつ、ベアメタル型として仮想環境を構築することになります。
そのため、deleeさんの質問に以下のような回答になっていました。
この件に関しては、以下の記事でより専門的に触れられていますので参考ください。
わざわざ参考文献まで記載していただいてありがとうございます!
WSL2をインストールするだけでこんなに内部の構造が変わるんですね。
びっくりしました。