inductor's blog

nothing but self note :)

Docker社がエンタープライズ事業を譲渡した今、Dockerの父が思うこと

はじめに

Dockerの開発元であるDocker社が、Docker EE(Enterprise Edition)に関するビジネスをMirantis社に売却しました。

Mirantis社はかつてはOpenStackをメインにビジネスを展開していましたが、ここ数年はマルチプラットフォームKubernetesとしてMirantis KaaSを展開しています。

TL; DR

  • Docker社は今後、Dockerのエコシステムを開発者体験、プラットフォームとしての親和性の向上に努めていく
  • Moby projectをDockerの名前に戻そうという提案が出ている
    • Dockerの父が、DockerとMobyの明確な違いについて語ってくれた

Dockerのはじまり

Dockerは、かつてdotCloud社が同じ名前でPaaSを提供していたときの「基盤」をOSSとして公開したものがはじまりです。 公開当時はLXCというLinux Container技術をベースに、コンテナのビルド、実行、イメージの共有などをUser friendlyなCLIでできるようにラッパーとして動作していました。

このへんの詳しい経緯は下記のスライドにも詳しく載っています。

speakerdeck.com

現在はLXCに依存しておらず、libcontainerを基としたマイクロサービスのコンテナランタイムが動作しています。

Moby Projectについて

Moby Projectは、雑に言えばDockerに関わるOSSたちの集合です。

Moby ProjectはGitHubのOrganizationとして存在していて、Dockerというプラットフォームを形作るマイクロサービスたちが以下のように分割されて管理されています

  • moby
  • buildkit
  • vpnkit
  • hyperkit

この中でもmoby/mobyはDockerの根幹そのものであり、実態はDockerのロゴやライセンスなどのプロプライエタリなものを削ぎ落としたソフトウェアです。

macOS/Windowsで動くDocker DesktopやOSS版Dockerなども含め、Dockerのプロプライエタリな要素を含みます。

mobyLinuxコンテナという優れたエコシステムをより簡単に提供するためにOSS化され、その代表であるDockerは、Stackoverflowでも好きなソフトウェアランキングで上位に入る程度の人気を誇っています。

2016年頃、マイクロサービス化の過程でDockerをmobyプロジェクトにしたと理解しています(違っていたら教えてほしい)

mobyからDockerに戻す

Docker EEを売った今、Docker社に残るのはコミュニティです。moby projectは発表時こそ名前が変わることで話題になりましたが、実際のところmoby自体がプラットフォームとして覇権を得ることはなく、KubernetesとCNCFに負ける結果となりました。

Dockerが提供したのは、コンテナが動いてビルド出来る環境であって、これはContainerdやBuildKitなどの他のプロジェクトで置き換えられるものです。そのため、インフラ基盤としてのDockerにもはや大きな意味はなくなってしまったのです。

ここで残るのはDockerという大きなエコシステムですが、これには2つの顔があります。1つはインフラ基盤としてのDocker、もう1つは開発者が使うアプリケーション開発ツールとしてのDockerです。

それについて、Dockerの父とも言えるSolomon Hykesはこう語っています。該当のIssueはこちら

The goal of the Moby/Docker split was pretty simple: separate the infrastructure code from the dev tools, so we can separate the "Docker is infrastructure" people from the "Docker is a dev tool" people.

This separation of people into separate communities was very important, because those people did NOT get along! Infrastructure people and devtool people have different goals and priorities, and it was not sustainable for one project to try and make both groups happy. It created too much conflict, too many misunderstandings, and ultimately it burned people out (myself included). A lot of the "Docker is not really open, mean Docker people didn't merge my PR" drama actually stems from this fundamental misunderstanding between infrastructure and devtools people.

The Moby/Docker split aimed to resolve this conflict by saying "Docker is a dev tool; Moby is infrastructure. If you're interested in dev tools, look at Docker. If you're interested in infrastructure, look at Moby". Unsurprisingly, this created confusion and sometimes anger for infrastructure people, because it forced them to change their definition of Docker. On the other hand, people who already thought of Docker as a dev tool were not confused, because they were not required to change their definition.

Ultimately the separation of communities did take place, and it did help increase productivity and decrease drama. But in retrospect, the biggest factor was not the Moby split, but the containerd split. With CRI allowing for Kubernetes users to choose their favorite runtime instead of being stuck with dockerd, a lot of the angry Kubernetes people went away, either to the containerd repo, or to cri-o, or whatever else people run pods on these days.

I don't know whether reverting the Moby split is a good idea (my instinct tells me it's not worth the trouble, but I don't know). However, please, please maintain a clear separation between infrastructure and devtools. And do not make Docker an infrastructure project! It is not, and never should have been. Unless you've been a full-time maintainer on Docker pre-split, you have no idea how painful it is to mix devtools development and infrastructure development in the same open-source project, at large scale. I would not wish it on my worst enemy.

つまりこうです

Moby/Dockerの分割の目標は非常に単純でした。インフラストラクチャ部分のコードを開発ツールから分離するため、「Docker(Moby)はインフラストラクチャ基盤だ」と呼ぶ人々と「Dockerは開発ツールだ」と呼ぶ人々を分離できます。

このように人々を別々のコミュニティに分離することは非常に重要でした。インフラストラクチャの人々と開発ツールの人々は異なる目標と優先順位を持ち、1つのプロジェクトが両方のグループを幸せにしようとすることは持続可能ではありませんでした。あまりにも多くの対立や誤解を生み出し、最終的に人々を怒らせました(私自身も含めて)。 「Dockerは実際にはオープンではなく、Dockerメンテナーが私のPRをマージしなかった」というドラマの多くは、インフラストラクチャと開発ツールの人々の間のこの根本的な誤解に由来しています。

Moby/Dockerの分割を行うことによって「Dockerは開発ツールで、Mobyはインフラストラクチャです。開発ツールに興味がある場合は、Dockerを使ってください。インフラストラクチャに興味がある場合は、Mobyを使ってください。」と宣言できます。当然のことながら、これによりインフラストラクチャの人々が混乱し、時には怒りを引き起こしました。これは、Dockerの定義を変更せざるを得なかったためです。一方で、既にDockerを開発ツールと考えていた人たちは、定義を変更する必要がないため混乱していませんでした。

最終的に、コミュニティの分離が行われ、生産性の向上と争いの減少に繋がりました。しかし、振り返ってみると、最大の要因はMobyの分離ではなく、コンテナの分離でした。 Kubernetesユーザーがdockerdにとらわれずにお気に入りのランタイムを選択できるようにするCRIにより、多くのmoby分離に怒ったKubernetesユーザーの人々は、containerd、cri-o、または他の人々がPodを実行している他のランタイムに移りました。

Mobyの分割を元に戻すことが良いアイデアかどうかはわかりません(私の直感では、トラブルに見合う価値はないが、わかりません)。ただし、インフラストラクチャと開発ツールを明確に区別してください。 Dockerをインフラストラクチャのプロジェクトにしないでください!実際そうではなく、また、そうあるべきではありませんでした。 Docker初期からコミットしているのフルタイムのメンテナーでない限り、同じオープンソースプロジェクトで大規模に開発ツールの開発とインフラストラクチャの開発を混在させることがどれほど苦痛なのかわからないでしょう。私も、そうした行為を最悪の敵として迎えたくはありません。