sudo docker run --name seckill0 -p 8080:8080 -m 1024M --cpus=0.2 -d seckill:v0
sudo docker run --name seckill1 -p 8081:8080 -m 1024M --cpus=0.2 -d seckill:v0
sudo docker run --name seckill2 -p 8082:8080 -m 1024M --cpus=0.2 -d seckill:v0
  • -m:限制内存使用为1G
  • --cpus:限制CPU使用的百分比

 

5、查看docker中容器占用宿主内存、CPU情况

docker stats

 

以下观点来自知乎

如果仅从占用计算资源、内存资源和存储资源的数量上考量,同一个服务以 docker 容器运行所占用的资源肯定多于在裸宿主机运行所占用的资源。但当服务变成分布式的时候,相同的一组服务在docker 容器上运行所占用的资源会显著少于裸宿主机运行时所占用的资源。

产生这一反认知现象的原因,是现在编写容器内运行服务的时候会对服务本身在设计时进行充分解耦,并大量采用无状态机设计,重构后的应用在容器环境中,能更充分的利用多核CPU的性能。

按照我在几个项目中的实验结果,在裸宿主机上采用多进程方式运行同一应用,当同时运行的进程达到内核的2.3倍左右就会出现服务响应延迟的现象,但采用容器化运行时,相同的应用封装在容器中,能够在3.4倍以下的配比稳定运行,且各应用没有响应延迟的现象。

在资源总量恒定的前提下,容器化后的应用相较于裸宿主机运行的更多,单个服务所占用的资源更少。


不少反而会多。在docker中运行还多了docker占用的资源。虽然docker是轻量级容器,但相比宿主还是多用了些许资源。那为什么还要用docker呢?

1. 方便快速扩展,例如一个web服务当访问量增加时候,只需要复制一个容器并且添加负载均衡即可,相比单机配置要快得多。

2. 方便快速开发,当一个服务依赖较多配置繁复时候,docker可以配置快速配置一个相同的环境,方便快速开发。



 

以下来自 CSDN 观点:

如何docker容器分配内存和cpu?默认情况下,容器使用的资源是不受限制的。也就是可以使用主机内核调度器所允许的最大资源。但是在容器的使用过程中,经常需要对容器可以使用的主机资源进行限制,下面我们来介绍下。

容器CPU设置

默认设置下,所有容器可以平等地使用主机 CPU 资源并且没有限制。docker�0�2可以通过-c或–cpu-shares设置容器使用 CPU 的权重。如果不指定,默认值为 1024。

与内存限额不同,通过-c设置的 cpu share 并不是 CPU 资源的绝对数量,而是一相对的权重值。某容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例。通过 cpu share 可以设置容器使用 CPU 的优先级。

比如在 host 中启动了两容器

docker run --name "container_A" -c 1024 ubuntu
docker run --name "container_B" -c 512 ubuntu

container_A 的 cpu share 1024,是 container_B 的两倍。当两容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。

需要注意的是,这种按权重分配 CPU只会发生在 CPU资源紧张的情况下。如果 container_A 处于空闲状态,为了充分利用 CPU资源,container_B 也可以分配到全部可用的 CPU

容器内存限额

与操作系统类似,容器可使用的内存包括两部分:物理内存和 swap。 Docker 通过下面两组参数来控制容器内存的使用量。

-m 或 –memory:设置内存的使用限额,例如 100M, 2G。

–memory-swap:设置 内存+swap 的使用限额。

当我们执行如下命令:

docker run -m 200M --memory-swap=300M ubuntu

其含义是允许该容器使用 200M 的内存和 100M 的 swap。默认情况下,上面两组参数为 -1,即对容器内存和 swap 的使用没有限制。

下面我们使用 progrium/stress 镜像来为容器分配内存。该镜像可用于对容器执行压力测试。执行如下命令:

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

–vm 1:启动 1 内存工作线程。

–vm-bytes 280M:每线程分配 280M 内存。

如果让工作线程分配的内存超过 300M,分配的内存超过限额,stress 线程报错,容器退出。

如果在启动容器时只指定 -m 而不指定 –memory-swap,那么 –memory-swap 默认为 -m 的两倍,比如:

docker run -it -m 200M ubuntu

容器使用 200M 物理内存和 200M swap。