🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

7916閲覧

wls2とDockerの関係性を知りたい

satouhiroshi

総合スコア1

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

3クリップ

投稿2020/12/11 17:12

前提・実現したいこと

OS:Windows10 Pro

WindowsでDockerを勉強するために、wsl2を利用できるようにしました。
wsl2とは何かについて私なりに調べたところ、
0. WindowsでLinuxのカーネルが動く
0. Hyper-Vではないけど、特別な仮想マシンが動いてLinuxぽいのが動いている
※だから、Hyper-Vマネージャーで見ると仮想マシンは起動していない

上記のように、Windows環境に特別な仮想マシンが起動されて限りなくLinuxに近いOSが動いていると理解しています。
そして、Docker for Windowsもインストールしました。
以上を踏まえていくつか疑問点があります。

疑問その1

wsl2を有効にしてDocker for WindowsをインストールするとPowerShellから

docker pull httpd

とコマンドを打つとhttpdのイメージがダウンロードできてrunで動きます。
dockerの開設サイトを見ると、よくMicroSoftStoreよりUbuntuをインストールしていますが、
なぜUbuntuをインストールしているのでしょうか?
特になくてもdockerが動くと思うのですが、インストールする理由は何があるのでしょうか?

疑問その2

httpdのDockerfileを見るとFromがdebianになっています。
phpやmysqlなどWeb系で利用しようなコンテナはなぜかdebianになっています。
私はcentos派なのですが、centpsでhttpdのWebサーバーのコンテナを作るのはあまりやらない方法なのでしょうか?

疑問その3

Dockerのコンテナの概念についてですが、基本的にはプロセス単位でコンテナを作成したほうが良いといろいろなサイトに書いていました。
例えばWebの場合だと、
0. httpdのコンテナ(apache)
0. phpのコンテナ
0. mysqlのコンテナ

で分けようかなと考えております。
そこでふと疑問に思ったのですが、httpdやphpやmysqlはソフトウェアなのでOSが無いと動かないと思います。
Dockerの場合はホストOSのカーネルを利用するからhttpdのコンテナなどにはOSが入っていないので、動作が高速になっているのだと思います。
「疑問その2」とも重複するのですが、例えばhttpdのDockerfileにはFromがdebianと書かれています。

今回の場合だとホストOSはwsl2の仮想マシンだと思うので、debianがどこにも無い状態だと思います。
Linuxのディストリビューションはカーネルは共通だと知ったので動くと思うのですが、「apt-get」などdebian独自の機能はどこで動くのでしょうか?
実はdebianのOSがhttpdをpullするとどこかにダウンロードされてくるのでしょうか?

疑問その4

疑問その2/その3とも重複するのですが、私はcentos派です。
centosでhttpdを動かそうとした場合は、

docker pull centos

でcentosのイメージをrunしてyumでhttpdをインストールすればできるのかなと思いますが、
dockerはプロセス単位のマイクロなコンテナを起動するから高速だと思っているので、
centosの中にhttpdを入れるのはcentosのOSが無駄なリソースになっていて、dockerのメリットがあまりないのかなと思うのですが、centosのイメージにhttpdをyumでインストールするのはまっとうなやり方でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず、WSLとDockerの機能をそれぞれ分けて考えてみてください。

WSL

WSLのそもそもの話

WSLはWindows上でLinuxをエミュレーションする技術です。先の回答者さんがおっしゃるとおり、Linuxカーネルとは基本的なOSプログラムをパッケージ化したもので、Ubuntu、Debian、CentOSなどのLinuxディストリビューションは、そのカーネルを核としてさまざまな機能を作り上げています。
これは、中心にあるLinuxカーネルと呼ばれるものの源流が同じで、同じように動くという前提の元で成り立っているわけです。
さて、WSLで使うLinuxのカーネルはMicrosoftが独自にビルドしたものです。そして、WSLの根幹にはそのカーネルが動いています。

ストアでダウンロードしたものの正体

Microsoft Storeで配布されているLinuxディストリビューションたちにはいくつか種類がありますが、UbuntuにせよFedoraにせよDebianにせよ、WSLのカーネルを使う形でインストールされます。逆に言えば、カーネルが共通という前提であればどんなLinuxディストリビューションであっても動作が可能なわけです。少なくとも、質問者さんの環境ではUbuntuをインストールしたので、Ubuntuが動いています。

なお、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だと思って動いています。この辺は非常にわかりにくいですが、私が前に発表したスライドの6ページあたりから図で説明しているので見てみるとよいかもしれません。

https://speakerdeck.com/inductor/container-runtime-101?slide=6

繰り返しになりますが、Dockerイメージでいう「OS」というものはただのファイル郡です。ホストOSのカーネルの力を借りて立ち上がることでOSのような振る舞いをするだけで、Dockerfileはそのファイル群(Dockerイメージ)をどのように作成するかという手順を書いたものに過ぎません。

まとめると、

  1. Docker + WSL2の組み合わせでDockerがWSL2の上で動かすことができる(そうしない場合、Docker Desktop for WindowsはHyper-V上にLinuxマシンを作成します)
  2. CentOS派だけどDebianは普通?

はい、DockerコミュニティではDebianベースのイメージが最も一般的です。
3. "今回の場合だとホストOSはwsl2の仮想マシンだと思うので、debianがどこにも無い状態だと思います。"
はい、ありません。WSL上のUbuntuのカーネルの力を借りて、Debianが動く最低限のファイルシステムを展開して動かしたプロセスがDebianのコンテナです。なのでOSとしてはUbuntuしかありませんが、コンテナ自信は自分をDebianだと思い込んだようなふるまいをします。

さいごに

gentaroさんはかなりバッサリ質問者さんの認識を斬っていますが、私はこうした仕組みの質問をすることは非常によいことだと思っています。私自身も4年前は質問者さんと同じような理解をしていたと思いますし、このように手を動かしながらわからないことを人に聞いていくことを繰り返していけば必ず理解できるときが来ると思います。

投稿2020/12/11 19:59

inductor

総合スコア428

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satouhiroshi

2020/12/12 04:48

ご丁寧に回答頂きましてありがとうございます。 だんだんとイメージが掴めてきました。 もう一度調べて理解度を上げていきたいと思います。 この度はありがとうございました。
guest

0

疑問その1

dockerの開設サイトを見ると、よくMicroSoftStoreよりUbuntuをインストールしていますが、

意味不明だけど「解説サイト」を見てMicro's'oft StoreからWSL2の環境構築でUbuntuを入れろという事が書いてあるという解釈で回答すると、それはDockerのホストプログラムを動作させる環境としてのOSが必要だから。

特になくてもdockerが動くと思うのですが、インストールする理由は何があるのでしょうか?

無理。
Dockerのホスト自体はあくまでLinux OS上で動作するプログラム。
WSL2はあくまでLinuxカーネルを動かすものであり、その上のLinux OSの環境が必要。
これはOSが「カーネル+基本的なプログラム郡」という定義がわかってれば理解できる話。

疑問その2

私はcentos派なのですが、centpsでhttpdのWebサーバーのコンテナを作るのはあまりやらない方法なのでしょうか?

別に自分でコンテナを作るなら使いやすいディストリビューションでいいけど、パブリックリポジトリで提供するなら色んな人の要求の最大公約数を満たすディストリビューションだろうという事で選択されてるんじゃない?

軽量さだけならalpineでもいいけど、Debianは昔からあるディストリビューションで、派生ディストリビューション(ubuntuとか)も多く、CentOSみたいに商用ディストリビューションからの派生でもないから。

疑問その3

Dockerの場合はホストOSのカーネルを利用するからhttpdのコンテナなどにはOSが入っていないので、動作が高速になっているのだと思います。

致命的な間違い。
Dockerはカーネルを共有して複数のOS環境を作る技術。

今回の場合だとホストOSはwsl2の仮想マシンだと思うので、debianがどこにも無い状態だと思います。

OSと「仮想マシン」を混同してる。

Linuxのディストリビューションはカーネルは共通だと知ったので動くと思うのですが、「apt-get」などdebian独自の機能はどこで動くのでしょうか?

それこそDockerの作った「コンテナ」環境そのもの。
詳細な技術解説記事は探せば山のようにあるので、ググって調べたほうがいい。

疑問その4

centosのイメージにhttpdをyumでインストールするのはまっとうなやり方でしょうか?

「CentOSベースのコンテナを使いたい」という前提ならふつう。

投稿2020/12/11 17:44

gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satouhiroshi

2020/12/11 18:29

ご回答頂きましてありがとうございます。 勉強になります。 すいませんがもう一つだけ質問させてください。 > 無理。 > Dockerのホスト自体はあくまでLinux OS上で動作するプログラム。 > WSL2はあくまでLinuxカーネルを動かすものであり、その上のLinux OSの環境が必要。 > これはOSが「カーネル+基本的なプログラム郡」という定義がわかってれば理解できる話。 この回答についてですが、OSが「カーネル+基本的なプログラム郡」という定義は理解いたしました。 ありがとうございます。 ただ繰り返しになって恐縮ですが、 ・wsl2 ・Docker for windows を利用していて、Ubuntuはインストールしていません。 実際に以下のコマンドを実行したところ、ItWorksが表示されました。 この場合は、何のOSが動いているのでしょうか? デフォルトのOSみたいなのがあるのでしょうか? また、私の認識が間違っておりますでしょうか? お手数をおかけしますが、ご教授のほどお願いいたします ■PowerShellよりhttpdを起動したコマンド ``` docker pull httpd docker run -d -p 8080:80 httpd ```
gentaro

2020/12/12 03:05

あなたがどういう環境を構築したのかは私には知りようがないのですけど、Docker for Windowsの設定画面でWSL INTEGRATIONってページがあるはずだからそこで確認すればWSL2上で動いているどのディストリビューション環境でDockerが動いてるのか確認できるはず。
gentaro

2020/12/12 03:17

まぁ公式リファレンスを含めネット上にあるほとんどのハウツー系の記事はUbuntu入れる説明してるでしょうから十中八九Ubuntuだと思いますが。
gentaro

2020/12/12 03:21

あぁ、というか「疑問その1」の回答がそのままの答えだった。 > この場合は、何のOSが動いているのでしょうか? > デフォルトのOSみたいなのがあるのでしょうか? 「Dockerのホストプログラムを動作させる環境としてのOS」という説明ちゃんとしてます。
satouhiroshi

2020/12/12 04:44

無知な私に説明いただきましてありがとうございます。 もう一度勉強いたします。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問