回答:
Docker FAQから:
Dockerはlxcの代わりにはなりません。「lxc」は、Linuxカーネルの機能(具体的には名前空間と制御グループ)を指し、プロセスを互いにサンドボックス化して、それらのリソース割り当てを制御することができます。
カーネル機能のこの低レベルの基盤に加えて、Dockerはいくつかの強力な機能を備えた高レベルのツールを提供します。
マシン間でのポータブルな展開。Dockerは、アプリケーションとそのすべての依存関係を単一のオブジェクトにバンドルするためのフォーマットを定義します。Docker対応のマシンに転送し、そこで実行すると、アプリケーションに公開される実行環境が同じになることが保証されます。Lxcはプロセスのサンドボックス化を実装します。これは、ポータブルな展開の重要な前提条件ですが、それだけではポータブルな展開には不十分です。カスタムlxc構成にインストールされているアプリケーションのコピーを送った場合、それはあなたのマシンのようには実行されません。それは、マシンの特定の構成(ネットワーク、ストレージ、ロギング、ディストリビューション)に関連付けられているためです。などDockerは、これらのマシン固有の設定の抽象化を定義しているため、まったく同じDockerコンテナをさまざまなマシンで変更なしで実行できます。
アプリケーション中心。Dockerは、マシンではなく、アプリケーションのデプロイメント用に最適化されています。これは、そのAPI、ユーザーインターフェイス、設計哲学、およびドキュメントに反映されています。対照的に、lxcヘルパースクリプトは、軽量マシンとしてコンテナーに焦点を合わせています。コンテナにはそれ以上のものがあると思います。
自動ビルド。Dockerには、開発者がアプリケーションの依存関係、ビルドツール、パッケージングなどを完全に制御して、ソースコードからコンテナを自動的にアセンブルするためのツールが含まれています。make、maven、chef、puppet、salt、debianパッケージ、rpm、ソースを自由に使用できますマシンの構成に関係なく、tarball、または上記の任意の組み合わせ。
バージョン管理。Dockerには、コンテナの連続バージョンを追跡し、バージョン間の差分を検査し、新しいバージョンをコミットし、ロールバックするなどのgitのような機能が含まれています。履歴には、コンテナがどのようにアセンブルされたか、誰が作成したかが含まれるため、本番サーバーから完全なトレーサビリティを取得できます上流の開発者に戻るまで。Dockerは、「git pull」と同様に、増分アップロードおよび増分ダウンロードも実装しているため、差分を送信するだけでコンテナの新しいバージョンを転送できます。
コンポーネントの再利用。任意のコンテナを「ベースイメージ」として使用して、より特化したコンポーネントを作成できます。これは手動で、または自動ビルドの一部として実行できます。たとえば、理想的なPython環境を準備し、それを10の異なるアプリケーションのベースとして使用できます。理想的なpostgresql設定は、将来のすべてのプロジェクトで再利用できます。等々。
共有しています。Dockerはパブリックレジストリ(https://registry.hub.docker.com/)にアクセスできます。ここでは、何千人もの人々が有用なコンテナをアップロードしています。redis、couchdb、postgres、irc bouncers、rails appサーバー、hadoop、baseイメージ、さまざまなディストリビューション。レジストリには、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について学び始めたばかりなので、修正やより良い答えを歓迎します。
unshare
ツール(または直接clone()
システムコール)を使用するよりも使いやすくするための一般的なユーザーランドツールです。同様に、Dockerはこれらの機能を使いやすくします(そして、イメージをプッシュ/プルする機能など、テーブルに多くの機能をもたらします)。私の2c。
update-index
とread-tree
、などの使い慣れたツールなしadd
、commit
とmerge
。DockerはLXCの「配管」の上に「磁器」の層を提供するため、より高いレベルの概念で作業し、低いレベルの詳細については心配する必要がありません。
LXDの開発がLXCを強化し続けるにつれて、上記の投稿と回答は急速に古くなっています。はい、Dockerもまだ立っていません。
LXDはLXCコンテナイメージのリポジトリを実装するようになり、ユーザーはそこからプッシュ/プルして貢献したり再利用したりできます。
LXCの LXDのREST APIは、非常に単純なコマンド構文を使用して、ローカルとリモートの両方でLXCコンテナの作成/展開/管理を可能にします。
LXDの主な機能は次のとおりです。
OpenStack用のNCLXDプラグインが追加され、OpenStackが LXDを利用して、LXCコンテナーをKVM、vmwareなどを使用する代わりにOpenStackのVMとしてデプロイ/管理できるようになりました。
ただし、NCLXDは、従来のHW VMとLXC VMの混合のハイブリッドクラウドも有効にします。
OpenStack nclxdプラグインには、サポートされる機能のリストが含まれます。
stop/start/reboot/terminate container
Attach/detach network interface
Create container snapshot
Rescue/unrescue instance container
Pause/unpause/suspend/resume container
OVS/bridge networking
instance migration
firewall support
Ubuntu 16.04が2016年4月にリリースされるまでに、ブロックデバイスサポート、ライブ移行サポートなどの追加の優れた機能が提供されます。
ドッカーは、レイヤーで構築された画像を使用します。これにより、移植性、共有、バージョン管理などの機能が大幅に追加されます。これらの画像は非常に簡単に移植または転送でき、レイヤー内にあるため、後続のバージョンでの変更は、以前のレイヤーの上にレイヤーの形で追加されます。そのため、何度も移植する際に、ベースレイヤーを移植する必要はありません。ドッカーには、実行環境が含まれた状態でこれらのイメージを実行するコンテナーがあり、バージョン管理を容易にする新しいレイヤーとして変更が追加されます。
それとは別に、Docker Hubは数千の公開イメージを含む優れたレジストリであり、OSやその他のソフトウェアがインストールされているイメージを見つけることができます。そのため、アプリケーションにとって非常に優れたスタートを切ることができます。
このより重要なことを続けるつもりですが、これはすでに質問され、上記で回答されてい ます。
ただし、一歩下がって少し違った方法で答えます。Dockerエンジン自体がオーケストレーションをその追加機能の1つとして追加しており、これが破壊的な部分です。複数のコンテナーエンジン間で「どこか」で実行されているコンテナーの組み合わせとしてアプリを実行し始めると、それは本当にエキサイティングになります。堅牢性、水平スケーリング、基盤となるハードウェアからの完全な抽象化。
これを提供するのはDockerだけではありません。実際には、事実上のContainer Orchestration標準は、Dockerの多くのフレーバーであるKubernetesですが、OpenShift、SuSe、Azure、AWS ...
次に、K8Sの下には代替のコンテナエンジンがあります。興味深いのはDockerとCRIOです。最近ビルドされ、デーモンレスで、Kubernetes専用のコンテナーエンジンとして意図されていますが、未熟です。これらの間の競争は、私がコンテナーエンジンの真の長期的な選択になると思います。