# Docker教程 - 6 限制容器资源

容器会占用宿主机的资源,在实际使用过程中,如果占用太多的宿主机,可能导致宿主机卡死宕机。

例如我在容器中部署Jenkins,在使用 Jenkins 构建项目的时候,就出现容器占用资源太多,导致宿主机卡死,无法访问。所以限制容器CPU和内存的使用量,可以确保容器不会过度占用宿主机资源,从而保证系统的稳定性。

# 6.1 限制CPU资源

# 1 限制CPU核心数

使用--cpus参数来限制容器可以使用的CPU核心数。

docker run --cpus 2 my-image

# 或者可以使用=号
docker run --cpus=2 my-image

# 或者可以是小数
docker run --cpus=1.5 my-image

# 或者可以使用引号
docker run --cpus="1.5" my-image
1
2
3
4
5
6
7
8
9
10

如果有4个核,算力加起来是400%,那么 --cpus=2 表示分摊到4个核加起来的算力是200%。

如果你的容器已经运行起来了,可以使用更新命令来动态设置

docker update --cpus=2 my-container
1

下面的参数也一样,可以动态调整。

# 2 限制使用指定的CPU

--cpuset-cpus:指定容器可以使用的具体 CPU 核。

docker run -it --cpuset-cpus="0,2" my-image
1

上面限制容器只能运行在第 1 和第 3 个CPU上。

# 3 设置控制相对的权重

使用--cpu-shares参数来设置容器的CPU份额。注意,这是一个相对值,默认值是 1024。

docker run -it --cpu-shares=512 my-image
1

例如Container A的CPU份额是1024(默认值),设置Container B的CPU份额是512,如果这两个容器同时运行并竞争CPU资源,Container A将获得两倍的CPU时间,因为它的份额是Container B的两倍。

# 4 设置CPU周期和配额

使用 --cpu-period--cpu-quota 参数来设置CPU周期和配额。

docker run --cpu-period 100000 --cpu-quota 50000 my-image
1

在这个例子中,容器的CPU周期被设置为100,000微秒(即0.1秒),而在每个周期内,容器只能使用50,000微秒的CPU时间。

# 6.2 限制内存使用

# 1 设置内存限制

可以使用 -m--memory 标志。

# 限制容器只能使用512MB的内存
docker run -it -m 512m my-image

# 限制容器只能使用2GB的内存
docker run -it -m 2g my-image
1
2
3
4
5

# 2 设置内存和交换空间限制

使用 --memory-swap参数来限制容器的内存加交换空间总量。

docker run -it -m 512m --memory-swap=1g my-image
1

交换空间就是当物理内存不足时,操作系统会将内存数据移到交换空间,交换空间在硬盘上划分出来的,读写速度比内存慢,因为硬盘的速度远低于内存。

  • --memory-swap 的值包含了 -m 的值,即 --memory-swap 限制的是内存和交换空间的总和。

  • 如果设置了 -m 而没有设置 --memory-swap,则 --memory-swap 的默认值是 -m 的两倍,也就是两个空间大小是一样的。

  • 如果将 --memory-swap 设置为与 -m 相同的值,这意味着没有交换空间。容器只能使用物理内存,不能使用交换空间。

  • 如果将 --memory-swap 设置为 -1,这意味着允许容器使用无限的交换空间。

# 3 组合使用

可以组合使用上述限制,例如:

docker run -it --cpus="1.5" --memory="512m" --memory-swap="1g" my-image
1