"dockerはLinuxでしか動かない"って色んな記事で見るけど、じゃあ結局WindowsやMacで docker使えてんのって何でなの？

# はじめに
みんな大好きdocker。
カレントディレクトリの配下にdocker-compose.ymlファイルが存在する状態で、
```
docker-compose up -d
```
のようにコマンドを叩くと、あら不思議。
Apacheのコンテナ、MySQLのコンテナ、phpMyAdminのコンテナといった具合に、ymlファイルに定義したコンテナが生成され、簡単に開発環境を整えることが出来る。

そんな開発者の味方のdockerだが、インフラエンジニアでもない"よわよわエンジニア"であるぼくがdockerについて調べてみると、情報量が膨大で元々やりたかった事をいつまでたっても出来なくなってしまうことに気が付いた。
（元の目的はコンテナ環境でcronを使ってバッチ処理を試したかったので、dockerファイルの書き方、docker-compose.ymlの書き方を調べたかっただけ）

とは言え最低限の仕組みは理解したいと考えた矢先にタイトルの疑問が浮かび上がった。

# 結論
WindowsもMacも、ハイパーバイザー型の仮想マシン上にあるLinuxカーネルでdockerを動かしている。

# 解説
詳細は割愛するが、仮想化技術はまず大きく分けて3種類存在する。
・ホスト型
・ハイパーバイザー型
・コンテナ型

dockerはもちろんコンテナ型である。
ホスト型、ハイパーバイザー型といった仮想化技術はホストOS（皆さんが普段使っているWindowsやMacなどローカル環境に存在するOS）の上にゲストOS（仮想マシンの為のOS）を立てているが、
コンテナ型はゲストOSを必要としない。
このような説明や、図がインフラ疎い人の混乱を招く要因である。

え？でもぼくの使っているPCはWindowsだよ？
でもdockerはLinuxでしか動かないんだったよね・・・？
完全にパニックだった。

しかし、上記のコンテナ型の説明に関しては何も間違っていない。
大事なのはWindowsやMacでdockerを使用するのに、ハイパーバイザー型とコンテナ型の2つの仮想化技術が使われているという点である。

大事なのはWindowsやMacでdockerを利用するのに、ハイパーバイザー型とコンテナ型の2つの仮想化技術が使われているという点である。


大事なことなので2回言いました。


# 流れ（Windows＋docker desktopパターン）

1.WindowsのHyper-VでVMを作成。
2."1"で作成したVM上で、WSL2を利用してLinuxのカーネルを実行。
3."2"で実行しているLinuxカーネルを使ってdocker desktop(docker engine)を起動。

ちなみに、Ubunts等のディストリビューションをLinuxにインストールしdocker公式サイトからdocker（docker engineその他諸々）をインストールすればdocker desktopを使わずにdockerを使用することができます。

# 各用語について簡単にまとめ

私が調べていた際にまとめた言葉一覧です。
理解の一助になれば幸いです。

・docker
コンテナ型仮想化の技術、ツールを指す言葉。
docker engineそのものや、docker desktopを指して使われることもある。

・docker compose
ymlファイルに記述したコンテナをコマンド1つでまとめてビルドしたり、dockerにまつわる各種操作を簡単に出来るソフトウェア。
docker desktopにバンドルされているので、
docker desktopを使用する場合は
docker compose単体のインストールは不要。
docker composeが無ければymlファイルを元にコンテナ操作は出来ない。

・docker desktop
GUIでコンテナの状態を管理出来るソフトウェア。それだけではなく、そもそもdocker engine、docker composeもバンドルされてる（他にも色々）から、WindowsやMacでもLinuxカーネルが動く仮想マシンさえあればdocker desktopを入れるだけでdockerが使えちゃう優れもの！しかし重い。

・docker engine
下記3つで構成されたdockerそのものを指す言葉。
公式からのインストール時docker-ceとdocker-ce-cliは別々にインストールをする。
あくまで、docker engineの構成にDocker Engine APIが存在すると思われる。
実行の順番はCLI→API→デーモン。
Docker CLI
Docker Engine API
Dockerデーモン。

・wsl2
Hyper-Vで作成されたVMでLinuxカーネルを実行してくれるやつ。

・VM（バーチャルマシン）
仮想マシンのこと。

・仮想化ツール
仮想マシンを作成、実行するソフトウェア。
仮想化を行う方法は大きく分けて3種類存在する。
ハイパーバイザー型、ホスト型、コンテナ型が存在する。

・Hyper-V
ハイパーバイザー型の仮想化ツールの種類の1つ。
wsl2で使われているハイパーバイザー。

・HyperKit
仮想マシンを作成、実行するソフトウェア。
デフォルトでmac OSに搭載されている。
Mac用のHyper-Vのイメージ。

・Docker Machine
仮想マシン上にDocker Engine をインストールするツール。
2020年くらいまではdocker desktopにバンドルされていたが今は不要。
しかし、今でもAWS等クラウド環境にDocker Engineをブチ込みたい時に使われる。


・lima
Linuxのカーネルを動かす仮想化マシン。
docker desktopを使う時、MacならHyperKit、WindowsならHyper-Vを使用して仮想マシンを作ってたがlimaでも出来ちゃう！
パフォーマンスを向上させるために利用されることもしばしば。

・mutagen
ローカル環境とリモート環境のディレクトリを高速に同期させるオープンソースのツール。
パフォーマンスを向上させるために利用されることもしばしば。


・mutagen compose
docker composeとmutagenを統合させたツール。



・docker-ce
dockerのコミュニティエディション
（いわゆる無料版）
中身はDocker Engine API +dockerデーモンだと思うが確証は持てず・・・

・docker-ce-cli
中身はdocker CLIだと思うが確証は持てず・・・

・containerd.io
不明。
Ubuntuへの公式のインストール手順ではdocker-ceと一緒にインストールしている。

・docker-compose-plugin
docker-composeのプラグイン。
インストール時に一緒に入れると便利。
Ubuntuへの公式のインストール手順でもdocker engineと一緒に入れている。
改めてだが、docker desktopにもバンドルされてるのでdocker desktopを使うなら不要。

# 最後に
この記事のおかげで理解できたよ！
dockerの知識として最低限これは追加で理解しているべきだよ！
この説明は間違っているよ！
などなど嬉しい言葉も、厳しい言葉もwelcomeなので気軽にコメントよろしくです☆