Docker の機能を見てみると、それらのほとんどは既に LXC によって提供されています。
では、Docker は何を追加するのでしょうか? プレーンな LXC ではなく Docker を使用する理由
Docker FAQから:
Docker は lxc に代わるものではありません。「lxc」は、Linux カーネル (具体的には名前空間と制御グループ) の機能を指し、プロセスを相互にサンドボックス化し、それらのリソース割り当てを制御できるようにします。
このカーネル機能の低レベルの基盤の上に、Docker はいくつかの強力な機能を備えた高レベルのツールを提供します。
マシン間での移植可能な展開。Docker は、アプリケーションとそのすべての依存関係を単一のオブジェクトにバンドルするための形式を定義します。このオブジェクトは、任意の Docker 対応マシンに転送でき、アプリケーションに公開される実行環境が同じであることを保証してそこで実行できます。Lxc はプロセス サンドボックスを実装しています。これはポータブルな展開の重要な前提条件ですが、それだけではポータブルな展開には十分ではありません。カスタム lxc 構成でインストールされたアプリケーションのコピーを送ってくれた場合、それはあなたのマシンの特定の構成 (ネットワーク、ストレージ、ロギング、ディストリビューション、 Docker は、これらのマシン固有の設定の抽象化を定義するため、まったく同じ Docker コンテナーを変更せずに多くの異なるマシンで実行できます。
アプリケーション中心。Docker は、マシンではなく、アプリケーションの展開用に最適化されています。これは、API、ユーザー インターフェイス、設計思想、およびドキュメントに反映されています。対照的に、lxc ヘルパー スクリプトは軽量マシンとしてのコンテナーに焦点を当てています。コンテナにはそれだけではありません。
自動ビルド。Docker には、アプリケーションの依存関係、ビルド ツール、パッケージングなどを完全に制御して、開発者がソース コードからコンテナーを自動的にアセンブルするためのツールが含まれています。開発者は、make、maven、chef、puppet、salt、debian パッケージ、rpm、source を自由に使用できます。マシンの構成に関係なく、 tarball、または上記の任意の組み合わせ。
バージョン管理。Docker には、コンテナーの連続するバージョンを追跡し、バージョン間の差分を検査し、新しいバージョンをコミットし、ロールバックするなどの git のような機能が含まれています。履歴には、コンテナーがどのように誰によって組み立てられたかも含まれているため、運用サーバーから完全なトレーサビリティを取得できます。上流の開発者にまでさかのぼります。Docker は、「git pull」と同様に、増分アップロードとダウンロードも実装しているため、差分を送信するだけでコンテナの新しいバージョンを転送できます。
コンポーネントの再利用。任意のコンテナを「基本イメージ」として使用して、より特化したコンポーネントを作成できます。これは、手動で行うことも、自動ビルドの一部として行うこともできます。たとえば、理想的な python 環境を準備し、それを 10 個の異なるアプリケーションのベースとして使用できます。理想的な postgresql セットアップは、将来のすべてのプロジェクトで再利用できます。等々。
共有。Docker はパブリック レジストリ ( https://registry.hub.docker.com/ ) にアクセスできます。そこでは、何千人もの人々が有用なコンテナーをアップロードしています。redis、couchdb、postgres、irc バウンサー、rails アプリ サーバー、hadoop、ベース イメージなど、あらゆるものがあります。さまざまなディストリビューション。レジストリには、docker チームが管理する便利なコンテナの公式の「標準ライブラリ」も含まれています。レジストリ自体はオープンソースであるため、誰でも独自のレジストリをデプロイして、プライベート コンテナーを保存および転送できます。たとえば、内部サーバーのデプロイに使用できます。
ツールのエコシステム。Docker は、コンテナーの作成とデプロイを自動化およびカスタマイズするための API を定義します。docker と統合してその機能を拡張するツールは数多くあります。PaaS のような展開 (Dokku、Deis、Flynn)、マルチノード オーケストレーション (maestro、salt、mesos、openstack nova)、管理ダッシュボード (docker-ui、openstack Horizon、shipyard)、構成管理 (chef、puppet)、継続的統合(jenkins、strider、travis) など。Docker は、コンテナー ベースのツールの標準としての地位を急速に確立しています。
これが役立つことを願っています!
Docker の技術的機能のリストを見て、LXC で提供されている機能と提供されていない機能を確認してみましょう。
1)ファイルシステムの分離: 各プロセス コンテナーは、完全に別個のルート ファイルシステムで実行されます。
プレーン LXC で提供されます。
2)リソースの分離: cgroup を使用して、CPU やメモリなどのシステム リソースを各プロセス コンテナーに個別に割り当てることができます。
プレーン LXC で提供されます。
3)ネットワークの分離: 各プロセス コンテナーは、独自の仮想インターフェイスと IP アドレスを使用して、独自のネットワーク名前空間で実行されます。
プレーン LXC で提供されます。
4)コピー オン ライト: ルート ファイルシステムはコピー オン ライトを使用して作成されます。
これは、Docker が依存するユニオン ファイルシステムである AUFS によって提供されます。LXC を使用して手動で AUFS をセットアップすることもできますが、Docker はそれを標準として使用します。
5)ロギング: 各プロセス コンテナの標準ストリーム (stdout/stderr/stdin) が収集され、リアルタイムまたはバッチ取得のためにログに記録されます。
Docker はこれを提供します。
6)変更管理: コンテナーのファイルシステムへの変更を新しいイメージにコミットし、再利用してさらにコンテナーを作成できます。テンプレートや手動構成は不要です。
「テンプレート化または手動構成」は LXC への参照であり、これらの両方について学ぶ必要があります。Docker を使用すると、LXC 構成について学習しなくても、仮想マシンの扱いに慣れている方法でコンテナーを扱うことができます。
7)対話型シェル: docker は疑似 tty を割り当て、任意のコンテナーの標準入力にアタッチして、たとえば、使い捨ての対話型シェルを実行できます。
LXC はすでにこれを提供しています。
LXC と Docker について学び始めたばかりなので、修正やより良い回答を歓迎します。