Problem
Dockerを調べていると、どうしても理解しにくいのが、カーネルの共有の概念。
世間様のBlogを見ていると、Dockerの概要図で、各層のスタックをインフラ-マシン-ホストOS-Dockerエンジン-Bin/Lib-Appみたいな表記しているところがいっぱいある。
で、Docker Hubで配布しているイメージを見ていると、Appだけが配布してあって混乱する。
- Bin/LibはDokcerエンジンが提供している?
- カーネルの共有ってことは、AppはホストOSのカーネル部分にアクセスする (Bin/Libを経由して)?
- サンドボックスに近い?
みたいな勘違いをしていた。
さらに混乱したのが、Docker軽量OSであるCoreOS、Alpine Linux等の存在。
「結局OSがいるじゃん、上のBin/Libsとか何?」ってなった。
Solution
結論から言えば、やっぱりOSはいるんですよ。
リンク元:https://www.slideshare.net/zembutsu/introduction-to-docker-management-and-operations-2nd 著者:Masahito Zembutsu様
上のスライドの67Pにおける、ベースイメージ (公式) Ubuntu、CentOS等って言葉。
OSはいるんです。67P付近がすごくわかりやすい。まじで。
公式ページの説明にも、こんな図がある。
https://www.docker.com/sites/default/files/what_is_a_container.png より
いろんなBlog見ていると、Dockerエンジンの上にいきなりAppがいたりする。
これ見たら、「他のコンテナからは独立、カーネルは共有、ホストOSから見たら単一のプロセスに見える」って、サンドボックスと勘違いしますわ。少なくとも。
多分、従来の仮想OSと差別化して見せたいから、意図的にOSがあることをぼかして、Bin/Libsとか、極端にDockerエンジン-App、っていう図を提示してたんですよ。
広告としてはわかりやすいし、魅力的だもんね。
素直に、ベースイメージ≓Bin/Libsって書いてくれれば迷わなかったね。
Appendix
Dockerfile ってあるよね。
ちゃんと仕組みを理解すれば、上の疑問なんてありえないけど、Dockerfileの仕組みを早く知りたかった。
なんで、「ベースイメージがある
」、ってことが確信に変わったかっていうと、このDockerfileを眺めていたから。
JenkinsっていうCIのアプリがあるけど、あれのDockerイメージって、冒頭は下記のような記述になっている。
1 | FROM openjdk:8-jdk |
FROM って見て思いました。これ、他のDockerfileを参照するな、って。
だから、Docker Hubでopenjdkを調べました。
そしたら、openjdkの8-jdkってなっているDockerfileの冒頭は下記。
1 | FROM buildpack-deps:jessie-scm |
次は、buildpack-depsのjessie-scmの冒頭。
1 | FROM buildpack-deps:jessie-curl |
次は、buildpack-depsのjessie-curlの冒頭。
1 | FROM debian:jessie |
次は、debianのjessieの冒頭。debianは有名なLinuxディストリビューションですね。
1 | FROM scratch |
scratchのページにたどり着きました。
下記のようにあります。
an explicitly empty image, especially for building images “FROM scratch”
要するに起点ですね。
これまで辿ってきて、先述のSlideshareを身をもって理解できたわけですよ。
OSはいるんだ、って。