# 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
2
3
4
5
6
7
8
9
10
如果有4个核,算力加起来是400%,那么 --cpus=2
表示分摊到4个核加起来的算力是200%。
如果你的容器已经运行起来了,可以使用更新命令来动态设置:
docker update --cpus=2 my-container
下面的参数也一样,可以动态调整。
# 2 限制使用指定的CPU
--cpuset-cpus
:指定容器可以使用的具体 CPU 核。
docker run -it --cpuset-cpus="0,2" my-image
上面限制容器只能运行在第 1 和第 3 个CPU上。
# 3 设置控制相对的权重
使用--cpu-shares
参数来设置容器的CPU份额。注意,这是一个相对值,默认值是 1024。
docker run -it --cpu-shares=512 my-image
例如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
在这个例子中,容器的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
2
3
4
5
# 2 设置内存和交换空间限制
使用 --memory-swap
参数来限制容器的内存加交换空间总量。
docker run -it -m 512m --memory-swap=1g my-image
交换空间就是当物理内存不足时,操作系统会将内存数据移到交换空间,交换空间在硬盘上划分出来的,读写速度比内存慢,因为硬盘的速度远低于内存。
--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