🐳

Docker について完全に理解したい

2024/02/17に公開

概要

Docker を使い慣れてきたくらいの歴2-3年のエンジニアが、Docker 君のことあんまり知らなかったよね、と思い調査した記録

なんかいろんな記事を見て思うんですが、美味しいところだけ取っていて結局全体像を勉強しようとすると情報を様々なところから取ってこないといけないとか、この人はどういう流れでその情報に至ったの?みたいなのが欠落しているので個人的にモヤッとするんですよね。とくに初学者はつらそう。
よって学術界隈で言うところのレビュー論文的な立ち位置でこの記事を使ってもらえれば。まあこの記事も範囲の大小こそあれかいつまんでいるんですけど。

対象者

Docker を使ったことがあり Docker のライフサイクルとか、ハイパバイザとコンテナの違いとかそんなことはわかってんだよ俺は Docker がどうやって動いているかを知りたいんだ!という方

公式のアーキテクチャ説明を理解する

とりあえず 公式ドキュメントのアーキテクチャ説明 は読もう。
Docker を使い続けていると当たり前になっている Dockerfile とか container とかそもそも何?というのを技術面で教えてくれている。
この記事はこの説明をベースに解説する。

アーキテクチャ説明にでてくるわからないことを調べる

Docker は Linux をベースにつくられているので、説明中に Linux 内部のサービスがたくさん登場する。ここで Linux 初心者はひとつひとつ調査する羽目になる。

Docker は union ファイルシステム(UnionFS) を使い、これらのレイヤを単一のイメージに連結します。ユニオン・ファイルシステムは、ブランチとしても知られています。これは透過的な重ね合わせ(overlaid)と、互いに密着した(coherent)ファイルシステムを形成します。

???

UnionFS

このサイトが詳しい。
https://christina04.hatenablog.com/entry/2016/01/26/204659

UnionFS によって実現できる Copy on Write という思想で、image は ReadOnly に、Container は Writable にという Docker image の層状構造を作り上げているのだ。

つまり、こういうこと

Docker がイメージからコンテナを実行する時、読み書き可能なレイヤを既存イメージ上に追加し(先ほど見たとおり、ユニオン・ファイルシステムを使います)、アプリケーションを実行できるようにします。

じゃあ UnionFS はどうやって作られているの。。?という話にエンジニアなら当然なってくるとは思うが、一旦この記事では「Docker image? ああ、UnionFSが使われてるんだよね(笑)」とドヤれるくらいをサポートしておく。

namespaces

Docker は名前空間(ネームスペース)と呼ばれる技術を利用し、コンテナ (container) と呼ぶワークスペース(作業空間)の分離をもたらします。Docker はコンテナ毎に 名前空間 の集まりを作成します。

Docker container が独立した実行環境として優秀な所以。
https://rest-term.com/archives/3287/ 見ればよさそう
筆者が理解中なのでちょっと待って

Control groups

いわゆるcgroup。
https://rest-term.com/archives/3303/ 見ればよさそう
筆者が理解中なのでちょっと待って

libcontainer

仮想環境の基礎
extendedな感じ

Discussion