質問: しかし、Dockerイメージには「CentOS」や「Ubuntu」といったOSの情報が入っています。ここが理解できません。このDockerイメージに含まれるOS情報は何者なのでしょうか? * コンテナ上で動かすOS? * コンテナを動かすために必要なホストOSの情報? 例えば、Ubuntu上で動作するDockerで`docker run centos XXX`とすると、CentOS上でコマンドを実行したことになるのでしょうか?つまり、Ubuntuの上で動くコンテナ上でCentOSを動かし、その上でコマンドを実行する、ということなのでしょうか? そもそも私の理解が根本から間違っている部分があれば、ご指摘いただけると幸いです。よろしくお願いいたします。
回答: おそらくOSという言葉で終わらせずカーネルについて把握した方が理解しやすいと思います。 > > なぜなら、Dockerが乗っているOS=各コンテナのOSなので > > > これは正しいですが、正確にはコンテナはホスト(Dockerが乗っているOS)のカーネルを共有する技術です。 ここでカーネルとはLinux Kernelです。 CentOSやUbuntuなどのLinuxディストリビューションは Linux Kernelを軸としてさまざまなソフトウェアをセットアップしたOSです。 そして、この"さまざまなソフトウェア"をコンテナで提供することで DockerではCentOSイメージやUbuntuイメージを実現しています。 > > Ubuntu上で動作するDockerでdocker run centos XXXとすると、CentOS上でコマンドを実行したことになるのでしょうか > > > yumやaptなど、ディストリビューション固有のコマンドを実行する上では正しいです。 Ubuntuホスト上でCentOSコンテナを実行すればCentOSのソフトウェアが利用できます。 一方でカーネルバージョンは異なる点に注意しなければいけません。 VM上のCentOS7でカーネルバージョンを表示すると ``` $ uname -r 3.10.0-957.1.3.el7.x86_64 ``` となりますが、Ubuntu上のコンテナでカーネルバージョンを表示すると ``` $ docker run centos:7 uname -r 4.15.0-45-generic ``` とVMとは異なります。そしてこれはUbuntuホストの結果と一致します。 ``` $ uname -r 4.15.0-45-generic ``` このため、CentOSコンテナでカーネルバージョン依存のソフトウェアを実行するとき、 完全にCentOS VMと同じ挙動となるとは限りません。