🐋

【イラストで分かる】windowsで動くDockerの仕組み

2023/04/29に公開
5

はじめに

こんにちは。ソフトウェアエンジニアをしています、Koyaです。

筆者がDockerについて調べていると、こんな文言が飛び込んできました。
「DockerはLinux上でしか動かない」

私はココで混乱しましたね。

いやいや、PCのOSはwindowsですが動いてますよ?
公式が間違ってるんか?他の記事やサイトが間違ってんのか?

本気でそう思って、しばらくDockerがよくわからない状態が続きました(笑)

今回はこの問題を解決するために調べた内容をまとめました。
したがって、本記事では特にwindows上で動かす際の仕組みについて説明します。

また筆者は視覚優位な特徴(*1)を持ちます。
同じ視覚優位な特徴を持つ人たちに向けて、わかりやすいように可能な限りイラスト・図を使って説明したいと思います。

よろしくお願いします!

*1 : 物事の理解の仕方は人によって異なると言われています

本題

上述したように、この文言が私を混乱させました😅

「DockerはLinux上でしか動かない」

私以外にもこのように感じた人がいたみたいです。安心しました。
https://qiita.com/AA_RU/items/7cce697eea822471840f

では、これを解決するために具体的にDockerの仕組みを深堀していこうと思います。

DockerはLinux上でしか動かない、とは?

見出しにあるように、大前提としてDockerはLinux上でしか動きません!
公式ドキュメントでは、以下のように説明されています。
「Linuxカーネル活用」=「Linux上でしか動かない」に近い意味と思っています。

Docker は Go プログラミング言語 で書かれており、Linux カーネルの機能をうまく活用して、さまざまな機能性を実現しています。 Docker-docs-jaより

ハイパーバイザー, WSLで解決

まず大前提の「DockerはLinux上でしか動かない」、ココは変わりません。
では、なぜWindows上でDockerを動作させることができるのでしょうか?

これを解決するには2つの技術が絡んできます。

  1. ハイパーバイザー
  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

GitHubで編集を提案

Discussion

deleedelee

イラストとても分かりやすかったです。
一つ質問させてください。
Windows上でDockerを構築した場合、ハードウェア上に
ハイパーバイザーが積まれるイメージになるということですが、
この場合、Dockerをインストールした(Hyper-Vを有効にした)際のWindowsは、
ホストOSではなくなるのでしょうか?

その辺のイメージが付きづらかったです。
ご教授いただけると幸いです。

koyakoya

遅くなりすみません。
コメント、ありがとうございます。
(私の理解ではありますが)windowsはホストOSのままの認識です。
Hyper-Vを有効にしたからと言って、ホストOSの機能を失うのではなく、あくまでLinuxOSも実行できる土台が構築されるイメージを持っていただければ大丈夫かと思います。

nasubi3nasubi3

とても分かりやすい記事で参考になりました!

一つ疑問なのが、

違いはハイパーバイザーが入る位置です。
windows上でDockerを構築する際は「ベアメタル型」が使用されています。
※ホスト型でもできると思いますが、一般的にベアメタル型が多いと思います。

という箇所なのですが、

(私の理解ではありますが)windowsはホストOSのままの認識です。
Hyper-Vを有効にしたからと言って、ホストOSの機能を失うのではなく、あくまでLinuxOSも実行できる土台が構築されるイメージを持っていただければ大丈夫かと思います。

という説明と矛盾しているように感じました。
自分もwindowsがホストOSじゃなくなることはないと思うので、windows上でDockerを構築する際はベアメタル型ではなくホスト型なんじゃないですかね?

koyakoya

ご質問ありがとうございます!
確かに矛盾しているような表現になっていますね。失礼しました。記事は修正します。

windows上でDockerを構築する際はベアメタル型ではなくホスト型なんじゃないですかね?

上記の回答として、この記事では分かりやすさを優先し説明を省いていましたが、windows上でDockerを構築する際は 準ベアメタル型 になります。(後出しになり申し訳ございません。)

どういうことかといいますと、
WSL2を有効にした際、カーネルの実行環境としてHyper-V ( 準仮想化ハイパーバイザ) を使用して、ホストOSとなるWindows10もHyper-Vの有効化時と同様に、仮想化環境の中に入ります。

つまり、(筆者の認識として)WSL2によって完全なベアメタル型に移行するのではなく、windowsOSにはホストOSとしての機能を持ちつつ、ベアメタル型として仮想環境を構築することになります。
そのため、deleeさんの質問に以下のような回答になっていました。

windowsはホストOSのままの認識です。Hyper-Vを有効にしたからと言って、ホストOSの機能を失うのではなく、あくまでLinuxOSも実行できる土台が構築されるイメージを持っていただければ大丈夫かと思います。

この件に関しては、以下の記事でより専門的に触れられていますので参考ください。

https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/reference/hyper-v-architecture

https://roy-n-roy.nyan-co.page/Windows/WSL&コンテナ/Architecture/

nasubi3nasubi3

わざわざ参考文献まで記載していただいてありがとうございます!
WSL2をインストールするだけでこんなに内部の構造が変わるんですね。
びっくりしました。