
Dockerコンテナはホストカーネルを使用するため、オペレーティングシステムとハイパーバイザーは必要ありません。それでは、すべての公式イメージ(php、nginxなど)がイメージにオペレーティングシステムを使用するのはなぜですか?
例:Debianを使用したPHP 7の公式イメージ(Docker Hub):
FROM debian:jessie
アプリケーションコンテナは仮想マシンではなく、オペレーティングシステムの分離ではなくプロセスの分離を提供します。
私の理解で重要なものを見逃していますか?
答え1
オペレーティングシステムは単なるカーネル以上です。これはカーネルとユーザースペースのファイルの束です。したがって、/bin
and/etc
や/usr/bin
inなどのファイルは/lib
コンテナの実行時に通常プログラムを実行するには、サポートコード(共有ライブラリ、スクリプト)が必要です。
必ずしも必要ではありません。たとえば、プログラムの作成に使用する場合、go
単一のファイル以外には何もありません。
$ cat hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World")
}
$ go build hello.go
$ strip hello
これで、dockerfileは次のようになります。
FROM scratch
COPY hello /
CMD ["/hello"]
マイナーなケースです。これは単なる例です。
しかし、実行しようとすると、php
すべての依存関係を知っていますか?時には、共通オペレーティングシステムの最小限のコピーを導入する方が簡単です。しかし、いくつかのセキュリティリスクがあります。
(あなたも見ることができますhttps://www.sweharris.org/post/2016-06-04-small-container/)