[コンテナの歴史]Dockerができるまで 第三回 〜集合知を集めて歴史を知ろう〜

目的(ゴール)

  • 時代や目的・背景を知って、コンテナについて理解を深める。
  • どのような構成要素によってDockerが作られているかを知る。

自己紹介

Sayaka

  • 名前:さやか
  • twitter:@flower_norn
  • 趣味:
    • 旅行
    • 星空鑑賞、
    • 自作PC(水冷)、
    • カメラ ...etc
  • 職業:
    • ネットワークエンジニア上がりの広く薄くできる何でも屋さん。
    • 最近はMS(Azure, AD, MBAM,SCCM..etc)がメイン。

事前にお伝えしておくこと

  • Dockerの歴史は、コンピューターの歴史、仮想化の歴史とも言えます。
  • 音声通話・チャットでの優しいまさかりを受け付けています。
  • ※一緒に話に乗ってくれる方も募集しています。

仮想化・コンテナ化の歴史における解決したい永遠のテーマ

  • 目的・背景
    • 貴重なリソース(当時は高価だった)をいかに効率よく使用するか
    • セキュアな環境の確保

前回の振り返り

1999

  • Virtuozzo(OpenVZの前身)のファーストステップ

2000

  • FreeBSD jail が FreeBSD 4.0 に導入 (Feature)x

2001

  • Linux VServer

  • Mount namespaces

2003

2004

  • Solaris Containers(Zone) 登場

2005

必要基礎技術

- リングプロテクション https://ja.wikipedia.org/wiki/リングプロテクション 

uml.png

本編

2006

  • Process (その後のcgroups)
    • 機能
      • リソースの制限
      • 優先順位付け
      • 費用請求のためにグループリソース使用量の測定
      • プロセスグループの凍結
    • 背景
      • 限られた費用やリソース使うために生まれた。
      • なおかつ、リソースは隔離して使うためでもある。
    • 利用されているところ
      • systemd
      • CoreOS
      • Docker
      • LXC
      • Hadoop
      • Kubernetes
    • 備考
      • Linux kernel 2.6.24
  • 2006-11-29,Linux kernel 2.6.19により、UTS namespaces が実装
    • 詳細
      • 名前は、「UNIX Time-sharing System」から派生(←UTSの解説)
      • utsname構造体の名前空間化
        • uname コマンドで取得できる情報
      • システムコールによって返されるnodenameと domainnameの 2つのシステム識別子を分離
      • 各コンテナは独自のホスト名とNISドメイン名を持つことができる
        • NIS:UNIXにおける各コンピュータのあれやこれやの情報を管理する仕組み=WindowsのActive Directory
        • NISドメイン名;NISで使われる個々の名前
    • 背景
    • 利用されているところ
      • コンテナを起動すると普通は使う
  • 2006-11-29,Linux kernel 2.6.19により、IPC namespaces が実装
    • 詳細
      • 特定のプロセス間通信(IPC)リソース、つまりSystem V IPCオブジェクトと(Linux 2.6.30以降の)POSIXメッセージキューを分離
      • IPCオブジェクトがファイルシステムのパス名以外のメカニズムによって識別されること
      • 独自のSystem V IPC識別子セットと独自のPOSIXメッセージキューファイルシステムがある。
      • http://linuxjm.osdn.jp/html/LDP_man-pages/man7/svipc.7.html 
    • 背景
    • 利用されているところ

2007

  • Solaris LDoms
    • Local Domain Logical Domains (LDoms or LDOM) is the server virtualization and partitioning technology for SPARC V9 processors. It was first released by Sun Microsystems in April 2007

2008

  • LXC (LinuX Containers)
    • 機能
      • cgroupsとLinuxネームスペースを使って実装
      • プレーンなLinuxカーネルが利用可能
      • 個別のプロセスとネットワークスペースを作り出す仮想環境
      • コンテナ用のOSテンプレートやツールセットが利用可能
    • 背景
      • Linux kernel に実装が進むコンテナ関連機能を開発者が試せるように実装が始まった
  • 2008-01-24,Linux kernel 2.6.24
    • PID namespaces が実装
      • 詳細
        • プロセスID番号空間を分離
        • 異なるPID名前空間のプロセスは、同じPIDを持つことができる
        • コンテナー内のプロセスに同じプロセスIDを保持しながら、コンテナーをホスト間でマイグレーションできる
        • 各コンテナが独自のinit(PID 1)を持つことを可能 する。
      • 背景
      • 利用されているところ
    • cpu cgroup(相対配分機能)
      • 詳細
        • CPU の割当を他cgroupとの相対比率で指定できる
    • cpuacct cgroup
      • 詳細
        • cgroup内のプロセスがどれだけCPUを使ったかをカウントできる
    • cpuset cgroup
      • 詳細
        • cgroup内のプロセスがどのCPU、CPUコア、NUMA(メモリ)ノードを使えるか指定できる
        • 元々cgroupの機能としては開発されていなかった
  • 2008-07-13,Linux kernel 2.6.26
    • device cgroup
      • 詳細
        • cgroup内のプロセスのデバイスへのアクセス許可を指定できる
  • 2008-12-25,Linux kernel 2.6.28
    • freezer cgroup
      • 詳細
        • cgroup内のプロセスを一斉に停止させたり再開させたりできる

2009

  • 2009/02, AUFS v1が正式リース
  • 2009-03-24,Linux kernel 2.6.29
    • Network namespaces が実装
      • 2.6.24で実装され、2.6.29で完成(その後も機能追加はされているけど…)
      • 詳細
        • ネットワークに関連するシステムリソースの分離
        • 独自のネットワークデバイス、IPアドレス、IPルーティングテーブル、/ proc / netディレクトリ、ポート番号を持つことができる。
        • 固有の(仮想)ネットワークデバイスと、名前空間ごとのポート番号空間にバインドする独自のアプリケーションを持つことができる。
        • ホストシステムの適切なルーティングルールは、ネットワークパケットを特定のコンテナに関連付けられたネットワークデバイスに送ることができる
        • 同じホストシステム上に複数のコンテナ化されたWebサーバーを配置し、各サーバーを(コンテナ単位の)ネットワーク名前空間のポート80にバインドすることができる。
      • 背景
      • 利用されているところ
    • memory cgroup
      • 詳細
        • cgroup内のプロセスのメモリ使用量を制限できる
    • net_cls cgroup
      • 詳細
        • tcコマンドから使えるようにパケットにマーキングできる(cgroup内のプロセスのネットワーク帯域制御ができる)

2010

  • 2010-02-24,Linux kernel 2.6.33によりblkio cgroupが実装
    • 機能
      • blockデバイスのI/Oの優先度をcgroup間の相対配分で指定できる
      • memory cgroupとの連携がないのでbuffered I/O(通常のディスクIOですな)をちゃんと制限できない(Direct I/Oのみ)
      • buffered I/Oの制限はcgroup v2で実現

2011

  • Warden (CloudFoundry)
    • 機能
      • デーモンとして動作し、コンテナ管理のためのAPIを提供する、あらゆるオペレーティングシステム上の環境を隔離することができる。
      • 複数のホスト間でコンテナのコレクションを管理するためのクライアント/サーバーモデルがある。
      • cgroup、namespace、およびプロセスのライフサイクルを管理するサービスが含まれている。
      • 詳細なアーキテクチャは https://www.slideshare.net/i_yudai/warden  を参照
  • 2011-01-04,Linux kernel 2.6.37
    • blkio cgroupに帯域制御機能が追加
      • 機能
        • I/Oの帯域制御ができる(IOPSや流量制限)
        • Direct I/Oのみの制限なのは同じ
    • cgroupに clone_children 機能実装
      • 機能
        • cpusetで親cgroupの設定を子が引き継げる
        • これにより2.6.33で実装されていた問題がある機能であるとされた ns cgroup が削除できる準備が整う(ns cgroupは3.0で削除)

2012

  • 2012-01-04,Linux kernel 3.2でcpu cgroupに帯域制御機能が追加

    • 機能
      • cgroup内のプロセスが使うCPUの処理時間を制限できるようになった
  • 2012-03-18,Linux kernel 3.3でperf_event cgroupがマージ

  • 2012-09-30,Linux kernel 3.6でhugetlb cgroupがマージ

2013

  • Omega (google)

  • 2013年2月18日,カーネルメモリコントロールグループ(kmemcg)がLinux Kernel 3.8にマージ

    • 機能
      • カーネルが独自の内部プロセスを管理するために利用できるメモリ量を制限する(実装途中
  • 2013-02-28,Linux kernel 3.8

    • User namespaces が実装
      • 詳細
        • ユーザーIDとグループID番号のスペースを分離
        • プロセスのユーザーIDとグループIDは、ユーザー名前空間の内部と外部で異なる物を持つことができる。
        • プロセスが、名前空間内に通常の特権のないユーザーIDを持つことができ、同時に名前空間内にユーザーIDが0である
        • 特権を持たないプロセスがユーザーネームスペースを作成することができる(他のnamespaceは特権が必要)
        • 3.9でXFS以外のファイルシステムで、3.12でXFSで使えるようになる(実質使えるようになったのが3.12)
      • 背景
        • 特権を持たないプロセスに限定的ではあるが特権を渡すことでセキュアにコンテナを起動する
      • 利用されているところ
        • LXDが起動するコンテナは非特権コンテナなのでこの機能を使う
    • setns が全namespaceで使えるようになった
      • ホスト環境からコンテナ(名前空間)内でプロセスを実行できる(コンテナ内に入れる)
  • Let Me Contain That For You(LMCTFY)がグーグルにより公開

    • 詳細
      • Google's container stackのopen-source版である。
      • アプリケーションコンテナで使うことを想定して作られた
      • ユーザが cgroupfs の細かい点を理解していなくても,やりたいことが実現できるようなインターフェースを持つ
  • 2013年3月26日、Docker がオープンソースのソフトウェアとして公開

    • 詳細
      • dotcloudがSaaSのために作ったアプリケーションコンテナ
  • 2013-09-02, Linux kernel 3.11でCheckpoint/Restart関連機能の実装が揃う

    • 機能
      • ある時点のプロセスの状態を保存し、展開し、プロセスを再開できる
      • コンテナのチェックポイント・リスタート(ライブマイグレーション)が可能に
      • この機能を実装したユーザランドのプログラムが CRIU  (OpenVZプロジェクトの成果)
    • 背景
      • コンテナのライブマイグレーションを実現したい
    • 利用されているところ
      • LXC/LXD

2014

  • 2014-02-20 LXC 1.0.0 リリース

  • Kernfs、2014年3月にLinux Kernel 3.14のLinuxカーネルに導入

    • 機能
      • cgroupを利用したファイルシステム
      • sysfsロジックのいくつかを独立したエンティティに分割
      • 他のカーネルサブシステムが、デバイスの接続と切断
      • 必要に応じての動的な作成と削除
      • その他の属性を扱う独自の仮想ファイルシステムをより簡単に実装
  • 2014年6月10日,Docker 1.0リリース

    • 詳細
      • コンテナのイメージを置く場所であるDocker Hub発表
  • 2014年6月10日,Kubernetes の公開 (google)

  • 2014年12月, ?

  • 2014-12-07, Linux kernel 3.18でoverlayfsがマージ

    • 機能
      • aufsのような重ね合わせファイルシステム
      • Ubuntu/SuSEはマージ以前からカーネルにパッチがあたっていた

2015

  • 2015年4月9日、 AWS EC2 Container Service(ECS)を発表し、Dockerをサポート。

  • 2015年5月4日, 「Windows Server 2016 Technical Preview 2」において、Nano Serverがサポート

    • 詳細
      • Windowsカーネルとネットワークなど最低限の機能を実装
      • GUIはない
      • Windows Serverより93%低いVHDサイズ、92%の重要なセキュリティ勧告、および80%少ない再起動を備えている。
    • 背景
  • 2015年6月22日, Linux Foundationがコンテナ技術の標準化を目指す「Open Container Project」を立ち上げ

    • 参加企業
      • Dockerのほか、Apcera、Amazon Web Services(AWS)、Cisco Systems、CoreOS、EMC、富士通、Google、Goldman Sachs、Hewlett-Packard(HP)、Huawei Tehcnologies、IBM、Intel、Joyent、Pivotal、Mesosphere、Microsoft、Rancher、Red Hat、VMWareが参加
  • 2015年7月21日, Kubernetes v1.0のリリース

  • 2015年8月19日, 「Windows Server 2016 Technical Preview 4」において, Server Containersを実装

    • 詳細
      • Windowsで初のDokcerを採用し、Windowsコンテナを作成できる基盤が完成
      • 同じOSカーネルを共有する。
      • 仮想化を導入する必要はない。
    • 背景
      • ちなみに Virtuozzo(OpenVZの商用版)にもWindows版がありました。MSの協力なしには開発できないと思われるので元々ベースとなる技術はMSにあったのかもしれません(想像です)
  • 2015-11-01, Linux kernel 4.3にpids cgroupがマージ

    • 機能
      • cgroup内のプロセスがforkできるプロセス数を制限できる
      • 勉強会中に言った fork bomb 対策
  • 2015年11月19日, 「Windows Server 2016 Technical Preview 4」において, Hyper-V Containersを実装

    • 詳細
      • Windowsコンテナを作成できる基盤が完成。
      • hyper-v上にコンテナ専用のOSが起動する
      • ホストOSから各コンテナを分離できる。
      • 専用のWindowsカーネルが利用可能。
  • 2015年12月、Dockerが独自のコンテナオーケストレーションツールのDocker Swarmを発表

    • 機能
      • コンテナのクラスタ化
      • 管理コンソールが付随

2016

  • 2016-03-13, Linux kernel 4.5でcgroup v2がstableに(最初に入ったのは開発版扱いで3.16 / 2014-08-03)
  • 2016年4月19日, Microsoft AzureがAzure Container Service(ACS)を発表、Dockerをサポート。
  • 2016-05-15, Linux kernel 4.6にcgroup namespaceがマージ
    • コンテナごとの独立したcgroupツリーを見せることができるようになった
  • 2016年6月、DockerにSwarmバンドルを発表
  • 2016年12月、Dockerからcontainerdが分離

2017

  • 2017年2月7日,「Kubernetesはオープンソースのコンテナオーケストレーションのデファクトになった」と、CoreOSがfleetの開発を終了、代わりにKubernetes採用を発表

  • 2017年4月,Moby Project発表

  • 2017-04-30, Linux kernel の rdma cgroup がマージ

  • 2017年7月,Open Container Initiative、コンテナ関連の標準仕様v1.0を発表

  • 2017年10月, DockerがKubernetesをサポート

  • 2017年10月17日,Windows Subsystem for Linuxが正式リース

    • 個人的な背景考察
      • コンテナを使うためにLinuxカーネルが必要であり、Microsoftもその盛り上がりにWindowsにLinuxを実装せざるえなかったとおもう。そうしなければ、コンテナの開発がしずらい状況になるのは明白であり、Windowsユーザーが離れていくことを懸念していたのではないかと考察する。=MSの焦り

2018

  • 2018年4月, Docker発展の貢献者、Docker社創業者兼CTOのSolomon Hykes氏がDockerを去ると発表

これから~そして未来

  • 調べる時間が足りず考察をすることができませんでした。申し訳ないです。
  • ただ思うことは、より便利により効率よく管理できサービスを提供時代が来るのでしょう。障害があっても自動で復旧してくれるようなマイクロサービスを実現してくれる基盤がコンテナだと思っています。

special thanks

  • @ten_forward さん (情報提供および加筆修正)
  • @kazutomi‗m (一緒に進行役)
  • リスナーの皆様

memo

  • vertualizationの登場
  • chrootの登場
  • namespaceの登場
  • jailの登場