概要
コンテナ技術についてのまとめ。
Dockerを使わずにコンテナをつくって触ってみる。
コンテナとは
- ホストOSからアプリケーションとランタイムをまとめて、分離した一連のプロセス。
コンテナの歴史
1979年 UNIX OSにchrootが登場。
2000年 FreeBSD jailsがFreeBSD 4.0に登場。chrootの発展系。
2001年 VServer Projectを通じてLinuxにもLinuxコンテナのベースとなる技術が登場。
2004年、LXC1.0がリリース。
Linux Containers
2008年、Dockerが登場
コンテナ技術は上記以外にもVirtuozzo、OpenVZ、HP-UX Container、Solaris Containerなど存在する。
コンテナと仮想化の違い
コンテナ
- ホストOSからアプリケーションとランタイムをまとめて分離した一連のプロセス。
- ホストOSのカーネル部分を共有している
仮想化
- ホスト型とハイパーバイザ型で構成が異なるが、仮想化は複数OSを用意できるような構成で、ゲストOS上でアプリケーションを実行する。
bmf-tech - Dockerとはにもざっくりまとめている。
コンテナ技術を実現するためのLinuxカーネルの機能
Kernel namespaces
- プロセスを6種類のリソース(ipc, uts, mount, pid, network, user)に分離する機能
- ユーザーがユーザー専用の分離されたリソースを持っているように見せる仕組み。
- 分離されたリソース同士は互いに干渉できない。
Apparmor and SELinux profiles
- Apparmor
- Linux Security Modules(Linuxカーネルにあるセキュリティのためのフレームワーク)の一種。
- アプリケーションのアクセス権限をセキュアに管理(強制アクセス制御)
- SELinux(Security Enhanced Linux)
- Linuxカーネルに強制アクセス制御機能を加えるモジュール
Seccomp policies
Chroots(using pivot_root)
- 現在のプロセスとその子プロセス群に対して、ルートディレクトリを変更する操作のこと
- ルートを変更されたプロセスは範囲外のファイルにアクセスできなくなる=>プロセス分離の実現
Kernel capabilities
- プロセスの権限管理
- root or not rootよりももっと細かい権限管理ができる
CGroups(control groups)
- プロセスを共通管理するために、プロセスをグループ化する機能
Dockerのコンテナ技術
以前までDockerはlxcを使っていたが、v0.9からgoで実装されたlibcontainerを使っているらしい。(cf. Docker blog - DOCKER 0.9: INTRODUCING EXECUTION DRIVERS AND LIBCONTAINER github - opencontainers/runc/libcontainer/)
標準仕様
OCI(Open Container Initiative)
Open Container Initiativeはコンテナとランタイムに関する業界標準の作成を目的として組織。
以下の仕様を定義している。
- OCI Runtime Specification
- OCI Image Format Specification
- OCI Distribution Specification
OCIはローレベルランタイムの仕様に関わっている。
ex. runC、gVisor、Kata Containers、Nabla Containers etc...
CRI(Container Runtime Interface)
CRIは、kubeletとコンテナランタイム間の通信のインタフェースを規定している。
CRIはハイレベルランタイムの仕様に関わっている。
ex. docker、containerd、cri-o
まとめ
- コンテナはリソースを分離されたプロセス
- コンテナはホストOSのカーネル部分を共有、ライブラリ部分は自由に選択できる
- コンテナに関連する仕様としては、OCIとCRIがある
LTした
Makuake LT Party(社内LT大会)にてLTをした。
speaker-deck - コンテナ完全に理解した
参考