ウェブサイト検索

Dockerコンテナのメモリ制限を設定する方法


Dockerコンテナはデフォルトでリソース制約なしで実行されます。コンテナ内で実行されているプロセスは、隣接するコンテナやホスト上の他の作業負荷に影響を与える可能性のある無限のメモリ量を自由に使用することができます。

これは生産環境で危険です。各コンテナは、リソースの消費が増大するのを防ぐために、適切なメモリ制限で構成する必要があります。これにより争いを減らし、全体的なシステムの安定性を最大化するのに役立ちます。

Dockerのメモリ制限の仕組み

Dockerは、個々のコンテナに対してハードメモリ制限とソフトメモリ制限を設定することを可能にします。これらは、利用可能なメモリの量や制限に達したときの挙動に異なる影響を与えます。

  • ハードメモリ制限は、コンテナに提供されるメモリに絶対的な上限を設定します。この制限を超えると、通常、カーネルのアウトオブメモリキラーがコンテナプロセスを終了させます。
  • ソフトメモリ制限は、コンテナが使用することが期待されるメモリの量を示します。コンテナは、容量が利用可能な場合、より多くのメモリを使用することが許可されます。低メモリ状態でソフト制限を超えた場合、終了される可能性があります。

Dockerは、スワップメモリの制約を設定するための制御や、メモリ制限に到達したときに何が起こるかを変更するための制御も提供します。これらの使い方は次のセクションで説明します。

ハードメモリ制限とソフトメモリ制限の設定

ハードメモリ制限はdocker runコマンドによって設定されます

-m

または--memoryフラグ。それは次のような値を取ります

512m

(メガバイト用) または

2g

(ギガバイト用):

docker run --memory=512m my-app:latest

コンテナには最低6MBのメモリ要件があります。--memoryの値を6m未満に設定しようとするとエラーが発生します。

ソフトメモリ制限は--memory-reservationフラグで設定されます。この値は--memoryよりも低くする必要があります。制限はコンテナのリソース競合が発生するか、ホストの物理メモリが少ないときにのみ適用されます。

docker run --memory=512m --memory-reservation=256m my-app:latest

この例では、256MBの予約メモリを持つコンテナを開始します。もしプロセスが300MBを使用していて、容量が不足している場合、終了する可能性があります。使用量が512MBを超えると、必ず停止します。

スワップメモリの管理

コンテナは、高い使用量に対応するためにスワップメモリを割り当てることができ、物理メモリの消費に影響を与えることなく使用できます。スワップは、利用可能なRAMが使い果たされた後にメモリの内容をディスクに書き込むことを許可します。

--memory-swapフラグは、利用可能なスワップスペースの量を制御します。これは、--memoryと併用する場合にのみ機能します。--memoryと--memory-swapを異なる値に設定すると、スワップ値はコンテナに利用可能な合計メモリ量を制御し、スワップスペースを含みます。--memoryの値は、物理メモリの量のどの部分が決定されるかを示します。

docker run --memory=512m --memory-swap=762m my-app:latest

このコンテナは762MBのメモリにアクセスでき、そのうち512MBは物理RAMです。残りの250MBはディスクに保存されたスワップスペースです。

--memoryを--memory-swapなしで設定すると、コンテナは物理メモリと同じ量のスワップスペースにアクセスできます。

docker run --memory=512m my-app:latest

このコンテナは合計1024MBのメモリを持っており、その内訳は512MBのRAMと512MBのスワップです。

コンテナのスワップは、--memory-swapフラグを--memoryと同じ値に設定することで無効にできます。--memory-swapが総メモリ量を設定し、--memoryが物理メモリの割合を割り当てるため、Dockerに対して利用可能なメモリの100%がRAMであるべきであると指示しています。

いかなる場合でも、スワップはホストで有効にされているときのみ機能します。コンテナ内でのスワップの報告は信頼性がなく、使用すべきではありません。コンテナ内で実行されるfreeのようなコマンドは、Dockerホスト上のスワップスペースの総量を表示し、コンテナがアクセスできるスワップは表示しません。

メモリ不足プロセスの無効化は致命的です

コンテナ内のメモリ不足エラーは、通常、カーネルがプロセスを終了させる原因となります。これにより、コンテナは終了コード137で停止します。

docker run コマンドにオプションフラグ --oom-kill-disable を含めることで、この動作が無効になります。プロセスを停止する代わりに、カーネルは新しいメモリ割り当てをブロックします。プロセスは、メモリ使用量を減らすか、新しいメモリ割り当てをキャンセルするか、手動でコンテナを再起動するまでハングしているように見えます。

このフラグは、メモリ不足の状態を自分で解決する仕組みを実装していない限り使用すべきではありません。通常、カーネルにプロセスを終了させる方が良いことで、これによりコンテナが再起動し、正常なメモリ消費が回復します。

要約

Dockerコンテナは、事前に適用されたリソース制約なしに提供されます。これにより、コンテナプロセスは無制限のメモリを消費することができ、ホストの安定性を脅かす可能性があります。

この記事では、ハードおよびソフトなコンテナメモリ制限の設定方法を学び、メモリ不足の状況に陥る可能性を減らす方法を学びました。すべてのコンテナにこれらの制限を設定することで、リソースの争奪を減らし、ホストの物理メモリ容量内に収まることができます。また、メモリの制限とともにCPU制限を使用することを検討すべきです。これにより、高いCPU需要を持つ個々のコンテナが隣接するコンテナに悪影響を与えるのを防ぐことができます。

関連記事: