Docker限制各容器内存设置


在使用 Docker 容器运行应用时,我们常常需要控制容器所使用的内存,防止单个容器占用过多资源而影响其他服务的运行。本文将介绍如何通过命令行和 Docker Compose 文件来设置内存限制

1. 为什么需要设置内存限制?

Docker 容器默认不限制内存使用。如果某个容器出现内存泄漏或需要大量内存(如alist有时候播放夸克盘资源会占用特别大的内存),会导致宿主机资源耗尽,从而影响系统稳定性。通过设置内存限制,可以:

  • 控制容器最大可用内存,避免意外占用太多系统资源。
  • 提高系统整体的资源管理和调度能力。

2. 如何确认容器需要多少内存

运行docker stats可以查看现有容器资源占用情况,持续观察待容器稳定运行后,再预留个20%-30%即可

3. 使用 docker run 命令设置内存限制

在运行容器时,可以通过 -m--memory 参数设置容器的内存上限。--memory-reservation 参数设置内存的软性预留(也称为“保底内存”),表示在系统资源紧张时,这个容器至少能分配到的内存。

1
docker run -d -m 512m --memory-reservation 256m your_image

4. 设置Swap限制

除了限制物理内存外,还可以通过 --memory-swap 参数设置容器可使用的 swap 内存大小。这个参数决定了容器最多可以使用多少内存(物理内存 + swap)。

例如,下面的命令将容器物理内存限制设置为 256MB,同时允许最多使用 512MB(包括 256MB 的 swap):

1
docker run -d -m 256m --memory-swap 512m your_image

注意:

  • --memory-swap 的值必须大于或等于 -m 设置的内存大小。
  • 如果希望禁用 swap,可以将 --memory-swap 的值设置与 -m 相同,例如:
    1
    docker run -m 256m --memory-swap 256m your_image
  • 有些操作系统,如openwrt不支持限制swap,可通过docker info | grep -i swap查看,如果看到 “WARNING: No swap limit support” 的提示,则说明 swap 限制未启用

5. 在 Docker Compose 中设置内存限制

1
2
3
4
5
6
7
8
9
10
11
version: "3"
services:
myservice:
image: your_image
deploy:
resources:
limits:
memory: 512M # 物理内存上限
memory_swap: 1G # 内存+Swap 总量
reservations:
memory: 256M # 预留最低物理内存大小

6. 总结

通过设置内存限制,可以有效防止 Docker 容器因内存使用过高而影响宿主机及其他服务的运行。无论是使用 docker run 命令还是 Docker Compose 文件,都可以方便地对容器的内存使用进行管理。希望这篇简单的指南能帮助你在实际项目中合理配置 Docker 资源,提升系统的稳定性和性能。

7.延伸阅读

官方文档