概要
コンテナ技術についてのまとめ。 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を用意できるような構成で、ゲスト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をした。
参考
- bmf-tech - Dockerとは
- [コンテナの歴史]Dockerができるまで 第二回 〜集合知を集めて歴史を知ろう〜
- redhat - Linux コンテナとは
- redhat - Linuxコンテナとは何か
- Linux Container
- ITソリューション塾 - 【図解】コレ1枚で分かるコンテナ型仮想化とDocker
- SELinux Project Wiki
- opensuse - AppArmor
- kernel.org - SECure COMPuting with filters
- man7.org - Linux Capabilities
- gihyo.jp - LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術
- ゆううきブログ - 自作Linuxコンテナの時代
- Think IT - コンテナ技術の基礎知識
- Linux Containers - LXDとは?
- Hewlett Packard Enterprise - Dockerコンテナと仮想化の違いとは?SynergyとDevOps
- www.publickey1.jp - コンテナランタイムの仕組みと、Firecracker、gVisor、Unikernelが注目されている理由。 Container Runtime Meetup #2
- thinkit.co.jp - Kubernetes 1.20から始まるDockerランタイムの非推奨化に備えよう!我々が知っておくべきこと・すべきこと
- container-security.dev - Container Security Books
- github.com - opencontainers/runtime-spec
- udzura.hatenablog.jp - OCI Runtime Specificationを読む
- medium.com - コンテナユーザなら誰もが使っているランタイム「runc」を俯瞰する[Container Runtime Meetup #1発表レポート]
- Docker一強の終焉にあたり、押さえるべきContainer事情
- gkuga.hatenablog.com - OCI Runtime Specificationを読んだので概要を書く
- yohgami.hateblo.jp - chrootとunshareを使い、シェル上でコマンド7つで簡易コンテナ
- コンテナ技術入門 - 仮想化との違いを知り、要素技術を触って学ぼう
- dockerコマンドを使わずにコンテナを作る - 1
- kaminashi-developer.hatenablog.jp - 【Go言語】自作コンテナ沼。スクラッチでミニDockerを作ろう
- www.youtube.com - Building a container from scratch in Go - Liz Rice (Microscaling Systems)
- medium.com - Understand the Design of Container Runtime