読書感想文 | イラストでわかるDockerとKubernetes
定期的に忘れるので、こちらの本で知識をnoteで体系化して長期記憶に保存したい
(Kubernetesは業務で使っていないので、飛ばしています)
カンファレンス
コンテナの特徴
独立した実行環境をもつ
・固有のルートファイルシステム
・プロセス
・他の環境からリソースが見えない
コンテナの実態はプロセスであり、OSカーネルの提供する環境隔離機能が仕組みが作れている
軽量で、高いポータビリティー
・コンテナ軽量なイメージの軽量さとその挙動の再現性の高さ
・業界標準仕様によるコンテナへの統一的な操作方法
コンテナは軽量であり、その素でもあるコンテナイメージも軽量である。容量が数十MB~数百程度であり、仮想マシンイメージに比べて、軽く作れる
コンテナのワークフローを構成要素に対して操作は、業界仕様に沿って定められており、ツール間で共通に取り扱えることができる
Build(イメージの作成)
Ship(イメージの配布)
Run(コンテナの実行)
エコシステム
OpenContainerInitiative
標準仕様を定めている
CloudNativeComputingFoundation
さまざまなOSSプロジェクトがホストされており、「Graduated」「Incubating」「Sandbox」でランクが設けられている
Kubernetesを始めとするオーケストレーションエンジン向けのプライグインや周辺ツールがこれら仕様に基づいて開発されている
参考
Docker
Dockerはイメージに対してBuild、Ship、Runすることができる。
Build
Dockerfileをコンテキストでイメージを作成
コンテキストとは、コンテナに格納するプログラムのことを指す
DockerFile
命令 引数
From:土台となるイメージを作成。ubuntuイメージの場合、ルートファイルシステムが設定される
COPY:コンテキストをコンテナにコピーする。
ENTRYPOINT:コンテナ起動時に実行したファイルを指定する
docker build でコンテナを作成
Ship
作成したイメージをDocker Hubに保存することができる。
イメージにはタグをつけることができ、複数のバージョンを管理することができる
<リポジトリー> / <イメージ名:タグ名> で書くこと
docker pushコマンドでDocker Hub に格納する
pull後は、リポジトリ画面で確認できる
docker pull コマンドでリポジトリからダウンロードできる。別ホスト環境でも可能になる
Run
docker run でコンテナ実行
docker exec でコンテナの中を除く
docker stop でコンテナを停止
docker rm でコンテナを削除
コンテナのレイヤ
イメージから実行されるコンテナは、なにも格納されていない状態からから、以下の変更差分群を次々と適用した結果として得られるファイル群をルートファイルシステムとして用いて実行する
ベースのレイヤ
アプリケーションAをインストール
ファイルBを追加
レジストリもレイヤ単位で、イメージのデータをアップロードしたり、ダウンロードするAPIを持ってたりするので、重要な概念
イメージの仕様
インデックス(optionalなJSONファイル)
プラットフォームごとなど、マニフェストを複数参照可能
マニフェス(JSONファイル)
1つのイメージの設計図となるJSONファイル
layer.tar
コンテナが用いるルートファイルシステムのデータ
変更差分
13c….5894.json(config)
実行コマンドや環境変数など、実行環境を再現するための情報
manifest.json
イメージの構成などに関する情報
repositories
VERSION
イメージのビルド
DockerFileの命令に従い、ビルドが進む
命令にそってレイヤーが上乗せさせる
イメージをビルドする際は、レイヤ構造やキャッシュの使われ方を意識することで、より効率的なビルドを行うことができる
イメージを軽量化するために、複数のレイヤをまとめる
より軽量なベースイメージを用いる
コンテナ実行時のレイヤ
1つのイメージで複数のコンテナを作った場合、イメージに含まれていたレイヤはコンテナ間で共有される。
新しい結果は、コンテナ間では共有されない
Copu on Write(CoW)の仕組みで実現できている
Storage driver
Dockerは、CoWの仕組みを提供するために、レイヤ群の管理を担うStorage driverというコンポーネントを使っている。
Dockerデーモンに実装されている
Storage Driverの実装は、aufs、btrfs、overlayfs、overlay2などさまざまがある
overlayファイルシステムは、Linuxカーネル3.18から導入されている
overlayファイルシステムで、読み書き可能レイヤ、読み取り専用の挙動を確認することができる
Dockerデーモンとクライアント、OCIランタイム
Dockerはクライアント/サーバ型のアーキテクチャ
Dockerコマンドで指示をだす
Dockerデーモンが、コンテナのライフシア来る全体の管理を担うが、実際に実行環境をコンテナとして作ったり、コンテナを直接操作するは、OCIランタイム。Dockerデーモンが、コマンドを受け付けて、OCIを操作している形になる
OCIの実装には、runc、gVisor、Kata Containersなどさまざまある
Linuxカーネルのnamespace、cgroupや仮想マシン、ユーザ空間カーネルなど多様
Linux環境だと基本は、runcが使われる
コンテナランタイム
runc
OCIによるリファレンス実装のコンテナランタイム
DockerはOCIラインタイムとして、runcを使用
構成要素
namespaces
リソースを隔離
process
cgrooups
リソースに制限の設定を施す
gVisor
Sentryというコンポーネントでユーザ空間をサービスする
システムコールがフックになる
Linuxのptrace機能などを用いてフックされる
SentryからホストOSへのシステムコール発行は制限されており、ファイルへのアクセスは別プロセルであるgoferを経由する
Kata Containers
軽量な仮想マシーンを作成し、その中でコンテナを実行する
OCIの標準仕様
OCI Runtime Specification
低レベルランタイムの仕様
FileSystem bundleをOCI準拠のランタイムを指定し、コンテナを作成する
コンテナの実行を開始する
コンテナの内のアプリケーションが終了する
コンテナを削除する
OCI Image Specification
コンテナイメージの標準仕様
マニフェス
レイヤ
コンフィギュレーション
インデックス
OCI Distribution Specification
コンテナレジストリのAPIを定義する仕様
マニフェスのpull
レイヤのpull
マニフェスのpush
レイヤのpush
実行環境作成に用いられる要素技術
namespaceとは、あるプロセルから操作可能なリソースを、その他のプロセスから隔離できる機能。複数のnamespaceを組み合わせて、実行環境を作成する
PID namespace(プロセス群の隔離)
Mount namespace(マウントポイントリストの隔離)
Network namespace(ネットワーク関連のリソースの隔離)
UTS namespace(ホスト名などの隔離)
IPC namespace(プロセス間通信に関するリソースの隔離)
User namespace(ユーザー/グループや権限などの隔離)
cgroupとは、プロセスが使用可能なリソースについて、さまざな設定を施せる。各リソースは、「サブシステム」と呼ばれるカーネルのコンポーネントで管理され、それらの設定は「cgroupファイルシステム」を通じて行われる。プロセスは、cgroupのいずかに所属する。
デバイスファイルへのアクセス権限
プロセルから利用可能なCPUの制限
プロセルが利用可能なメモリ使用量の制限
まとめ
かなり勉強になりました〜、Linux周りの機能をもっと深掘りしたい気持ちです