世界を動かす技術を、日本語で。

コンテナはなぜ誕生したのか?

概要

  • DevOpsDays London での講演内容の要約
  • コンテナ技術 誕生の背景と仮想マシン(VM)との比較
  • DockerKubernetes の進化と現状
  • DevOps文化 の変遷と課題
  • 今後の 技術選択 やAIの影響についての考察

2025年秋のアップデート:DevOpsDays London講演要約

  • DevOpsDays London で講演実施、参加者と運営への感謝
  • 講演動画:https://www.youtube.com/watch?v=eMU2mZgo99c
  • 実際の発表内容と異なるが、以下は講演のラフアウトライン

コンテナ技術が生まれた理由

  • BroadcomによるVMware買収 に際し、FTCから「コンテナはVMの競合か?」と質問
  • VM はサーバー台数増加時代の産物、手動管理・低利用率(15%未満)が課題
  • Linux 環境では複数アプリ同居がやや容易、だが依然として非効率
  • コンテナ は「アプリケーション数の爆発」に対処するため登場
    • DotcloudがPaaS運営でDockerを開発、重要なのは「パッケージング」
  • 企業ではクラウド移行の一環としてコンテナを採用、VMの「リフト&シフト」非効率回避
    • MicrosoftはVM移行を提案、だがコンテナ+クラウドでモダナイズ推進
    • WindowsからLinuxへの移行も促進

Dockerの変革とイノベーション

  • Docker Hub による「共有可能なイメージレジストリ」が最大の革新
    • VMイメージは大きく、再利用性が低い
    • Cloud Initなどで若干改善も、コンテナイメージには及ばず
  • Dockerは「イミュータブル(不変)デプロイ」を強制
    • アプリ単位での再構築・再デプロイが容易、セキュリティ面の利点も
  • Docker登場で Go言語 が市民権獲得、現代の主要言語がTLS標準搭載

Kubernetesとオーケストレーションの進化

  • 初期のKubernetesは「スケジューリング」が主題、実際は「デプロイ自動化」が本質
    • Docker Swarmはデプロイスクリプト非対応、KubernetesでGitOpsなどの手法普及
  • データベース運用に関する議論
    • コンテナの「削除の容易さ」ゆえ、DB運用はクラウド依存傾向強化
    • ストレージ選択肢(NFS、ブロックストレージ等)の多様化

DevOps文化の変遷と課題

  • Kubernetesの複雑化が DevOps文化 を変質させた
    • かつては「開発と運用の融合」、今はKubernetes運用担当の「裏方」的役割へ
    • 技術志向が文化志向を凌駕
  • Dockerはローカル開発環境の標準化には至らず
    • PythonやRubyの仮想環境、Nixによる再現性確保が主流
    • Dockerは主にDBやサービスのテスト用途
  • OSSコンポーネントによるアプリ構築が主流化
    • 言語ごとのパッケージ管理が標準、ユニバーサルなビルド抽象化は不在
    • イミュータブル性の有用性は限定的、依存関係の複雑さが課題

現在の状況

  • 仮想化導入の動機は「リソース利用率15%」の改善
  • 2024年Datadogレポートによると「コンテナコストの83%はアイドルリソース」
    • 浪費の可視化は進んだが、規模の大きな自動化による浪費も増加
  • モバイルアプリ用途が中心、Armサーバーの普及
    • 効率的な運用の一方、長い非効率の「ロングテール」も継続
  • AIの登場で、高コストなアプリは急速に効率化
    • 推論コストの劇的低下

今後の展望

  • 2015年の「Choose Boring Technology」論文
    • 当時はDockerやKubernetesは「退屈でない」技術
    • 現在は「Dockerはほぼ退屈」「Kubernetesも退屈化進行中」(ChatGPT談)
  • 「退屈な技術を選ぶ」文化が定着、AIが変革予算を吸収
    • クラウドネイティブ・スタートアップ時代の終焉
    • LLMは「退屈な技術」に強み、さらなる変革には追加予算が必要

参考リンク

  • 講演動画:https://www.youtube.com/watch?v=eMU2mZgo99c

Hackerたちの意見

コンテナ(つまりDocker)は、CGroupsやネームスペースが難解で、ほとんどの人が直感的に理解できる「サンドボックス」を作るために多くの専門知識を必要としたからこそ生まれたんだよね。CGroupsとネームスペースは、セキュリティを追加するためにLinuxに導入されたけど、元々UNIXはセキュリティに対して根本的に弱い設計(共有グローバルネームスペースやユーザーなど)をしてるから、あんまりうまくいってない。最終的にはSEL4みたいなのがクラウドサーバーのワークロードのためにLinuxに取って代わってくれるといいな。ほとんどのアプリケーションはLinuxカーネルの機能をほとんど使ってないし、ネットワークスタックに初期引数として機能を渡して、他にはアクセスできないようにした非常に安全で高性能なウェブサーバーが作れるはずなんだ。仮想デバイスのドライバーはシンプルで、クラウドVMのためにLinuxの膨大なドライバーサポートは必要ない。SEL4用の仮想イーサネットデバイスドライバー、SEL4上で動くネットワークスタック、ネットワークデバイスのための機能を持ったネットワークスタックを読み込むシンプルなinitプロセスが必要なだけ。これをバイナリをコンパイルするみたいに簡単にイメージを作れるようにすれば、ほとんどのサーバーアプリケーションのデプロイから数千万行の複雑さを排除できるかも。LinuxもDockerもなしで。SEL4は実際にうまく設計されてるから、SEL4上でサブカーネルをプロセスとして比較的簡単に実行できるんだ。ほら、これでK8sもいらなくなるね。

コンテナをサンドボックスを作るための手段として見るなら納得できるけど、ホストシステムの依存関係を変えずに任意のアプリケーションを簡単に立ち上げる方法として考えると、あんまり意味がないよね。

それがコンテナの始まりの理由なの?依存関係地獄が原因で流行ったような気がするけど、簡単に仮想化できる時代じゃなかったからね。同じサーバー上で必要なソフトウェアのバージョンを全部動かすのは、調整するのが大変だったよ。

コンテナやネームスペースはセキュリティのためのものじゃないんだ。OSレベルでシングルトンオブジェクトを持たないためのもの。もし「仮想化」という言葉がそんなに使われてなければ、そう呼んでたかも。みんなが見落としてる大きな違いがあるんだ。バイパス可能なセキュリティメカニズムは、役に立たないどころか悪い。バイパス可能な仮想化メカニズムは役に立つ。悪意のあるプログラムが本当のルートでないことを検出できても、このプログラム専用の別のルートファイルシステムを持つのは便利なんだ。SEL4について言えば、難しい問題を上位層に任せるからこそ、すごくエレガントなんだよね(偶然にもそれらをもっと難しくしてるけど)。

SEL4は実際にうまく設計されてるから、SEL4上でサブカーネルをプロセスとして比較的簡単に実行できるんだ。ほら、これでK8sもいらなくなるね。K8sは、機械のクラスターをあたかも単一のリソースのように管理するためのものだから、その前の「ボーグ」という名前も納得だよね。私の知る限り、これはSEL4が扱うユースケースじゃないよね?

「カーネルに依存しない」Nvidiaドライバがあれば最高だよね。ベアメタル開発の経験があるけど、OSが提供するもののほとんどは、特定のハードウェアを動かすためのライブラリのセットとして、もっと良い形で提供できるように思うんだよね。それに、すごく良い「ビルド」システムも必要だし。

cgroupsは、確かIBMから出てきたリソース管理フレームワークから来たんだよね。しばらくの間、いくつかのディストリビューションのカーネルに入ったけど、上流には行かなかった。ネームスペースはセキュリティを追加するための試みじゃなくて、バインドマウントのようにインターフェースをもっと柔軟にするための作業から生まれたものなんだ。Unixのセキュリティは基本的に良いもので、ネームスペースがないことはあまり問題じゃないけど、今はあるからね。実際、うまくいってると思う。すべてのアプリは多くのカーネル機能を使っていて、非常に安全で高性能なウェブやその他のサーバーもある。L4システムはLinuxと同じくらいの歴史があって、特にSEL4は20年も続いてる。でも、あまり進展はないから、今のところあまりうまくいってるとは言えないかな。SEL4は重要なことをいくつか成し遂げた素晴らしいプロジェクトだけど、Unixの代替としてクーデターを起こす準備ができてるようには見えないね。

「セキュリティに対する根本的に悪いアプローチを持っている。UnixはVPSプロバイダーのために便利に設計されたわけじゃなく、1台のコンピュータが1つの会社のフロア全体にサービスを提供できるように設計された。セキュリティのアプローチは展開戦略に適している。すべてのOSと同様に、インターネットが現れて、すぐにすべてを台無しにした。」

「Cgroupsとネームスペースは、セキュリティを追加するためにLinuxに追加された。UNIXは根本的にセキュリティに対する悪いアプローチ(共有グローバルネームスペース、ユーザーなど)を持っている。すべてのリソースのネームスペース化(共有グローバルネームスペースへの制限なし)は、実際にはplan9から直接取られたものだ。これによりセキュリティが向上するが、それだけじゃなく、分散コンピューティングのための原則的な基盤も整える。コンテナ化がk8sのような低レベルの層を可能にする様子にこれが見られる - もちろん、実際には最もよく知られている高レベルの適応型展開と管理を考慮に入れずに。」

「SEL4みたいなのが、最終的にはクラウドサーバーのワークロードのためにLinuxの代わりになることを願ってる。9frontやディスクレスLinuxのマイクロVM、Firecracker/Kata-containersスタイルでもいいんじゃない?K8sよりも小さいOSで、ファイルシステムとプロセスの隔離が一緒になってるやつ。シンプルでUnixっぽく。既存のバイナリはそのまま使って、プレーンテキストの設定やリポジトリ、イメージもそのまま。スタックの一番下のレイヤーだけを入れ替えて、便利な時にホストOSに移行すればいい。」

聞いた話では、コンテナは仮想マシンに比べてメモリを少なく使えて、カーネルやCPUをより良く共有できるから、同じサーバーでより多くのアプリケーションを動かせるんだって。これが直接的なコスト削減につながるから、大規模なサーバーファームを持つ大企業は、技術を開発して移行するためにエンジニアにお金を払う価値があるんだよね。セキュリティに関しては、SEL4やコンテナ、VMよりも、各アプリケーションに別々の物理サーバーを用意して、CPUやメモリを全く共有しない方が安全だと思う。そうすれば、物理的にアプリケーション間にセキュリティの境界ができるからね。もちろん、ほとんどのビジネスケースにはそれが高すぎるから、みんな使わないんだよね。SEL4を使うのも同じ問題にぶつかると思う。コンテナに比べてサーバーの利用効率が悪くなるから、ビジネスケースには高くついて魅力的じゃない。コンテナに代わるものを求めるなら、それはもっと安くて安全でなきゃいけないけど、何になるかは分からないな。

私の妄想では、Dockerが存在するのは、Pythonのパッケージ管理と依存関係管理がひどすぎて、dotCloudがLinuxコンテナの上に何かを作らざるを得なかったからだと思ってる。Pythonアプリをデプロイするための快適な体験を提供するためにね。

ほぼその通りだね。Javaみたいに一貫した孤立した依存関係管理を持つシステムは、OSレベルのコンテナソリューションを必要としなかった。アプリケーションサーバーを通じてユーザースペースのコンテナ管理はあったけどね。

その通りなんだけど、Pythonだけじゃないんだよね。ほとんどのLinuxアプリは、ファイルシステムに散らばっていて、絶対パスへのハードコーディングされた参照があって、依存関係も自分で用意しないといけない。要するに、Linuxの世界はアプリを配布しにくくするように設計されてるんだよね。

確かに、彼らは自分たちのアプリにDockerを使ってたけど、dotCloud自体もPaaSだったから、Herokuやそれに似たサービスと競争しようとしてたんだよね。ビルドパックがあったからね。問題は、ビルドパックがあまり柔軟じゃなくて、自分の言語やランタイム、スタックに合ったビルドパックがないと機能しないことだったんだ。

基本的にはその通りだね。でも、もっと一般的な問題は、エンジニアたちがアプリとその依存関係を簡単に配布・実行できるパッケージにまとめる能力を失っちゃったことだと思う。Javaが.jarファイルを主流にした頃(要は、マニフェスト付きで全部をzipするだけ)、他の世界は静的リンクのやり方を完全に忘れちゃったし、今はみんなが高度にスケジュールされたマルチスレッドOSを使ってる。長い間の「解決策」は、単一アプリの仮想マシンを立ち上げることだったけど、それは重い解決策で、アプリに使える全体のシステムリソースを減らしちゃって、すごく非効率な解決法になってた。現代のクラウドはこの段階で生まれたから、今のクラウドシステムの基本的な原則の一つがVMなんだよね。コンテナは依存関係の配布問題とリソースの割り当て問題を同時に「解決」したんだ。

PyinstallerはDockerより前に登場したんだ。特定の言語がパッケージングできないってわけじゃなくて、どんな言語やアーキテクチャでもアプリケーションを実行するための統一されたインターフェースが必要なんだ。だからK8sみたいなプラットフォームはPythonや他の言語について何も知らなくても、自動的に将来の言語もサポートできるんだよ。

著者はDockerが開発に役立たないと言って、開発者はデータベースを立ち上げるだけだと言ってるけど、それには反対だし、私だけじゃないと思う。私のプロジェクト(主にウェブアプリ)は、複数のコンテナ(php/python/nodeランタイム、nginxサーバー、データベース、スケジューラーなど)を設定するdocker composeを使っていて、私のマシン上で開発環境として動かしてる。ソースコードはボリュームとしてマウントされてる。この同じcomposeファイルは、プロダクションサーバーへのデプロイにも使われる(例えばデバッグ設定を削除する小さな変更を加えて)。このアプローチは、クライアントのためにウェブアプリを作るソロ開発者として私にはうまくいってるし、使うスタックの柔軟性も極めて高い。開発環境を簡単に素早く切り替えられるからね。

君の言ってることには100%同意だけど、君が言ってるのはDockerがデプロイメントのワークフローを変えたってことかもしれないね、開発のワークフローじゃなくて(ただ、devcontainersのおかげでその境界は曖昧だけど)。Justinは数ヶ月前にDockerを辞めたばかりで、彼のCTOとしての長い経歴がこの記事の意見の大半に影響を与えているのは明らかだと思う。デプロイメントに関する視点や他の意見は、彼が大企業の顧客と交わした会話を反映しているように思える。個人開発者が頻繁に開発環境を切り替えるワークフローとは違うんじゃないかな。

コンテナが生まれたのは、もう誰もアプリ全体を単一の実行可能ファイルにビルドするのが面倒になったからだよね。ツールもほとんど存在しないし。でも、依存関係の管理やリンクの問題を解決する代わりに、今のエンジニアたちは問題空間に抽象化の山を作り上げて、やりたいこと(つまりアプリを実行すること)が一回の呼び出しでできるようにしちゃってる。もちろん、今度はその抽象的なタワーを構築・維持しないといけないから、みんなにもっと仕事が増えるってわけ!

これがHWが安すぎると起こることだね。

だからDockerとレイヤーが存在するんだ。コンテナはそれらよりも10年以上前からあったんだよ。

「今日のエンジニア」と言ってるけど、「2001年のエンジニア」のこと?sbuild[0]、コンテナ内でdebパッケージをビルドするためのツールが作られたのはその頃だよ。毎回クリーンなコンテナから始まるっていう点でかなり革新的だったし、ユーザーのマシンに変な依存関係がインストールされていても、信頼性のある方法でdebをビルドできたんだ。(当時はschrootコンテナで、dockerはまだ存在していなかったことに注意)[0] https://metadata.ftp-master.debian.org/changelogs//main/s/sb...

僕の見解としては、コンテナは開発者にアプリのさまざまな側面を標準化された、意見のある方法で宣言させることを強制したと思う。- 永続的な状態?ボリュームを宣言しなきゃ。- 外部サービスとのIO?ポート(と場合によってはアドレス)を宣言しなきゃ。- 設定可能なパラメータ?環境変数を宣言しなきゃ。- 推移的依存関係?それを宣言しなきゃだけど、自分の好きなメカニズム(例えば、ベースイメージのディストリビューションのパッケージマネージャーを使って)で。状態の分離(永続性のように)とアプリケーション(バイナリやアセットのように)の分離が、アップデートを簡単にしてくれる。バックアップもね。ほとんどのIOが可視化されて明示的になることで、運用や統合が簡単になる。さらに、単一の(あまりにも?)シンプルな設定メカニズムが再利用性を高めて、例えば一般的なアプリサービスコンテナ(マリアDBなど)の軽量なカスタマイズを可能にする。この一連の強制された、でも漏れのある抽象化が、膨大な再利用と構成可能性を促進するのにちょうど良いんだと思う。だからOCIコンテナが他の仮想化技術やアプリケーションコンテナ技術と比べて大きくなった理由だと思う。

そう、それが理由だよ。コンテナは、他の方法ではできないOS環境の多くをパッケージ化する手段なんだ。

そうだね。「じゃあ、どうやってこれをデプロイして、運用して、維持するの?」っていうのが、ベンダーとの数週間の会議だったのを覚えてる。ひどい「人間が読める」ドキュメントについて話し合ったり(あればだけど)。そういう会議は今でも時々あるけど、「クラウド」*aaSやコンテナのおかげで、そういうのはかなり減ったよね。

「人々がDockerでやることは、データベースや他のサービスを立ち上げて開発やテストを行うことだ。そうだね。docker run --rm --publish=127.0.0.1:27017:27017 'mongo:3.6.8'とかdocker run --rm --publish=127.0.0.1:27017:27017 'mongo:5.0'を実行して、Ctrl-Cで簡単に消せるのは神の恵みだ。」

プログラミングの授業を受けるためにデスクトップコンピュータにOracleをインストールしたのを覚えてる… インストールがクラッシュしたら(結構よくあることだった)、コンピュータを完全にフォーマットしてやり直す方が簡単だった。データベースが壊れた?多分、全部フォーマットして最初からインストールする方が楽だね。

記事は、コンテナがソフトウェア配布の問題を解決するために現れ、その後、仮想化、隔離、生産サービスの管理に再利用されたと仮定しているようだけど、この見方は真実からかなり遠いと思う。仮想化/隔離の側面が先にあったんだ。SWSoftのVirtuozzoは2000年代初頭にそれをかなりうまくやっていた。彼らはIO隔離も持っていて、他の場所でサポートされるまでに約10年かかったと思う。そして徐々にVirtuozzo/OpenVZの要素がcgroups/LXCの形でメインラインに到達し、Dockerが2つの欠けていた部分、つまり高速なイメージ再構築と使いやすいユーザー体験を追加するまで、全体がゆっくりと進展していった。もちろんDockerは革命だったけど、その頃にはすでに十分に進んだ企業が隔離のためにコンテナを10年以上使っていたんだ。

BSD Jailのおかげで「なんでこれがLinuxにはないんだろう?」って感じが生まれたと思う。

私の知る限り、最初に登場したのはHerbert Pötzlらによるlinux-vserver.orgの「ctx」カーネルパッチプロジェクトだった。 https://web.archive.org/web/20250307173707/http://linux-vser... (残念ながら、ドメインは最近期限切れになったみたい)当時はそれをたくさん使ってたよ、カーネルネームスペースが上流に行く前や、dockerが登場する前にね。

コンテナの話を聞くずっと前から、Intelが「0コスト」のハードウェアレベルの仮想化をサポートしているって話を聞いてたのを覚えてる。確か、主に仮想マシン(VMWareのやつ)を速くするためだったと思う。サーバー分野でのIntelの大きな市場差別化要因だったんだ。VirtualBoxでいくつかの機能をオンにする必要があったのをぼんやり覚えてる。それを使うと、サポートしているCPUならパフォーマンスが大幅に向上したんだ。

お金の問題だね。コンテナはFreeBSDやSolarisで10年以上前からあった。高価なUnixサーバーを分けるのに役立ったんだ。VMも1960年代後半のメインフレームや1980年代後半の高価なUnix RISCサーバーで使われてた。Linuxは安かったから必要なかったんだよね。だからLinuxはその古い高価なものを安いCOTSハードウェア、つまりx86に置き換えた。すべてがコモディティ化されてコスト削減が進むと、突然効率が重要になって、VMwareが繁盛して、真似されて、VMがどこにでも現れた。でも、VMのリソース共有の低使用率と非効率性が目立ってきて、高価に見えるようになったから、コンテナの安くて簡単な技術に取って代わられ始めた。「自分のマシンで動くから、これを出荷しよう」って感じで。

もっと前の1999年に、FreeBSDやSolarisがコンテナを手に入れる前に、HP-UX Vaultのコンセプトに出会ったんだ。残念ながら、HPeはHP-UXのドキュメントのほとんどをインターネットから削除しちゃったから、指摘するのが難しい。でも、HP-UX 10.24リリースのデジタルトレースはまだ残ってる。>「これはHP-UXのバーチャルボールトリリースで、強化されたセキュリティ機能を提供します。バーチャルボールトは、各ファイルにコンパートメントが割り当てられ、プロセスは適切なコンパートメント内のファイルにしかアクセスできないコンパートメント化されたオペレーティングシステムです。他のほとんどのUNIXシステムとは異なり、スーパーユーザー(またはroot)は正しい手続きを踏まない限り、システムに完全にアクセスできません。」 https://en.wikipedia.org/wiki/HP-UX フォーラムのディスカッションもあるよ。 https://community.hpe.com/t5/operating-system-hp-ux/hp-virtu... 今、HP-UX VaultのPDFが戻ってきたら最高だね。

cgroups、lxc、chroots、自己解凍実行ファイルを使ってた。dockerが登場する前に、UNICEFのノートパソコンやキャンプ用に頑丈でポータブルなアプリケーションを作ってたんだ。この「仮想化」、「セキュリティ」、ハードウェアの最大活用、コスト削減についての話は、確かに真実だけど、技術やセキュリティの責任者向けの「エンタープライズピッチ」だと思う。いい副作用だけど、正直どうでもいい。ソロ開発者がソロアプリをソロサーバーで運営するための本当の、根本的な利点があるんだ。なぜか?私のアプリケーションは、ファイルを読み書きするために2、3のフォルダや、2、3の実行可能ファイル(jvm、node、convert、OSSのCLIツールの数々、コンパイル時ライブラリじゃなくて)を必要とするから。apt-get installや他の依存関係をダウンロードすることもある。今、私のようなインディー開発者は、シェルスクリプトから「mkdir」していくつかのファイルを作れる。でも、その「mkdir」は最初は成功するけど、2回目は「ディレクトリはすでに存在します」って失敗する。いくつかのものを「apt-get install」できるけど、アップグレードやバージョニングは全く別の話だ。少なくとも、いくつかのベアボーンなansibleや状態管理が必要だって気づくのは時間の問題だ。dockerの前にシェルスクリプトで「小さめの」ansibleを何度も再発明したことがあるよ。今、エンタープライズにいるなら、アプリの全状態をsysadminチームに伝えなきゃいけない。セキュリティや仮想化のことは忘れて。状態のすべての部分、JavaやTomcatのバージョン、ディレクトリなどを説明する必要がある。それらはすべて動的なターゲットだから。コンテナは状態管理を大幅に減らしてくれる。私はいつでも「mkdir」できる。いつでも「apt-get install」できる。これは一時的なイメージだから、半分壊れたシェルスクリプトを書く必要もないし、ansibleを使う必要もないし、ミニシェルansibleを作る必要もない。Dockerfileとdocker-composeを使えば、状態管理の95%は解決できる。残りの5%は、正しいソースをdocker-composeするだけ。エンタープライズ的な部分はスキップして。普通のフィールドエンジニアや、私のようなソロ開発者が、フィールドでサービスを展開する時、ラズベリーパイでも、コンテナを使うだろう。結局のところ、一言で言うと「状態管理」なんだ。これを多くの人が「スクリプト」と過小評価してる。コンテナは、私、開発者に状態管理の大きなコントロールを与えて、エフェメラルにすることで簡素化してくれる。それは大きなことだよ。

それは二言だね。「決定論的」ってのはどう?

rpmやdebパッケージを作ってみたことある?

(mkdirについての注意:mkdir -pは、ディレクトリが既に存在していても成功するよ)

ソフトウェアに関して言えば、根本的な悪はお金じゃなくて状態だと思う。状態の変化を制限するためにできることは、バグを防ぐために価値がある。コンテナはこれに最適で、特に「システム管理者」が個別のアプリケーションサーバーにSSH(またはこの場合はRDP)で入って、適切な自動化を使わずに手動でアプリを更新する羽目になったことがある人にはね。

コンテナは状態管理を大幅に減らしてくれる。しかも、Podmanを使ってルート権限なしでコンテナをビルド/実行すれば、状態管理を減らし、不要な権限昇格を避けられるよ。

数年前、これがまさに同僚たちをコンテナに興味を持たせるきっかけだった。プロダクションのやり方に変更を求めることは一切なかった。ただ、自分のワークステーションで開発やテストのためにランタイム環境を管理するためにコンテナを使い始めただけ。それを見た同僚たちが、従来のVMベースの管理方法に比べてどれだけ手間が減ったかに気づき始めた。すぐに、同じようにセットアップする手伝いを頼まれるようになって、最終的にはCIパイプラインもコンテナ化した。でも、プロダクションでのやり方は変えなかった。OpsはVM+Ansibleのセットアップに満足していたし、「コンテナ万歳」以上の理由でそれをいじる必要はなかったからね。今にして思えば、Devcontainersの導入によって、開発におけるコンテナの利点が大きく損なわれた気がする。少なくとも私の視点からすると、開発におけるコンテナの本当の価値は、タイピングするアプリケーションのランタイム環境と、テストを行うランタイム環境との結合が緩やかになることだったんだ。だけど、Devcontainersはその二つを再び密結合にするように設計されている。

いつでも「apt-get install」できるよ。特定のパッケージのバージョンを確実に固定することはできないと思うけど、そうするとコンテナの前と同じように問題が起きるよね。

たぶん、単一のサーバーに単一のアプリがずっとそのままってことはあまりないからかな。全体的には状況が改善されて、個人的にはLinuxの方がWindowsよりもいいと思うけど… .NetやJavaのアプリをいくつかインストールして、複数のフレームワークバージョンでうまく動かすのは最悪だよね。依存関係がもっと複雑だったらなおさら。Windowsコンテナ用のDocker自体も、依存関係の問題で本当にイライラする経験だったし、最初からあまり良いアイデアだとは思ってなかった。それがLinux用のDockerを薄めてしまったと思う。Dockerやコンテナ、Composeは、データベースやキャッシュなどの依存関係があるアプリケーションなら結構使いやすいよね。TLS証明書の設定や終了をアプリサーバーから分けたり、大規模なオーケストレーションオプションにスケールアップしたりする選択肢もあるし… でも、私は自宅のラボや自分のサーバーでComposeを超えたことはまだないけど。コンテナやボリュームを使うことで、バックアップや復元のためにデータストレージやアプリケーションの設定をより良く配置できるし、Composeや設定の隣に置けるんだ。実際、compose-down、rsync、DNS変更、そして新しいサーバーでcompose up -dを使ってアプリをサーバー間で移行できたこともある。全体的に見て、かなり良い感じだよ。

ここでのほとんどの反応は反射的だね。記事は気に入ったよ。コンテナとの冒険に近いし。Dockerの発明は確かに主にパッケージングだと思う。Dockerfile(機能的)はかなり面白いし、Docker Hub(コンテナのアドレス)は素晴らしいし、DockerfileのENTRYPOINTはいいね、これがDockerを.debと区別してる。でも、確かにDockerfileを超えると状況は厳しい。Docker Composeは期待には応えてくれなかった。真剣なことをするには、ロードバランサーやストレージ、アドレッシングが必要で、これらは従来のコンテナの範囲を超えてるんだよね。