Dockerは奇妙だ:コンテナは実体ではなく、5つのLinux機能の寄せ集めにすぎない
Docker is weird
筆者は楽しみのために自作のコンテナランタイムを作り始め、Dockerの意外な仕組みを次々と発見した。コンテナはVMではなくカーネル上で動く特殊なプロセスにすぎず、実態はnamespacesやcgroupsなど5つのLinuxカーネル機能の組み合わせ。イメージも単なるフォルダで、chrootでルートを差し替えているだけだという。さらにruncがGoで書かれていることによるマルチスレッドやfork不在の難しさ、Dockerがrootを必要とする理由にも触れている。
コンテナとは、実のところ5つの異なるLinuxカーネル機能がトレンチコートを着て重なっているようなものだ。
HNでの議論
267- shykes
こんにちは、Dockerの作者です。この投稿を見かけました。他のエンジニアが自分が設計したシステムについてどう考えるかを見るのはいつも楽しいですね。何年もDockerの開発には関わっていませんが、懐かしい思い出話です。
質問があれば喜んでお答えします。
- jlhawn
> DockerのコンテナランタイムであるruncはGoで書かれています。
私は2014年から2019年までDockerで働いていました。最も重要な部分は実際にはCで書かれています。
[ここで、このハックがどう機能するかを説明するコメント全体を書きました。なぜなら、「Goで書かれている」というのが技術的にいかに不正確かにこだわりすぎていたからです。それから記事の残りを読むために戻ったところ、この直後の段落がそれなりの形で説明していることに気づきました!これは、投稿する前に記事を最後まで読むべきという教訓ですね。]
- vbezhenar
私の意見では、Dockerをユニークにしたのはコンテナ技術そのものではありません。私は20年前にchrootを使いましたが、それは問題なく機能しました。確かにネットワーク名前空間もプロセス名前空間もありませんでしたが、それらがそれほど重要だとは思いません。
Dockerをユニークにしたのは次の3つです:
1. Dockerfileの概念。イメージをレイヤーごとに構築する。レイヤーをキャッシュする。すべてが1つのファイルに。これによりイメージの反復が迅速になり、CIビルドを効率的に実装できるようになりました。
2. Dockerネットワークレジストリの概念。ユニバーサルイメージをサーバーに置き、世界中と共有する。
3. 勢い。伝統的にデプロイが複雑だった多くのソフトウェアが、突然Dockerサーバーに現れました。小さなdocker-composeでWordPressサイトをデプロイできたときの感激を覚えています。そしてそれがどれほど隔離されていたか。ホストからその痕跡をすべて削除するだけでよかったのです。ホストにいろいろなものをインストールするといつも不安でしたが、Dockerはその不安を解決してくれました。
- slowin
私はほとんどの場合Podmanを好みますが、Dockerは素晴らしいし、いわゆる「トレンチコートを着た5つの異なるLinuxカーネル機能」の上に素晴らしいDXを提供しました。それが売りです。超軽量で、すでに存在する(または開発中の)OS機能を最大限に活用しますが、それらは扱いにくく、大量の専門知識を必要としました。
- suprjami
複雑なものをその構成要素を学ぶことで解き明かす人を見るのはいつもいいですね。
これを知ると、rootless Podmanのfork-exec方式でコンテナを起動する方法の方が理にかなっていると感じるかもしれません。私もそう思います。rootもデーモンもソケットもありません。
コンテナを形成するために連携するLinuxカーネル名前空間についてもっと学びたいなら、このLWNシリーズがとても良いです:https://lwn.net/Articles/531114/
- j16sdiz
記事のすべての記述が「それのどこが奇妙なの?」と私に問いかけます。そのリストのすべては、物事が何年もかけてどう進化するかを知っていれば自然に感じられます。ただ私が年を取って好奇心が減っただけかもしれません。
- tyingq
bocker[1]を覗いてみてください。技術者にとっては、記事と同じポイントを非常に明確な方法で示してくれます。
[1] 「約100行のbashで実装されたDocker」
- sreekanth850
Redditでのカルト的な崇拝を見てからDockerが嫌いになりました。Linuxでアプリをデプロイする方法を誰かが尋ねると、必ず少なくとも1つのコメントが「Dockerを使えばいい」と言います。結局、私たちはスタック全体のためにDockerを全く使わない独自のデプロイ自動化ツールを構築することになりました。