6.1 コンテナのリソースを制限する理由
Dockerはコンテナのリソース管理にめっちゃうまく対応してて、システムのパワーを効率的に分配したり、コンテナ間の無駄な衝突を回避することができるんだ。これが特に大事なのは、1つのコンテナのアプリが全部のリソースを「食い潰して」、他のサービスの動作を止めちゃうのを防ぐためだよ。CPUやメモリみたいなリソースを制限することで、オーバーロードを回避し、システムの安定性を保ちつつ、どのアプリも予測可能な動作を保証できる。今回の講義では、CPUとメモリの使用にリミットを設定する方法を詳しく説明するよ。これでシステムが高負荷状態でもちゃんと効率的に動作できるようになるんだ!
コンテナのリソースを制限するのが大事な理由:
- 安定性: 1つのコンテナが全リソースを持っていっちゃって、他のコンテナやシステム自体が遅くなるのを防ぐため。
- 効率性: コンテナ間でリソースをより良く分配して、システムのパワーを最大限に活かすため。
- 保護: リソースを制限することで、コンテナがうっかり、または意図的にシステムをオーバーロードするのを防ぐため。
6.2 CPU
使用制限
Dockerは、コンテナが使用するCPU
を制限するためのいくつかの方法を提供してるよ。
重要!
ここでのCPU
はプロセッサのコア1つを意味してて、プロセッサ全体じゃないよ。クアッドコアのプロセッサなら、4つのCPU
があるってことね。
1. CPU
シェアの制限 (--cpu-shares
)
パラメータ--cpu-shares
は、コンテナがCPU
を使う際の優先順位の相対値を設定するよ。デフォルト値は1024で、これは相対的な値だから、例えば--cpu-shares=512
のコンテナは--cpu-shares=1024
のコンテナに比べて半分の優先度になるって感じ。
使用例:
この例では、high_priority_container
コンテナがlow_priority_container
コンテナよりもCPU
割り当ての優先度が高くなるよ。
docker run -d --name low_priority_container --cpu-shares=512 nginx
docker run -d --name high_priority_container --cpu-shares=2048 nginx
2. CPU
数の制限 (--cpus
)
パラメータ--cpus
で、コンテナに割り当てられるCPU
の正確な数を設定できるよ。例えば、1.5って値を指定すると、そのコンテナは1.5CPU
を使えるってことになる。
使用例:
この例では、limited_cpu_container
コンテナが1.5CPU
以上使わないように制限されるよ。
docker run -d --name limited_cpu_container --cpus="1.5" nginx
3. CPU
時間の使用制限 (--cpu-quota
と--cpu-period
)
パラメータ--cpu-quota
と--cpu-period
を使うと、CPU
の使用をさらに細かく調整できるよ。--cpu-period
はマイクロ秒単位で時間間隔を設定(デフォルトは100000)、--cpu-quota
はその間にCPU
を使う最大時間を設定するんだ。
使用例:
この例では、custom_cpu_quota_container
コンテナがCPU
を最大で50%(25000/50000)しか使わないように設定されてるよ。
docker run -d --name custom_cpu_quota_container --cpu-period=50000 --cpu-quota=25000 nginx
6.3 メモリ使用の制限
メモリ制限は、コンテナがどれだけのRAMを使用できるかをコントロールする方法だよ。これにより、1つのコンテナがメモリを「食い尽くして」、他のプロセスやコンテナに影響を与える状況を防ぐことができるんだ。
1. 最大メモリ使用量の制限 (--memory)
パラメータ --memory
は、コンテナが使用できるメモリの上限を設定するんだ。この制限を超えると、システムがコンテナを終了させるよ。
使用例:
この例では、コンテナ limited_memory_container
を最大512 MBのRAMのみ使用するように制限してるよ。
docker run -d --name limited_memory_container --memory="512m" nginx
2. メモリスワップ量の制限 (--memory-swap)
パラメータ --memory-swap
は、RAMとスワップの合計上限を設定するんだ。例えば、--memory
が512 MBに設定されていて、--memory-swap
が1 GBなら、コンテナは512 MBのRAMとさらに512 MBのスワップを使用できるよ。
使用例:
この例では、コンテナ swap_limited_container
を512 MBのRAMと512 MBのスワップのみ使用するように制限してるんだ。
docker run -d --name swap_limited_container --memory="512m" --memory-swap="1g" nginx
3. スワップなしでメモリを制限 (--memory-swap=-1)
スワップの使用を禁止するには、パラメータ --memory-swap
を -1 に設定すればOKだよ。
使用例:
この例では、コンテナ no_swap_container
を512 MBのRAMだけ使用可能で、スワップは一切使わないようにしているんだ。
docker run -d --name no_swap_container --memory="512m" --memory-swap="-1" nginx
6.4 実際のシナリオ
1. 高優先度と低優先度のタスクの実行
1つのサーバーで重要なタスクと二次的なタスクが実行されている場合、--cpu-shares
パラメータを使用して、重要なタスクがより多くの CPU
を受け取るようにリソースを分配できます。
docker run -d --name high_priority_task --cpu-shares=2048 my_high_priority_image
docker run -d --name low_priority_task --cpu-shares=512 my_low_priority_image
2. テスト用のリソース制限
制限されたリソース環境でアプリケーションをテストする場合、CPU
やメモリに厳密な制限を設定できます。これにより、アプリケーションがそのような制限下でどのように動作するかを理解するのに役立ちます。
docker run -d --name test_container --cpus="1" --memory="256m" my_test_image
3. リソースの枯渇防止
1つのコンテナがシステムのすべての利用可能なリソースを使用しないようにするために、すべてのコンテナに対してメモリと CPU
の制限を設定できます。
docker run -d --name isolated_container --cpus="2" --memory="1g" my_app_image
GO TO FULL VERSION