コンテナの仕組みは、Docker が登場する前から少しずつ作られていました。 それをアプリの作成・配布・起動に使いやすくまとめたのが Docker です。 さらに、複数のマシンでコンテナを動かし続ける道具として Kubernetes が登場しました。
この章では、年表を動かしながら「何に困って、どんな道具が生まれたか」をたどります。 年号を覚えるより、前の道具で足りなかったものが次の道具につながる流れを見てください。
GOAL この章のゴール
- Docker が使いやすくしたことを、Linux の機能と区別できる
- Kubernetes が生まれた背景を説明できる
- 公開後の Kubernetes を誰が開発・支援しているか分かる
年表を動かす
まず全体を眺めます。 スライダか再生ボタンで動かしてください。 点をクリックしても選べます。
Docker2013.3
Docker 公開 (dotCloud)
PyCon のライトニングトークで披露され、同じ月の 3 月 20 日にオープンソースで公開。レイヤー化したイメージ、レジストリ、1 行の CLI を一つに束ねた。
- Linux / 隔離技術
- Docker
- Kubernetes
- その他
- クラウド
8/222013.3 Docker 公開 (dotCloud)
2014 年以降の行には、CRI や kube-proxy のような Kubernetes の部品の名前が出てきます。 どれも 5 章以降で説明するので、今は「そういう出来事があった」と読み流して構いません。
色の違いは、カーネル側の隔離技術、Docker、Kubernetes、クラウド、その他、の 5 種です。 前半はカーネル側ばかりで、2013 年から Docker と Kubernetes が交互に出てくることが見て取れます。
デプロイの 3 つの時代
1 台の物理サーバーに複数のアプリを置くと、あるアプリが CPU を多く使ったときに、ほかのアプリも遅くなることがあります。 アプリごとにサーバーを分ければ影響を分けやすくなりますが、空いている CPU やメモリも増えがちです。
この問題に対して、アプリを分ける単位がどう変わったかを見ます。
次の仮想化の時代では、1 台の物理サーバーの上に複数の VM を置き、アプリを VM ごとに隔離しました。 EC2 はこの時代の延長にあります。 代わりに、「各 VM は自分の OS を含む全部の構成要素を持つ完全なマシン」なので、VM ごとに OS を丸ごと動かす分のオーバーヘッドが生じました。 コンテナの時代は、「アプリの間で OS を共有するように隔離を緩めた」方法として現れました。 1 章で見た違いが、時代の流れとして位置づけられます。
コンテナは昔からあった
1979 年の Version 7 Unix に入った chroot は、前の章で見た通り、プロセスのルートディレクトリを差し替えるシステムコールです。
V7 のマニュアルには chdir と並んで「chroot はルートディレクトリ、すなわち / で始まるパス名の起点を設定する。スーパーユーザーだけが呼べる」とあり、隔離の道具としては書かれていません。
2000 年 3 月の FreeBSD 4.0 は「安全なプロセス実行環境を作るための柔軟性を増す」ものとして jail システムコールを加え、ここにプロセスとネットワークの隔離が足されました。
Sun は 2004 年 11 月の LISA ’04 で Solaris Zones を発表し、2005 年の Solaris 10 に入れています。
Linux 側では、2002 年 8 月の 2.4.19 で mount namespace が入りました (mount_namespaces(7) の HISTORY に「Linux 2.4.19」とあります)。 2006 年 9 月に Google のエンジニアが「Containers」という名前でリソース制御の仕組みを Linux に提案し、翌年「control groups (cgroups)」に改名されて、2008 年 1 月の 2.6.24 に入りました。 同じ 2.6.24 で PID namespace と、ネットワーク namespace の基本部分も入っています。 そして同じ 2008 年の 8 月に、これらをまとめて「コンテナ」として扱うユーザー空間ツールの LXC 0.1.0 が出ています。
ここまでで、前の章の 4 コマのうち「見える世界の分離」「root の入れ替え」「使える量の制限」は揃っています。 Docker が出るまで、まだ 5 年あります。
なぜ 2013 年の Docker で広まったのか
Docker は、dotCloud という PaaS の会社が社内の実行基盤を切り出したもので、2013 年 3 月の PyCon でのライトニングトークで披露され、同じ月の 3 月 20 日に最初のバージョンが公開されました。 LWN の記事が書くように「最初期の Docker は実際には LXC のラッパー」で、コンテナを作る部分は LXC に任せていました。 Docker 自身が足したのは次の 4 つです。
- レイヤー化されたイメージ。AUFS を使って、ファイルシステムの差分を層として積み、共有できるようにした。
- レジストリ。イメージを push / pull で配る場所を用意し、2014 年 6 月に Docker Hub として公開した。
docker run一発。LXC の設定ファイルを書かずに、1 行でコンテナが動く CLI。- Dockerfile。イメージを作る手順をコードとして残せるようにした。
つまり Docker の発明は「作って、配って、動かす」を 1 本の体験にしたことです。
LXC を使っていた人は、イメージを自分で tar に固めて scp していました。
Docker はそこを docker push / docker pull にしました。
イメージの配布と起動を短いコマンドで試せるようになりました。
2014 年 3 月の Docker 0.9 で LXC は「任意の実行ドライバー」に格下げされ、自前の libcontainer で namespace と cgroups を扱うようになりました。
この libcontainer が、2015 年 6 月に OCI (Open Container Initiative) へ寄贈されて runc になります。
Kubernetes が Google の手を離れるまで
Google は Borg という社内のクラスタ管理基盤を、2015 年の時点で「10 年以上」運用していました。 その 2015 年 4 月に Borg の論文 (EuroSys 2015) が公開され、Kubernetes のブログは「Kubernetes は Borg の直系の子孫で、Kubernetes を作っている開発者の多くは元 Borg の開発者である」と書いています。 Docker が広まった 2014 年 6 月、Google は Kubernetes を「コンテナをマシン群にデプロイする、無駄のない強力なオープンソースのコンテナ管理ツール」として公開しました。 コンテナの実行には Docker を使い、「API に書かれた状態を正として、基盤上でその状態を維持し続ける」設計です (5 章で中身を見ます)。 同じブログは、Borg から受け継いだ 4 つの機能として、Pod (Borg では alloc)、Service (名前付けと負荷分散)、Label、Pod ごとの IP を挙げています。 この設計は 2026 年でも変わっていません。
2015 年 7 月 21 日、Google は Kubernetes 1.0 のリリースを発表し、同じ発表の中で「Linux Foundation と業界のパートナーと共に Cloud Native Computing Foundation (CNCF) を設立する」と述べています。 Kubernetes は CNCF の最初のプロジェクトとして移管されました。 以降の開発は、SIG と呼ばれる分野ごとのグループで、複数の会社のメンバーが行っています (7 章「Kubernetes の 3 つの顔」で扱います)。 Google が公開したことから Google の製品だと思われることがありますが、1.0 以降の持ち主は CNCF で、Google はコントリビューターを多く出している会社の 1 つです。 CNCF は 2018 年 3 月に Kubernetes を最初の「graduated」プロジェクトと認定しています。
Docker と Kubernetes の距離
Kubernetes は最初 Docker で動くことを前提に作られましたが、その後、Docker 以外のコンテナランタイムも使えるように作り替えられました。 2016 年 7 月の 1.3 で CoreOS の rkt が使えるようになり、同年 12 月の 1.5 で kubelet とランタイムの間のインターフェース (CRI) が alpha として入っています。 2020 年には「Kubernetes が Docker を非推奨にした」と騒がれた出来事もあります。 この経緯は、Kubernetes がノードの上でコンテナをどう起動しているかを知ってからのほうが追いやすいので、5 章の終わりで扱います。
読み方の注意
年表は「何がいつ出たか」を並べますが、「いつ主流になったか」は別です。 Docker 以外のランタイムを選べる仕組みは 2016 年に出ましたが、kubelet が Docker 経由で動く道が閉じたのは 2022 年の 1.24 です。 クラスタの外からの通信を受ける新しい API の Gateway API は 2023 年 10 月に v1.0 (GA) になりましたが、従来の Ingress を使い続けているクラスタは 2026 年現在も多くあります。 kube-proxy の nftables モードも 2025 年 4 月の 1.33 で GA になりましたが、互換性のため既定は iptables のままです。 公開や安定版の登場と、現場での普及は分けて読んでください。 移行にかかる時間は、互換性や運用方針によって変わります。
ふりかえり
QDocker が 2013 年に足したものとして正しいのは?
カーネルの機能は 2008 年までに揃っていました。Docker は「作って、配って、動かす」を 1 本にしました。分離は VM より弱く、1 章で見た通りカーネルを共有します。
QKubernetes の開発を主導しているのは?
2015 年の 1.0 と同時に CNCF に移管され、以降は複数の会社のメンバーが SIG ごとに開発しています。
QKubernetes 1.0 のリリースと同じ日に起きたことは?
2015 年 7 月 21 日の 1.0 と同時に CNCF の設立が発表され、Kubernetes はその最初のプロジェクトになりました。containerd の寄贈は 2017 年 3 月です。
参考
- Kubernetes ドキュメント「Overview」(Going back in time): https://kubernetes.io/docs/concepts/overview/
- TUHS「Version 7 Unix manual: chdir(2) / chroot」: https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/man/man2/chdir.2
- FreeBSD「4.0-RELEASE Release Notes」(jail): https://www.freebsd.org/releases/4.0R/notes/
- USENIX LISA ’04「Solaris Zones: Operating System Support for Consolidating Commercial Workloads」: https://www.usenix.org/legacy/events/lisa04/tech/price.html
- Linux man-pages「mount_namespaces(7)」(HISTORY: Linux 2.4.19): https://man7.org/linux/man-pages/man7/mount_namespaces.7.html
- LWN「Process containers」(2007-05-29): https://lwn.net/Articles/236038/
- LWN「Notes from a container」(cgroups への改名、2007-10-29): https://lwn.net/Articles/256389/
- kernelnewbies「Linux 2.6.24」(cgroups、PID / network namespace): https://kernelnewbies.org/Linux_2_6_24
- LWN「LXC and the container runtime landscape」(LXC の 2008 年リリースと初期 Docker): https://lwn.net/Articles/907613/
- Docker blog「It’s Here: Docker 1.0」(2014-06-09、最初のバージョンは 2013-03-20): https://web.archive.org/web/20140615000000/http://blog.docker.com/2014/06/its-here-docker-1-0/
- Docker blog「Docker 0.9: introducing execution drivers and libcontainer」(2014-03-10): https://www.docker.com/blog/docker-0-9-introducing-execution-drivers-and-libcontainer/
- Open Container Initiative「About the OCI」(2015-06-22 設立、runc の寄贈): https://www.opencontainers.org/about/overview/
- kernelnewbies「Linux 3.18」(OverlayFS): https://kernelnewbies.org/Linux_3.18
- Google Cloud blog「An update on container support on Google Cloud Platform」(2014-06-10、Kubernetes 公開): https://cloudplatform.googleblog.com/2014/06/an-update-on-container-support-on-google-cloud-platform.html
- Google Cloud blog「Kubernetes V1 Released - Cloud Native Computing Foundation to Drive Container Innovation」(2015-07-21): https://cloudplatform.googleblog.com/2015/07/Kubernetes-V1-Released.html
- Kubernetes blog「Borg: The Predecessor to Kubernetes」(2015-04-23): https://kubernetes.io/blog/2015/04/borg-predecessor-to-kubernetes/
- Google Research「Large-scale cluster management at Google with Borg」(EuroSys 2015): https://research.google/pubs/large-scale-cluster-management-at-google-with-borg/
- CNCF「Kubernetes as first graduated project」(2018-03-06): https://www.cncf.io/announcements/2018/03/06/cloud-native-computing-foundation-announces-kubernetes-first-graduated-project/
- Kubernetes blog「rktnetes brings rkt container engine to Kubernetes」(2016-07-11): https://kubernetes.io/blog/2016/07/rktnetes-brings-rkt-container-engine-to-kubernetes/
- Kubernetes blog「Kubernetes 1.5: Supporting Production Workloads」(2016-12-13、CRI alpha): https://kubernetes.io/blog/2016/12/kubernetes-1-5-supporting-production-workloads/
- Docker blog「Docker to donate containerd to the Cloud Native Computing Foundation」(2017-03-15): https://web.archive.org/web/20170320000000/https://blog.docker.com/2017/03/docker-donates-containerd-to-cncf/
- Docker blog「Introducing Moby Project」(2017-04-18): https://www.docker.com/blog/introducing-the-moby-project/
- Google Cloud blog「Google Container Engine is Generally Available」(2015-08-26): https://cloudplatform.googleblog.com/2015/08/Google-Container-Engine-is-Generally-Available.html
- AWS blog「Amazon EKS – Now Generally Available」(2018-06-05): https://aws.amazon.com/blogs/aws/amazon-eks-now-generally-available/
- Microsoft Azure blog「Azure Kubernetes Service (AKS) GA」(2018-06-13): https://azure.microsoft.com/en-us/blog/azure-kubernetes-service-aks-ga-new-regions-new-features-new-productivity/
- CNCF「CNCF Archives the rkt Project」(2019-08-16): https://www.cncf.io/blog/2019/08/16/cncf-archives-the-rkt-project/
- Kubernetes blog「Kubernetes 1.20: The Raddest Release」(2020-12-08、dockershim 非推奨): https://kubernetes.io/blog/2020/12/08/kubernetes-1-20-release-announcement/
- Kubernetes blog「Kubernetes 1.24: Stargazer」(2022-05-03、dockershim 削除): https://kubernetes.io/blog/2022/05/03/kubernetes-1-24-release-announcement/
- Kubernetes blog「Gateway API v1.0: GA Release」(2023-10-31): https://kubernetes.io/blog/2023/10/31/gateway-api-ga/
- Kubernetes blog「Kubernetes v1.33: Octarine」(2025-04-23、nftables GA): https://kubernetes.io/blog/2025/04/23/kubernetes-v1-33-release/
- Google Developers blog「Google Compute Engine is now Generally Available」(2013-12-02): https://developers.googleblog.com/en/google-compute-engine-is-now-generally-available-with-expanded-os-support-transparent-maintenance-and-lower-prices/
- AWS blog「AWS Elastic Beanstalk for Docker」(2014-04-23): https://aws.amazon.com/blogs/aws/aws-elastic-beanstalk-for-docker/
- Microsoft「Docker and Microsoft partnership」(2014-10-15): https://news.microsoft.com/2014/10/15/dockerpr/
- AWS blog「EC2 Container Service (ECS) preview」(2014-11-13): https://aws.amazon.com/blogs/aws/cloud-container-management/
- Kubernetes enhancements「KEP-2067: Rename the kubeadm master label and taint」: https://github.com/kubernetes/enhancements/blob/master/keps/sig-cluster-lifecycle/kubeadm/2067-rename-master-label-taint/README.md
- kubernetes/kubernetes PR #2788「Rename Minions -> Nodes internally」(2014-12): https://github.com/kubernetes/kubernetes/pull/2788