読書感想文 | イラストでわかるDockerとKubernetes

定期的に忘れるので、こちらの本で知識をnoteで体系化して長期記憶に保存したい

(Kubernetesは業務で使っていないので、飛ばしています)


カンファレンス

KubeCont + CloudNativeCon


コンテナの特徴

独立した実行環境をもつ

・固有のルートファイルシステム
・プロセス
・他の環境からリソースが見えない

  コンテナの実態はプロセスであり、OSカーネルの提供する環境隔離機能が仕組みが作れている 

軽量で、高いポータビリティー

・コンテナ軽量なイメージの軽量さとその挙動の再現性の高さ
・業界標準仕様によるコンテナへの統一的な操作方法

コンテナは軽量であり、その素でもあるコンテナイメージも軽量である。容量が数十MB~数百程度であり、仮想マシンイメージに比べて、軽く作れる

コンテナのワークフローを構成要素に対して操作は、業界仕様に沿って定められており、ツール間で共通に取り扱えることができる

  • Build(イメージの作成)

  • Ship(イメージの配布)

  • Run(コンテナの実行)

エコシステム

OpenContainerInitiative

  • 標準仕様を定めている

CloudNativeComputingFoundation


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 でコンテナを削除


コンテナのレイヤ

イメージから実行されるコンテナは、なにも格納されていない状態からから、以下の変更差分群を次々と適用した結果として得られるファイル群をルートファイルシステムとして用いて実行する

  1. ベースのレイヤ

  2. アプリケーションAをインストール

  3. ファイル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周りの機能をもっと深掘りしたい気持ちです

この記事が気に入ったらサポートをしてみませんか?