本記事について
備忘録
質問サイトにあった回答をほぼそのまま転記した内容
WSL
WSLはWindows上でLinuxをエミュレーションする技術です。
Linuxカーネルとは基本的なOSプログラムをパッケージ化したもので、Ubuntu、Debian、CentOSなどのLinuxディストリビューションは、そのカーネルを核としてさまざまな機能を作り上げています。
これは、中心にあるLinuxカーネルと呼ばれるものの源流が同じで、同じように動くという前提の元で成り立っている。
WSLで使うLinuxのカーネルはMicrosoftが独自にビルドしたものです。そして、WSLの根幹にはそのカーネルが動いています。
ストアでダウンロードするディストリビューション
Microsoft Storeで配布されているLinuxディストリビューションたちにはいくつか種類がありますが、UbuntuにせよFedoraにせよDebianにせよ、WSLのカーネルを使う形でインストールされます。
逆に言えば、カーネルが共通という前提であればどんなLinuxディストリビューションであっても動作が可能なわけです。
なお、WSL2はHyper-Vの技術を応用して使って動いていると思ってください。
厳密に説明すると違いますが、原理的にはHyper-Vを用いていることに変わりはないです。
Docker
DockerはLinuxのカーネルに実装されている2つの機能を組み合わせた「コンテナ技術」で成り立っています。Docker Desktop for Windowsには、「WSL2インテグレーション」という機能があり、これは言ってしまえば「WSL2が動くカーネルを用いたDockerが動く」機能です。
普通のDockerでも例えばCentOSの上でUbuntuのコンテナを動かすことができます。これはホストOSであるCentOSに使われているLinuxカーネルの力を使い、「Ubuntuを動かすために最低限必要なカーネル以外のファイルたち」をtarアーカイブにまとめた「Dockerイメージ」と呼ばれるものを展開して起動したものです。ホストOSのCentOSからみたときにはただのプロセスですが、Ubuntuは自分がUbuntu OSだと思って動いています。
Dockerイメージでいう「OS」というものはただのファイル郡です。ホストOSのカーネルの力を借りて立ち上がることでOSのような振る舞いをするだけで、Dockerfileはそのファイル群(Dockerイメージ)をどのように作成するかという手順を書いたものに過ぎません。
Docker + WSL2
Docker + WSL2の組み合わせでDockerがWSL2の上で動かすことができる(そうしない場合、Docker Desktop for WindowsはHyper-V上にLinuxマシンを作成します)
WSL上のUbuntuのカーネルの力を借りて、Debianが動く最低限のファイルシステムを展開して動かしたプロセスがDebianのコンテナです。なのでOSとしてはUbuntuしかありませんが、コンテナ自信は自分をDebianだと思い込んだようなふるまいをします。