我有一个以微服务形式运行的应用程序。每个微服务都在单独的 Docker 容器中运行。我正在寻找设置每个容器可以使用的最大允许内存的方法。目前我有 12 个,占用了全部 16GB RAM。有时这会因为延迟而导致在控制台上工作有点困难。
我正在使用类似这样的命令启动容器
docker run -d -p 8093:8080 --env-file ./saturno-environment-files/edge-server.list --name edge-server acisa/edge-server --memory=1g
我在 docker inspect -container- 中看到该命令被正确识别
root@PlatformServer:/sys/fs/cgroup/memory/system.slice# docker inspect edge-server [{ "AppArmorProfile": "", "Args": [ "-Djava.security.egd=file:/dev/./urandom", "-Dspring.profiles.active=${PROFILE_ACTIVE}", "-jar", "/app.jar", "--memory=1g" ], "Config": { "AttachStderr": false, "AttachStdin": false, "AttachStdout": false, "Cmd": [ "--memory=1g" ],
但不幸的是,容器仍然占用了高达 80% 至 95% 的内存。在 docker stats 中,我看到内存限制仍然是 15.68GiB(服务器中的物理 RAM),让我感到好奇的是 MEM USAGE 报告为 0B。
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O edge-server 0.00% 0 B/15.68 GiB 0.00% 13.65 MiB/38.12 MiB
答案1
您在图像名称后传递的所有内容都将成为CMD
容器的值,并且当您定义了入口点时,cmd 将成为入口点末尾的参数。因此,使用您提供的命令:
docker run
:带有运行选项的docker客户端-d
:分离-p 8093:8080
:将容器端口 8080 暴露给主机端口 8093--env-file ./saturno-environment-files/edge-server.list
:使用此文件传递环境变量--name edge-server
:命名容器acisa/edge-server
:首先,这不是一个标志docker run
,这是你的图像名称,并结束参数docker run
--memory=1g
:作为参数传递给图像入口点的 cmd
要修复此问题,您只需重新排序 cli 选项:
docker run -d -p 8093:8080 --env-file ./saturno-environment-files/edge-server.list --name edge-server --memory=1g acisa/edge-server
请注意,内存配额功能可能还依赖于较新的内核,并且您安装的 docker 已经非常过时。