69052
# 背景

[Dockerコンテナ内でシェルが動く理屈がわかりません](https://ja.stackoverflow.com/q/69025) で質問をしました。

私のDockerやOSへの理解がだいぶ浅いので質問の仕方、質問の焦点の当て方がまずかった気がしますので、ここで質問したあとで、疑問に思ったことを別質問とします。

# Dockerコンテナ内におけるOSに言及しているもの

下記引用に「読み取り専用のOSイメージ」「一部の簡易オペレーティング システム API」という言葉が出てきています。

[docker初心者の方が知っておいた方がよい基礎知識](https://www.osscons.jp/cloud/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89/?action=common_download_main&upload_id=698)
10ページ目からの引用

> docker hubなどからダウンロードしたOSイメージ

> 読み取り専用のOSイメージの上に、書き込み可能なファイルシステムをマウントすることでコンテナ内のファイルシステムを構成

[コンテナーと仮想マシン | Microsoft Docs](https://docs.microsoft.com/ja-
jp/virtualization/windowscontainers/about/containers-vs-vm)

> コンテナーは、この図に示すように、ホスト オペレーティング システムのカーネル (オペレーティング
> システムの埋め込まれた配管のようなものと見なすことができます) の上に構築されます。

> コンテナーには、ユーザーモードで実行されるアプリケーションと一部の簡易オペレーティング システム API およびサービスのみが含まれます。

## OSの共有

[docker初心者の方が知っておいた方がよい基礎知識](https://www.osscons.jp/cloud/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89/?action=common_download_main&upload_id=698)
11ページ目からの引用

> 同一OSのコンテナを多数起動する場合、OSイメージのファイルは各コンテナで共有される

# 私のOSの理解

[オペレーティングシステム -
Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)

OSは「ハードウェアの抽象化」「リソースの管理」「コンピュータの利用効率の向上」の目的があります（このあたりは抽象的ですが簡単に大学で習った）。そして、おそらくこのあたりの機能はDockerホストの役割になっていると推測してます。

## OSには名前がある

> 現代の主なOSには、Microsoft Windows、Windows Phone、IBM z/OS、Android、macOS(旧・Mac OS
> X、OS X)、iOS(旧・OS X iPhone、iPhone OS)、iPadOS、Linux、FreeBSDなどがある

# 質問

「簡易オペレーティングシステムAPI」や「読み取り専用のOSイメージ」とはなんのことですか？  
おそらく「読み取り専用のOSイメージ」は <https://ja.stackoverflow.com/a/69029/9008>
の回答で頂いているDebianかAlpineのことだと思っているのですが合っていますか？

「簡易オペレーティングシステムAPI」というのは文字通り簡易的なAPIの集合であって、OSとしての名前はないのでしょうか？

「コンテナ内のOSの共有」という考え方が出てきていますが、コンテナのOSがもし仮に色々あるとするならば、どのコンテナとどのコンテナが共有しあっているのかはどうすればわかるのでしょうか？（もしかして単なる軽量化の仕組みで、安全性はホスト側のOSが担っているので知る必要はない？）
CC BY-SA 4.0
2020-07-27T23:50:51.167
69041
2020-07-28T04:57:23.157
2020-07-28T00:26:01.980
3060
9008
question
docker operating-system
Dockerの一部の簡易オペレーティングシステムAPIや読み取り専用のOSイメージとはなんですか？
質問に答える前に、用語の整理をしておきたいと思います。回答に関係ある部分の説明の都合上厳密な説明でない部分があります。またOSの中でもLinuxに偏った説明になっています。

ここで言うOSというのはカーネル＋ユーザランドです。

カーネルは、コンピュータの電源を入れた際にメモリ上に読み込まれて電源を落とすまで存在し続け、OSとしての基本的な作業をするプログラムです。(基本的な作業とは、プロセスやファイルシステムやネットワークなどのハードウェアを操作する機能を提供しその操作要求を受けて必要な処理をし続けます。その操作は後述するユーザランドのコマンドからシステムコールという手続きを踏むことによって行われます。)

ユーザランドとは、ファイルシステム上に置かれたコマンド群です。コマンドにはOSを管理するコマンドや基本的な操作コマンド(具体例ではシェルやlsやgrepやテキストエディタなど)が含まれます。(ただ最近のディストリビューションでは基本コマンドに限らず便利なコマンドや応用アプリケーションがユーザランドに最初から入っているような傾向にあります。)

ディストリビューションとは、OSとして必要なファイルをまとめてCDやDVDやUSBメモリなどのメディアに収めたものです。ディストリビューションはそれを行う団体ごとに様々なものが作られ、具体的にはRedHat,CentOS,Ubuntu,Debian,Alpineなどがあります。ディストリビューションによってユーザランドが大きく違っています。(カーネルもカスタマイズが異なってはいるのですがその差はあまり大きくありません)

> 「簡易オペレーティングシステムAPI」や「読み取り専用のOSイメージ」とはなんのことですか？  
>  おそらく「読み取り専用のOSイメージ」は <https://ja.stackoverflow.com/a/69029/9008>
> の回答で頂いているDebianかAlpineのことだと思っているのですが合っていますか？

「読み取り専用のOSイメージ」とはディストリビューションのメディアをファイル化したものです。  
DockerコンテナではOSイメージの中のユーザランドが使われカーネルは使用されません。代わりにカーネルはホストOSのものが使用されます。(カーネルが違うものが使われて問題ないか？という疑問があるかもしれませんが、違いが問題になるようなケースはほとんどありません。)

「簡易オペレーティングシステムAPI」が具体的に何を指しているかちょっとわかりませんが、ユーザランドにあるカーネルと密接に関わる管理コマンドのようなものを指している気がします。

> 「簡易オペレーティングシステムAPI」というのは文字通り簡易的なAPIの集合であって、OSとしての名前はないのでしょうか？

OSというより〇〇ディストリビューションのユーザランドに含まれる管理コマンドのようなものだと思います。

>
> 「コンテナ内のOSの共有」という考え方が出てきていますが、コンテナのOSがもし仮に色々あるとするならば、どのコンテナとどのコンテナが共有しあっているのかはどうすればわかるのでしょうか？（もしかして単なる軽量化の仕組みで、安全性はホスト側のOSが担っているので知る必要はない？）

dockerではコンテナを作る際にどのOSイメージを使用するかを明示的に指定するので、同じOSイメージを指定すればOSイメージは共有され、違うOSイメージを指定すれば別のOSイメージが使われます。区別のためにはどのように作ったかを記録しておくのが楽ですが、不明だったとしても一応調べることは出来ます。
CC BY-SA 4.0
2020-07-28T03:20:33.077
69052
2020-07-28T03:28:50.917
2020-07-28T03:28:50.917
30745
30745
69041
answer
@hidezz さんの回答で概ね合っていると思いますが，補足をさせてください。

## TL;DL

Microsoft Docs にある「簡易オペレーティングシステム API」とは，OS のシステムコールにあたるようなAPI
の軽量なサブセットではないかと思われます。

原文では「簡易～」ではなく「軽量オペレーティングシステム API」になっています。

**Microsoft のドキュメントは基本的にひどい機械翻訳が多いので，質問者さんには原文で読むことをおすすめします。**

## 詳説

次が Microsoft Docs における原文です。

> Contarner [..] contain only apps and some lightweight operating system APIs
> and services that run in user mode

<https://docs.microsoft.com/en-
us/virtualization/windowscontainers/about/containers-vs-vm>

Microsoft は「Drawbridge」と呼ばれる，プロセスコンテナ内に既存の Windows OS
の基本的なコンポーネントをライブラリ化しユーザーランドで動作するようにしたを入れるようにしたものを開発し学術論文を発表しています。さらにそれをLinuxに派生させた「Graphene」というものも存在します。  
<https://www.microsoft.com/en-us/research/project/drawbridge/>

そういった軽量 OS と呼ばれる分野が存在してコンテナの一種となっていることから，また，この Microsoft Docs のページはあくまで Linux
におけるコンテナではなくWindows Containerについてのドキュメントであることから，これはそういった軽量 OS の API
層を指しているのではないかと考えられます。

また，Windows における OS の API とはユーザーランドでハンドリングされる Win32 API のことも多く，Windows
のカーネルとして動作する `ntoskrnl.exe` へのシステムコールではないことがあるなど，そもそも OS の構造が Linux
と大きく異なるため，Microsoft のドキュメントの読み取りには注意が必要だと思われます。Windows は Linux
と異なりマイクロカーネルであるため，Linux であればカーネル内に存在する OS サービスがユーザーランドで動作することも多々あります。
CC BY-SA 4.0
2020-07-28T04:57:23.157
69056
2020-07-28T04:57:23.157
41279
69041
answer