6.1 为啥要限制容器资源
Docker 超棒,管理容器资源起来贼溜,这样可以高效分配系统性能,还能避免容器间的冲突。尤其重要的是,确保一个容器的应用不会“吃光”所有资源,导致别的服务变慢卡顿。限制 CPU 和内存这种资源用量,有助于避免系统过载,保持系统稳定性,并且确保所有应用按预期运行。这节课,我们就聊聊怎么给 CPU 和内存的使用加上限制,让系统在高负载下依然保持高效。
为啥要限制容器资源:
- 稳定性: 防止一个容器抢光资源,导致其他容器或者系统本身变慢卡顿。
- 效率: 在容器之间更好地分配资源,让系统性能用得更高效。
- 保护: 限制资源能避免容器意外或者故意让系统过载出问题。
6.2 限制 CPU
的使用
Docker 提供了一些方法来限制容器对 CPU
的使用。
重要!
这里的 CPU
指的是单个核心,而不是整个处理器。一个四核处理器将有 4 个 CPU
。
1. 限制 CPU (--cpu-shares)
的份额
参数 --cpu-shares
用于为容器设置 CPU 使用的相对优先级。默认值为 1024。这是一个相对值,意思是,设置 --cpu-shares=512
的容器将拥有比 --cpu-shares=1024
的容器少一半的优先级。
使用示例:
在这个例子中,容器 high_priority_container
在分配 CPU
时优先级高于 low_priority_container
。
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.5 个 CPU
。
使用示例:
在此示例中,容器 limited_cpu_container
的 CPU
使用量不会超过 1.5 个。
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 内存使用限制
内存限制可以控制容器可以使用的内存量。这个功能可以帮助避免一个容器占用所有内存,影响其他进程和容器。
1. 最大内存限制 (--memory)
参数 --memory
设置了容器可以使用的内存上限。如果容器超过这个限制,系统会终止它。
使用示例:
这个示例限制容器 limited_memory_container
使用不超过 512 MB 的内存。
docker run -d --name limited_memory_container --memory="512m" nginx
2. 内存交换限制 (--memory-swap)
参数 --memory-swap
设置了总的内存和交换空间的上限。例如,如果 --memory
被设置为 512 MB,而 --memory-swap
被设置为 1 GB,那么容器可以使用最多 512 MB 的内存和额外 512 MB 的交换空间。
使用示例:
这个示例限制容器 swap_limited_container
使用512 MB 的内存和 512 MB 的交换空间。
docker run -d --name swap_limited_container --memory="512m" --memory-swap="1g" nginx
3. 禁用交换空间的内存限制 (--memory-swap=-1)
如果想禁止使用交换空间,把参数 --memory-swap
设置为 -1。
使用示例:
这个示例限制容器 no_swap_container
使用 512 MB 的内存,并禁止使用交换空间。
docker run -d --name no_swap_container --memory="512m" --memory-swap="-1" nginx
6.4 实践场景
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. 防止资源耗尽
为了避免某个容器占用系统所有可用资源,可以为所有容器设置内存和 CPU
限制。
docker run -d --name isolated_container --cpus="2" --memory="1g" my_app_image
GO TO FULL VERSION