質問: Dockerコンテナのシェルの中に入る - Qiita `docker exec` にシェルを指定することでコンテナ内でシェルを操作できます。 このシェルはホストのものではなくコンテナのものだと思うのですが、シェルというのはOSのカーネルと対話するものですよね。たとえば`httpd`のイメージ等はWebサーバー用のイメージですからOSというものは内蔵されていないと思うのですが、なぜシェルが動くのでしょうか? シェルが持つ代表的なコマンドが動くような最小限のOSがコンテナに内蔵されているのでしょうか?
回答: Docker のイメージにはユーザー空間向けのファイルやデータしか含まれません。カーネルイメージ (`/boot/vmlinuz*`) に相当するものは含まれません。コンテナ内のカーネルサービスはホスト OS 環境が提供するものを利用します。 コンテナとはホスト OS の各種リソース (プロセス ID、ファイルシステム、ネットワークなど) を分離してコンテナ専用の OS 環境を用意するものです。コンテナ内には OS のサービスとしてユーザー空間もカーネル空間は存在するし、当然どちらも利用できます。 `docker exec ...` すると Docker はコンテナを作成しますが、それはそのコンテナ用の名前空間 (`namespaces`(7)) を作成して隔離された OS 環境一式を作成し、その中で指定のコマンド (シェルなど) を起動しているに過ぎません。 コンテナ内でシェルが利用できるかどうかはコンテナイメージ内のファイル構成に依ります。シェルそのもの (`/bin/sh` など) のほか、シェルの実行に必要な共有ライブラリ等が存在すれば利用できるでしょう。それらを含めないコンテナイメージも作成可能です。