Dockerはlxc-tools(ユーザースペースLXCツール)に何を追加しますか?


398

Dockerの機能を見ると、それらのほとんどはすでにLXCによって提供されています。

では、Dockerは何を追加するのでしょうか。プレーンLXCではなくDockerを使用するのはなぜですか?

回答:


550

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 horizo​​n、shipyard)、構成管理(chef、puppet)、継続的統合(jenkins、strider、travis)など。Dockerは、コンテナーベースのツールの標準として急速に定着しています。

これが役に立てば幸いです!


3
「任意のコンテナーをベースイメージとして使用できる」という場合、Dockerから独立して作成されたLXCコンテナーではなく、Dockerコンテナーを意味していると思います。私の知る限り、Dockerコンテナーを最初から作成することはできません。常に別のDockerコンテナーを継承する必要があります(関連する質問:stackoverflow.com/questions/18274088/…)。
Flimm 2013

18
「docker import」を使用すると、任意のtarballから新しいコンテナーを簡単に作成できます。例:「debootstrap raring ./rootfs; tar -C ./rootfs -c。| docker import flimm / mybase」。
ソロモンハイクス2013

3
Dockerがlibcontainerを持っている(これは置き換えではない)ので、これは今も当てはまりますか?
Garet Claborn 2014年

3
@GaretClabornはい、libcontainerは名前空間とcgroupにアクセスするための独自のライブラリなので、ソロモンが言ったことはすべてそのまま適用されます。
John Morales

10
Linuxコンテナーは、一連のLinux機能(chroot、cgroups、および名前空間)を使用してプロセスを制約および分離した結果です。LXCは、これらの機能を操作するユーザースペースツールです。libcontainerは、同じ機能を操作するLXCの代替です。Dockerはデフォルトでlibcontainerを使用しますが、代わりにLXCを使用できます。とは言っても、Dockerは(はるかに)libcontainer / LXC上の互換性レイヤー以上のものです。他の回答に記載されている機能が追加されます。
user100464 2015

71

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について学び始めたばかりなので、修正やより良い答えを歓迎します。


35
私見、この答えは要点を逃しています。Dockerはこれらの機能を「提供」しません。簡単に使用できるようにするだけです。細心の注意を払いたい場合は、LXCは分離を提供しないと言えます名前空間はそれを提供します。LXCは、基本的なunshareツール(または直接clone()システムコール)を使用するよりも使いやすくするための一般的なユーザーランドツールです。同様に、Dockerはこれらの機能を使いやすくします(そして、イメージをプッシュ/プルする機能など、テーブルに多くの機能をもたらします)。私の2c。
jpetazzo 2013

6
@jpetazzo:LXCは実際にはかなり簡単ですが、Dockerを使用するとどのように簡単になります(イメージのプッシュやプルなどの他の機能を追加する以外に)?
Flimm 2013

31
@Flimm:管理マガジン、p。16の第16号の比較が好きです。34:DockerはLXCを他のいくつかのサポートテクノロジーとバンドルし、使いやすいコマンドラインインターフェースでラップします。コンテナを使用すると、ビットのようなだけのコマンドでGitリポジトリを使用しようとしているようなものですupdate-indexread-tree、などの使い慣れたツールなしaddcommitmerge。DockerはLXCの「配管」の上に「磁器」の層を提供するため、より高いレベルの概念で作業し、低いレベルの詳細については心配する必要がありません。
0xC0000022L 2013

4
私は、同じOSを実行している、DockerコンテナーとLXCコンテナー内でUnixBenchベンチマークを実行しました。LXCはスコアが優れています。LXCをベースにしたDockerなので、自分の結果には非常に困惑しています。
gextra 2013年

7
Dockerのパフォーマンスの低下はディスクI / Oに関連しているように見えます。そのため、AUFSの採用が原因である可能性があります。
gextra 2013年

16

LXDの開発がLXCを強化し続けるにつれて、上記の投稿と回答は急速に古くなっています。はい、Dockerもまだ立っていません。

LXDはLXCコンテナイメージのリポジトリを実装するようになり、ユーザーはそこからプッシュ/プルして貢献したり再利用したりできます。

LXCの LXDのREST APIは、非常に単純なコマンド構文を使用して、ローカルとリモートの両方でLXCコンテナの作成/展開/管理を可能にします。

LXDの主な機能は次のとおりです。

  • 安全な設計(非特権コンテナー、リソース制限など)
  • スケーラブル(ラップトップ上のコンテナーから数千の計算ノードまで)
  • 直感的(シンプルで明確なAPIと鮮明なコマンドラインエクスペリエンス)
  • イメージベース(配布テンプレートはなく、信頼できる適切なイメージのみ)ライブマイグレーション

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月にリリースされるまでに、ブロックデバイスサポート、ライブ移行サポートなどの追加の優れた機能が提供されます


4

ドッカーは、レイヤーで構築された画像を使用します。これにより、移植性、共有、バージョン管理などの機能が大幅に追加されます。これらの画像は非常に簡単に移植または転送でき、レイヤー内にあるため、後続のバージョンでの変更は、以前のレイヤーの上にレイヤーの形で追加されます。そのため、何度も移植する際に、ベースレイヤーを移植する必要はありません。ドッカーには、実行環境が含まれた状態でこれらのイメージを実行するコンテナーがあり、バージョン管理を容易にする新しいレイヤーとして変更が追加されます。

それとは別に、Docker Hubは数千の公開イメージを含む優れたレジストリであり、OSやその他のソフトウェアがインストールされているイメージを見つけることができます。そのため、アプリケーションにとって非常に優れたスタートを切ることができます。


「層に組み込まれている」と言ったとき-それはどういう意味ですか-(A)ベース層のコピーで、「新しい」層に適応され、コミットされます。それで、ベースレイヤーは次のレイヤーから切断されていますか?(B)ベースレイヤーは「新しい」レイヤーに含まれ、リンクされています。したがって、ベースレイヤーへの変更は自動的に「新しい」レイヤーに反映されます。申し訳ありませんが、求められた説明が単純すぎる場合。:( Kapil
Kapil

Dockerイメージはレイヤーに組み込まれています。細かく言えば、レイヤーがコミットされる時点までのすべての変更は、その時点までに作成されたイメージのレイヤーに存在します。その後に行われた変更は、次のレイヤーと上のレイヤーに追加されます。したがって、新しいレイヤーはベースレイヤーにリンクされています。同じ新しいレイヤーを、追加の変更を加えて別のベースレイヤーに追加できるとは思いません。ただし、複数のエンティティが一貫性を維持し、同じベースレイヤーを持つ必要がある場合は、新しいレイヤーのみをこれらのエンティティに与えて同じ状態にする必要があります。
div

ただし、Dockerの現在の開発状況については更新されていません。Dockerイメージの実装に、上記のコメントで説明されていない変更がある可能性があります。
div

具体的には、レイヤーはシグネチャ(SHAなど)で識別されます。つまり、レイヤーを変更すると、別のレイヤーになります。 @Kapil:つまり、その動作はオプション(B)にいくらか近づいていますが、実際にはベースレイヤーに変更を加えることはできません。(または、任意のレイヤー、さらに言えば)画像は、順番に適用されたレイヤーのリストから構築されます。レイヤーは不要になったときにクリーンアップできます(そして、Docker自体によって自動的にクリーンアップされると思います)。つまり、すべての参照画像が削除されたとき。
codermonkeyfuel 2016年

@Kapil:正直なところ、あなたの質問は、この質問に対するコメントとしてではなく、おそらく新しい質問として最も効果的に機能します。新しい質問をしたい場合は、私も回答します。
codermonkeyfuel 2016年

0

このより重要なことを続けるつもりですが、これはすでに質問され、上記で回答されてい ます

ただし、一歩下がって少し違った方法で答えます。Dockerエンジン自体がオーケストレーションをその追加機能の1つとして追加しており、これが破壊的な部分です。複数のコンテナーエンジン間で「どこか」で実行されているコンテナーの組み合わせとしてアプリを実行し始めると、それは本当にエキサイティングになります。堅牢性、水平スケーリング、基盤となるハードウェアからの完全な抽象化。

これを提供するのはDockerだけではありません。実際には、事実上のContainer Orchestration標準は、Dockerの多くのフレーバーであるKubernetesですが、OpenShift、SuSe、Azure、AWS ...

次に、K8Sの下には代替のコンテナエンジンがあります。興味深いのはDockerとCRIOです。最近ビルドされ、デーモンレスで、Kubernetes専用のコンテナーエンジンとして意図されていますが、未熟です。これらの間の競争は、私がコンテナーエンジンの真の長期的な選択になると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.