3 ポイント 投稿者 GN⁺ 2024-11-15 | 6件のコメント | WhatsAppで共有
  • docker-composeはDockerコンテナを扱うためのツールで、複雑なアプリケーションのデプロイ問題は解決するものの、大衆向けのシンプルなセルフホスティングには十分ではありません
  • SQLデータベース、ローカルキャッシュ、永続ストレージ、サービスディスカバリ、リソース管理の概念を含む、より高水準の抽象化が必要です

Dockerの役割

  • Dockerはコンテナ化を大衆化したツールで、ホストシステムは船にたとえることができます。
  • ハードウェア、オペレーティングシステム、コンテナランタイムがあり、コンテナはランタイム内で実行され、データベースやWebサーバーのような他のサービスと通信します。

Docker-composeの役割

  • docker-composeは一緒に動作するコンテナ群を指定するためのツールで、セルフホスティングアプリケーションのデプロイを容易にします。
  • しかし、標準化されたインターフェースを壊し、コンテナが本来解決していた問題を再現してしまいます。
  • 例: Pihole
    • PiholeはDNSサーバーで、複雑なdocker-composeファイルを必要とします。
    • コンテナ名、イメージ、ポート、環境変数、ボリューム、追加機能、再起動ポリシーなどを設定しなければなりません。
    • 複雑な設定はユーザー自身が管理する必要があり、これはDocker Composeの欠点です
  • 例: Jitsi Meet
    • Jitsi Meetは複雑なソフトウェアで、4つのコンテナ、7つのボリューム、9つのポート、200個を超える環境設定を含むdocker-compose構成を生成します。
  • 例: 他の人気セルフホスティングアプリケーションも同様の問題を抱えています
    • Authentik、Nextcloud、Immich、Jellyfin、Paperless NGXなどさまざまなアプリケーションがあり、それぞれのdocker-compose構成は数十から数百のdockerコマンドを置き換えています。
    • 各アプリケーションは独自のデータベース、キャッシュ、HTTPハンドラを含むことがあり、これは重複したリソース消費につながります。

問題点

  • docker-composeは柔軟すぎて細かすぎ、誤った抽象化レイヤーで動作しています。
  • 各アプリケーションはHTTP処理プロセス、キャッシュ、またはデータベースを持っています。データベースのバックアップはシステム運用者の責任です。
  • 例: リバースHTTPプロキシ
    • リバースHTTPプロキシは、受信したHTTPリクエストを別のプログラムへ転送するプログラムです。各プログラムはWebサーバーを含めるかどうかを決めなければなりません。
    • Webサーバーを含む場合
      • Webサーバーを含めればプログラムは動作しますが、特定のポートでしか動作せず、複数のコンテナがある場合はポートの再マッピングが必要になります。
    • Webサーバーを含まない場合
      • Webサーバーを含めなければリソースは無駄になりませんが、管理インターフェースなしでアプリケーションを構成しなければなりません。
    • DNS
      • Webインターフェースはアドレスを持ち、TLSを望むなら名前が必要です。複数のサービスを単一ホストで実行する場合、ドメイン名やパスでリクエストをルーティングする必要があります。
    • ポート
      • docker-composeはポートの公開と再マッピングを許可しますが、実際には複雑なネットワーキング設定をサポートする必要があります。
  • 例: データベース
    • データベースでは、コンテナが削除されるとファイルへの変更がすべて削除されます。データベースコンテナはデータベース内容を保存するためにボリュームを追加する必要があります。
    • N+1=2またはそれ以上
      • データベースをバックアップするにはオフサイトバックアップが必要です。各サービスが別個のデータベースサーバープロセスをバンドルすると、計算資源が無駄になります。

解決策

  • より高い抽象化レイヤーへ移行し、データベース、リバースWebプロキシ、キャッシュ、静的Webアセットなどのコンテナ種別を区別するセマンティクスを追加します。
  • セマンティクスの例
    • 新しい構成形式を導入し、アプリケーション名、ビルド、HTTPSリバースプロキシ、キャッシュサービスを指定します。
  • 解決策 #1
    • 各プログラムがリバースプロキシを要求できるようにし、重複と無駄を防ぎます。リバースプロキシはDNS名を提供し、すべてのパスをプログラムへ転送します。
  • 解決策 #1.5
    • データベースセクションを追加し、SQL標準に準拠したデータベースを要求できるようにし、プログラムは「完全な」権限を期待します。
  • ポートに対する解決策
    • 各プログラムは自身のIPv6アドレスを受け取り、標準のポート番号を使用できます。セキュリティのため、ファイアウォールを使ってリバースプロキシだけがそのポートへアクセスできるようにします。

Tealok - 新しいコンテナランタイム

  • Tealokは、より高水準の抽象化と標準化されたインターフェースを提供する新しいコンテナランタイムです。
    • TLS証明書、リバースプロキシ設定、DNSレコード、バックアップ管理などを自動的に処理します。
    • IPv6を活用して各コンテナが独立したIPアドレスを持ち、標準のポート番号を使用できるようにします。
    • アプリケーション開発者は複雑な設定なしに標準インターフェースを通じてアプリケーションをデプロイできます。
  • 運用者に対しては、一貫したベストプラクティスを提供し、リソースの無駄を減らし、管理負担を軽減します。
  • 開発者に対しては、デプロイ方法を単純化し、意思決定の負担を減らします。
  • ユーザーはデータ所有権クラウドコンピューティングからの独立性を保証されます。

6件のコメント

 
luminance 2024-11-15

tealokを見てみると、代替になりそうな状態ではないですね?

 
savvykang 2024-11-15

ランタイムも削除してくれていたら本当によかったのですが

 
tujuc 2024-11-15

まだ docker-compose を使って運用環境を作って入り込むことは必要だと思いますが…

自分だけの特殊な環境での経験をもとに、それは間違いだから新しいものを作りました……というのは、ちょっと賛同しづらいですね(笑)。

うっかり誤解してしまいそうな内容ですね(笑)……

タイトルだけ見て、「あっ、開発環境で使うの、本当にしっくりこないよな……」と思っていたので……(笑)

 
ilbanin00 2024-11-15

本文のような用途で docker compose を使おうとすること自体、そもそも間違ったアプローチだと思います。

 
tujuc 2024-11-15

一部には同意しますが、アプローチが間違っていたとは思いません。
彼らにできる範囲では最善だったのでしょう :)

 
GN⁺ 2024-11-15
Hacker Newsのコメント
  • ポートマッピングやデータボリュームのバックアップ問題には、簡単な解決策がある

    • 開発環境向けの別個のdocker-composeファイルを使い、環境ごとに設定を変えて定義できる
    • バックアップ用の簡単なBashスクリプトを書いて、S3にアップロードできる
  • 個人サーバーでDockerを使ってセルフホスティングしている者として、Docker設定の自由度を前向きに評価している

    • 初期設定には時間がかかったが、その後は簡単に管理できるようになった
    • 新しいサービスの追加にはほとんど時間がかからず、セキュリティのため各サービスに非rootユーザーを作成している
    • macvlanネットワークを使って、各コンテナに固有のIPアドレスとMACアドレスを割り当てている
    • Nginx Proxy Managerを使ってリバースプロキシを管理しており、データベースとして複数インスタンスを動かしても問題はない
  • docker-composeは主に開発または個人用途で使われており、V2はV1と違ってDockerに統合されたプラグインである

  • 本番環境ではKubernetesを使うのが望ましく、docker-composeはローカル開発に適している

  • docker-composeは小規模なセルフホスティング向けの製品で、技術的な背景がない人を対象としている

    • TOMLへ移行したからといって、セルフホスティングが簡単になるという点には懐疑的である
  • Dockerを制御するプログラムを書くのは思ったより簡単で、Pythonスクリプトを使って問題を解決できる

  • canine.shを使って、KubernetesクラスタをHerokuのように簡単に使えるよう開発中である

    • 個人プロジェクトで使っており、低コストで複数のアプリをホストできる
  • Tealokがdocker-composeの代替を開発中である点は興味深い

  • docker-compose、Kubernetes、Helmは誤った抽象化レイヤーだと考えている

    • さまざまなコンテナ実行や通信方法を開発しようとする試みが多い
  • docker-composeが誤った抽象化レイヤーだという主張には戸惑いを感じる

    • 特定の問題を解決するための高水準インターフェースを期待しているように見える
    • 重複インスタンス生成の問題は、ほとんどのアプリケーションでは大きな問題ではない
    • 特定のやり方でアプリケーションを設計するよう強いるのは、特定の状況でしかうまく機能しないだろう