69029


[Dockerコンテナのシェルの中に入る -
Qiita](https://qiita.com/__cooper/items/4740c24666299c366044)

`docker exec` にシェルを指定することでコンテナ内でシェルを操作できます。  
このシェルはホストのものではなくコンテナのものだと思うのですが、シェルというのはOSのカーネルと対話するものですよね。たとえば`httpd`のイメージ等はWebサーバー用のイメージですからOSというものは内蔵されていないと思うのですが、なぜシェルが動くのでしょうか？

シェルが持つ代表的なコマンドが動くような最小限のOSがコンテナに内蔵されているのでしょうか？


CC BY-SA 4.0
2020-07-27T13:48:00.673
69025
2020-07-28T18:06:19.403
2020-07-27T15:44:19.027
3060
9008
question
linux docker shell operating-system
Dockerコンテナ内でシェルが動く理屈がわかりません


「OSのカーネルと対話」というのはシステムコールと呼ばれるものだと思いますが、  
コンテナ内部のプロセスも、システムコールはホストOSのカーネルが処理します。  
(これはホストOS上にあるプロセスのシステムコールをホストOSのカーネルが処理するのと同様です)

ちなみに質問にあるシェルに限らず、インストールされるコマンドやアプリケーションもすべてシステムコールを処理するカーネルが無いと動作することが出来ません。

※コメントを受け追記

ホストOSから見ると、ホスト上で動作する通常プロセスもコンテナ内に入っているプロセスも両方共管理下に置かれていてそれほど大きな区別がありません。この点はVirtualBoxなどのOSをまるごと仮想化する場合との違いだと思います。  
もちろんコンテナなどの隔離環境で動作しているかどうかを区別する情報は持っていて、実際の動作で処理を区別することはあるかもしれませんが、カーネルは基本的にはコンテナかどうかに関わらずシステムコールが呼ばれたらその指示に基づいた動作をするだけです。


CC BY-SA 4.0
2020-07-27T14:15:31.210
69026
2020-07-27T14:51:42.933
2020-07-27T14:51:42.933
30745
30745
69025
answer


("OSの`カーネル`と対話するものですよね" 辺りの文章の意図するところを理解できていませんが、タイトルの疑問に関しては)

単に`シェル`と呼ばれるプログラムがあらかじめコンテナイメージにインストールされているから動く、というだけです。

> `httpd`のイメージ

というのは

  * <https://hub.docker.com/_/httpd>

のことだと思いますが、 このページからリンクされている[GitHub上のリポジトリ](https://github.com/docker-
library/httpd/)に登録されている`Dockerfile`を見ると、ベースは[Debian](https://github.com/docker-
library/httpd/blob/6c8e82e20ecefc94c616439f15d14c4bb215b200/2.4/Dockerfile#L1)か[Alpine](https://github.com/docker-
library/httpd/blob/f5ef4cc849a4ea7ed56e797b86ad06ccf9f93a9a/2.4/alpine/Dockerfile#L1)であることがわかります。  
Debianであれば[`dash`](https://ja.wikipedia.org/wiki/Debian_Almquist_shell)が、Alpine
Linuxであれば([busybox](https://wiki.alpinelinux.org/wiki/How_to_get_regular_stuff_working#Shell_.40_commandline)の)[`ash`](https://ja.wikipedia.org/wiki/Almquist_Shell)が、
`/bin/sh` として入っています。

(ちなみに[`alpine`イメージ](https://hub.docker.com/_/alpine)の`Dockerfile`は[これ](https://github.com/alpinelinux/docker-
alpine/blob/v3.9/x86_64/Dockerfile)ですね。[`debian`](https://hub.docker.com/_/debian)は[スクリプトから生成している](https://github.com/debuerreotype/docker-
debian-artifacts)っぽく、`Dockerfile`そのものはバージョン管理対象ではなさそうでした)

* * *

例えばAlpineのイメージで`bash`を使いたい場合、素の状態ではインストールされていないので利用できませんが、[こちらのイメージ](https://hub.docker.com/_/bash)のように[別途インストール](https://github.com/tianon/docker-
bash/blob/master/5.0/Dockerfile)すれば利用できるようになる、というそれだけのことです。

使いたいプログラムが`シェル`と呼ばれるカテゴリに属しているかどうかは特に影響しない話かと思います。

* * *

> `シェル`が持つ代表的なコマンドが動くような最小限のOSがコンテナに内蔵されているのでしょうか？

`シェル`そのものが内蔵されています、というのが回答になります。


CC BY-SA 4.0
2020-07-27T14:46:08.827
69029
2020-07-27T14:54:56.430
2020-07-27T14:54:56.430
2808
2808
69025
answer


Docker のイメージにはユーザー空間向けのファイルやデータしか含まれません。カーネルイメージ (`/boot/vmlinuz*`)
に相当するものは含まれません。コンテナ内のカーネルサービスはホスト OS 環境が提供するものを利用します。

コンテナとはホスト OS の各種リソース (プロセス ID、ファイルシステム、ネットワークなど) を分離してコンテナ専用の OS
環境を用意するものです。コンテナ内には OS のサービスとしてユーザー空間もカーネル空間は存在するし、当然どちらも利用できます。

`docker exec ...` すると Docker はコンテナを作成しますが、それはそのコンテナ用の名前空間 (`namespaces`(7))
を作成して隔離された OS 環境一式を作成し、その中で指定のコマンド (シェルなど) を起動しているに過ぎません。

コンテナ内でシェルが利用できるかどうかはコンテナイメージ内のファイル構成に依ります。シェルそのもの (`/bin/sh` など)
のほか、シェルの実行に必要な共有ライブラリ等が存在すれば利用できるでしょう。それらを含めないコンテナイメージも作成可能です。


CC BY-SA 4.0
2020-07-28T07:14:42.350
69062
2020-07-28T07:14:42.350
3061
69025
answer


なるべく易しい言葉で説明してみたいと思います。

大事なのは、シェルというのは C 言語（あるいは他の言語でも）で書ける普通のプログラムである、ということです。OS
（カーネル）から見ればシェルは特別でも何でもなく、 `ls` や、 `httpd` と同列のプログラムなのです。シェルのプログラムとしては代表的には
`bash` 、他には `sh`、`csh`、`dash` などがあります（これらの区分については若干注意が必要ですがここでは略します）。

言いかえるならば、シェルというのは、他のプログラムを起動するために使うプログラムということです。シェルの中でシェルを起動することもできます。シェルが入れ子になっている回数は
SHLVL という環境変数に入っていますから、以下のようなことができます。

[code]

    $ echo $SHLVL
    1
    $ bash         # A: 新しくシェルを起動
    $ echo $SHLVL  # 見分けがつかないがここは A のシェルの中
    2
    $ <ctrl+d>     # A のシェルを抜ける
    $ echo $SHLVL  # 元のシェルに戻ってきた
    1
    
[/code]

ご質問の点について： シェルも `httpd` も同じプログラムですから、Docker
の中で同じように実行することができます。そこでご質問の問題については、Docker
がどのようにプログラムを起動しているか、という点に整理できるのではないかと思います。残念ながら、その問題は Docker
の基本的な設計に関わるところで、そもそも OS が何をしているかという点から始めて順を追って理解していかねばならないような非常に大きなテーマです。

ここでは「Docker はプログラムの実行環境を抽象化しているものだ」というふわっとした説明でひとまずは納得していただければ、と思います。


CC BY-SA 4.0
2020-07-28T18:06:19.403
69073
2020-07-28T18:06:19.403
40595
69025
answer