【図解】「Docker(コンテナ)でUbuntuを構築する」ってどういう意味？

独学でちょろちょろDocker(コンテナ)を勉強していましたが、不明点がたまる一方...。
そんな中、Dockerの研修に行ける機会があり、不明点を解消してきたので備忘録としてまとめます。

いくつか解消できたのですが、すっきり度合い高めな2つだけピックアップ。

# 解消点
* 「DockerでUbuntuを構築する」ってどういう意味？
* 「Docker for Mac」の正体って何者？

# Dockerとは
記事をさくっとまとめるためにDockerの詳しい解説は省きます。
すでに素晴らしい解説をしてくれている方が多数います。
自身が駄文で解説するよりも、遥かに参考になると思います。

[【図解】Dockerの全体像を理解する -前編-](https://qiita.com/kotaro-dr/items/b1024c7d200a75b992fc)
[Dockerを体系的に学び直してみた(概要編)](https://qiita.com/takuya_tsurumi/items/5b2e286f1a97ba5e8f76)
[【図解】コレ1枚でわかるサーバー仮想化とコンテナの違い](https://blogs.itmedia.co.jp/itsolutionjuku/2017/11/1_13.html)

# 「DockerでUbuntuを構築する」ってどういう意味？
###　仮想マシンとコンテナの違い
度々比較される仮想マシンとコンテナ。
当初の自分のイメージではこんな感じ。
![vm_container.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186515/90acca40-4ac5-2ff6-9115-d9868602983b.png)
この絵で言いたいことは、
仮想マシンは**新たにOSも用意して仮想化**しよう
コンテナでは**各コンテナで1つのOS(ホストOS)**を共有しよう
ということです。

実は、この絵の捉え方を間違えていたのが、今回の不明点の原因です。



### # docker run ubuntu
参加した研修ではCentOSにDockerを導入していました。
そして遭遇するこのコマンド。

```
#  docker run ubuntu
```

コマンド自体は書いてある通りで、「DockerでUbuntuを構築してね」というものです。
しかし、独学で勉強した際にも、ここでつまりました。

「コンテナって**OS**は入れないんじゃないの？」
「**CentOSが入ってるのにUbuntu**もいれるの？」

では不明点を解消していきます。

### OSの構成要素
まずはOS周りについてまとめます。
OSとはみんな知ってるWindowsとかのことですね。
OSは大まかに以下の構成となっています。
![os.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186515/0d0e46b9-6a85-e274-b025-8f7b7d30a85d.png)
おそらくこの図で納得しない方も多いと思いますが、自分はこの図がわかりやすかったので、これでいきます。

ここで色分けされているカーネルが今回大事になる部分です。
カーネルとはOSの中核です。

### Linuxディストリビューション
次にLinuxディストリビューションについてまとめます。
上記ででてきたCentOSやUbuntuが有名ですね。
これらは大まかに以下の構成となっています。
![linux.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186515/f374fe44-cdaf-a7e9-1ead-b18cbc04fe0d.png)
ここで大事なことは、
**ディストリビューションが違っても、カーネルは同じLinuxカーネル**ということです。
差があるのはシェルとかその他の部分です。

厳密にはディストリビューションにはカーネルは入らないのかな...？
ここではざっくり理解できればいいということで。

### 上記知識を念頭に不明点を解消
いろいろと話が出てきましたが、まとめていきます。
自分が勘違いしていたのは以下の点です。

* コンテナはホストOSを共用している
* ディストリビューションが違えば、全く違うOS

まず1点目の「コンテナはホストOSを共用している」ですが、
これは「コンテナは**ホストOSのカーネルを共用**している」が正しい表現です。

次に2点目の「ディストリビューションが違えば、全く違うOS」ですが、
これは「**ディストリビューションが違ってもカーネルは同じ**」が正しい表現です。

上記2点を元に「DockerでUbuntuを構築する」を絵で描いてみます。

![container_kernel.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186515/e672f9d9-80c3-b27f-d149-0397c89cafd9.png)

絵心がないので、絵はこれが限界です。
要は、「ホストOSにはCentOSをいれて、コンテナではUbuntuのシェルやその他を用意して、ホストOSのカーネルを使ってUbuntuを動かす」ということです。

自分の中ではこれでイメージができたのですが、
同じ悩みを抱えていた同志の方々いかがでしょうか...？

# 「Docker for Mac」の正体って何者？
### Docker for MacでもUbuntuを構築
MacでDockerを扱うソフトウェアとして、「Docker for Mac」があります。
では、これを用いてMacでDockerを扱えるようにしたとして、コンテナ上にUbuntuは構築できるのでしょうか。

今までの話からすると、MacとLinuxのカーネルはそれぞれ違うのものなのでできなさそうです。
ただ、これは**できます**。

### Docker for Macは仮想マシンとほぼ同義
「なんでMac上のDockerでUbuntuが構成できるの？」
と質問を投げたところ、講師の方はこのような返答でした。

「**Docker for MacはLinuxOSを導入する仮想マシン**と考えて！」

つまり絵にするとこんな感じ。

![docker4mac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186515/32d7127b-43c7-d8bf-8325-9ea335756ed6.png)

実は、Docker for MacはLinuxOSを導入するための仮想マシンの役割をしていました。
(もちろん他にもいろいろしています)
これであればコンテナから見たホストOSはLinuxOSとなり、Ubuntuも難なく構成できそうです。

実際にDocker for Macを導入するとLinuxOSが動作しているのを確認できます。
[DockerをMacにインストールする](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)

少し補足すると、
Dockerは元々ホストOSがLinuxであること前提に作られたものです。
それをMac上で動かすために、まずはLinuxを入れようね、という感じみたいです。


#　おわりに
個人的な備忘録も兼ねてまとめてみました。
事実と異なる部分がありましたらご指摘いただけますと幸いです。