AWS(EC2、T2メディア)で複数のDockerコンテナを実行していますが、ディスク容量が不足しています。これは基本ファイルシステムに関連しています。私はUbuntuでDockerを実行していますが、うまくいきます(AUFS)。デフォルトのAWS LinuxバージョンはRHELに基づいており、デバイスマッパーを使用する必要があります。これははるかに複雑に見えますが、使用方法に関する適切なマニュアルがないことに驚きました(または見つかりませんでした)。
EC2でUbuntuイメージを使用できますが、EC2でDockerを大きな問題なく実行できる必要があると思いますか?または、ディスク容量が不足するのを防ぐために特別な措置を講じる必要がありますか?
私はNGINXとNodeJSイメージのみを使用します。
答え1
デフォルトでは、dockerはデータを/var/lib/docker
。
さらに、デフォルトでEC2インスタンスを作成すると、ルートボリュームは通常小さい(約4GB)。ルートパーティションはドッカーイメージが保存されている可能性が高く、ルートパーティションが小さすぎます。
したがって、ルートパーティションを増やしてください。または、新しいEBSボリュームを接続して適切な場所にマウントし、/var/lib/docker
Dockerに新しいEBSボリュームを使用して画像を保存するように指示します。
dockerがイメージを保存するディレクトリをデフォルトのディレクトリの代わりに変更するには、/var/lib/docker
dockerデーモンを起動するときに-gオプションを使用します。
望むより:ドッカーイメージのインストールディレクトリを変更する方法デフォルトのDocker作業パスを変更する方法の詳細。
答え2
Amazon Linux バージョンでは、デバイスマッパーを Docker ストレージドライバとして使用します。デバイスマッパーは、階層書き込み時にコピーブロックデバイスをコンテナに使用します。データが書き込まれない場合は、ディスク領域をほとんど使用しません。ファイルシステムのページが書き込まれると、デバイスマッパーがデータを割り当て、ディスクスペースの使用を開始します。
デバイスマッパーのデフォルトのディスクサイズは10 GBなので、6つのイメージを実行するときにすべてのページを書き込むと60 GBが必要になることがあります。すべてのページを書き込むことはできませんが、デフォルトのEC2インスタンスには8 GBしかありません。
ファイルが書き込まれると、複数のブロックに書き込まれます。ブロックがまだ作成されていない場合は、デバイスプールから割り当てられます。ファイルが削除されると、そのブロックはファイルシステムで未使用としてマークされますが、プールはそれを知りません。場合のみ一流実行後、ファイルシステムはデバイスマネージャからページを解放します。
NGINXは/tmp/cacheにキャッシュを保持し、ここに継続的に書き込みます。ファイルシステムが引き続き別のブロックを使用している場合は、10 GBがすべてデバイスマネージャにマップされるまでブロックを割り当て続けます。この問題にはいくつかの回避策があります。
- すべてのブロックを収容するのに十分な大きさのデバイスマッパーデバイスを使用してください。
- 画像が10 GBに達しないように、より小さいデフォルトサイズ(dm.basesize検索)を使用してください。
- AUFSリポジトリを使用するディストリビューションに切り替えます。
また、実行することができます一流解放されたブロックがプールに返されることを定期的に確認してください。最大ロード中は頻繁に実行されず、プールにはまだディスク容量が不足する可能性があるため、難しい場合があります。