web-dev-qa-db-ja.com

Dockerコンテナーとメモリ消費

同じdockerイメージに基づいた多数のdockerコンテナーを開始するとします。これは、各ドッカーコンテナが同じアプリケーションを実行していることを意味します。アプリケーションが十分に大きく、大量のハードドライブメモリを必要とする場合があります。

Dockerはどのように対処していますか?

Dockerイメージで定義された静的パーツを共有するすべてのdockerコンテナーはありますか?

そうでない場合は、ドッカーコンテナーを実行し、各ドッカーコンテナーにこのアプリディレクトリをマウントするために使用されるマシン上のディレクトリにアプリケーションをコピーするのは理にかなっていますか?

53
Michael Belenki

Dockerは、カーネルレベルでリソースを共有します。これは、実行時にアプリケーションロジックが複製されないことを意味します。メモ帳を1000回起動すると、ハードディスクに1回だけ保存されます。Dockerインスタンスでも同じカウントになります。

同じdockerイメージのインスタンスを100個実行する場合、実際に行うことは、RAM 100の異なるタイムラインで同じソフトウェアの状態を維持することです。ホストプロセッサのシフトこれらの各コンテナインスタンスのインメモリ状態は、それを制御するソフトウェアに対して、アプリケーションの実行に必要なRAMメモリの100倍を消費します。正確に物理的に保存する意味はありません。アプリケーションのこの部分は常に静的であり、変更されないため、ソフトウェアに対して同じバイトコードを100回使用します(クレイジーな自己変更ソフトウェアを記述したり、コンテナのイメージを再構築および再デプロイすることを選択しない限り)

これが、コンテナがそのままで永続性を許可しない理由であり、Dockerが仮想ハードディスクを使用する通常のVMとどのように異なるかです。ただし、これはコンテナー内の永続性にのみ当てはまります。ハードディスク上のドッカーソフトウェアによって変更されているファイルは、ドッカーボリュームを使用してコンテナーに「マウント」されているため、実際にはドッカー環境の一部ではなく、単にマウントされています。 (これについての詳細は: https://docs.docker.com/userguide/dockervolumes/

このことについて考えるときに尋ねることができるもう1つの質問は、Dockerが実行時にディスクに加えた変更をどのように保存するかです。チェックアウトするのが本当に嬉しいのは、Dockerが実際にどのようにこれを機能させるかです。コンテナのハードディスクの元の状態は、イメージから与えられたものです。このイメージに[〜#〜] not [〜#〜]書き込みできます。イメージに書き込む代わりに、コンテナーの内部状態で変更された内容と、Dockerイメージ内の内容との差分が作成されます。 Dockerは、「 nion Filesystem 」と呼ばれるテクノロジーを使用します。これは、Dockerイメージの初期状態の上に差分レイヤーを作成します。

この「diff」(下の画像ではwritable containerとして参照されます)はメモリに保存され、コンテナを削除すると消えます。 (ただし、「docker commit」コマンドを使用しない限り、これはお勧めしません。新しいdockerイメージの状態はdockerfileには表されず、再構築から簡単に再生成できません)

Union Filesystem

100
RoyB