血莲丹 2024-09-26 13:49 采纳率: 20%
浏览 3

虚拟机中启动容器提示资源不足

问题:
在虚拟机中启动容器提示资源不足。

描述:
我是 win7 系统,没法安装 Docker Desktop,因此我安装了 dockertoolbox 来跑 docker engine。我将一个简单的 SpringBoot 应用构建成镜像,
DockerFIle 如下:

FROM 192.168.83.113:5000/eclipse-temurin:8-jre

LABEL author="xueliandan0123@gmail.com"

ARG JAR_FILE

RUN echo $(pwd)

ADD ./target/${JAR_FILE} /app.jar

ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms64m -Xmx64m -Xss512k"

EXPOSE 8080

#CMD java ${JAVA_OPTS} -Djava.security.egd-file:/dev/./urandom -jar app.jar
CMD java ${JAVA_OPTS}  -jar app.jar

然后我本地 docker run 一个容器,命令如下

docker run -d -p 8080:8080 --name boot_demo --memory=512m 192.168.83.113:5000/xld/boot_demo:1.0

容器启动后就秒退,报错如下:
docker@default:~$ docker logs 436
Error occurred during initialization of VM
Cannot create VM thread. Out of system resources.

尝试的方法:
我试着将 virtual box 创建的虚拟机的内存调到了 2G,但是启动容器还是说资源不足。
我又试着修改了构建命令的 JAVA_OPTS,将堆内存调小,还是说内存不足。
我也切换到了 root 用户去执行 run 命令,还是不行。
我也试着在 run 时,带上一些限制参数
docker run -d -p 8080:8080 --memory=512m --cpus=1 --ulimit nproc=4096 --ulimit nofile=4096 192.168.83.113:5000/xld/boot_demo:1.0
但是也不行。

环境:
操作系统:win7
docker 版本:

docker@default:~$ docker info
Client:
 Debug Mode: false

Server:
 Containers: 1
  Running: 0
  Paused: 0
  Stopped: 1
 Images: 8
 Server Version: 19.03.12
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.19.130-boot2docker
 Operating System: Boot2Docker 19.03.12 (TCL 10.1)
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 1.947GiB
 Name: default
 ID: G5B7:RY7S:OLM4:RMIA:THCC:ZZOO:GMN7:NXJZ:BLAV:QM3H:LYRF:H5NY
 Docker Root Dir: /mnt/sda1/var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
  provider=virtualbox
 Experimental: false
 Insecure Registries:
  192.168.83.113:5000
  192.168.83.113:5001
  127.0.0.0/8
 Live Restore Enabled: false
 Product License: Community Engine

还请友友不吝赐教,非常感谢!

  • 写回答

1条回答 默认 最新

  • 码踏云端 Java领域新星创作者 2024-09-27 20:08
    关注

    以下内容源自超时代AI智能助手,仅供参考,可行性需要自行评估。

    1. 问题分析
      • 虚拟机资源分配与容器需求的矛盾
        • 虽然将虚拟机内存调整到2G,但容器仍然提示资源不足。这可能是因为虚拟机中的资源分配不仅仅取决于内存总量,还与其他因素有关。例如,在Linux内核(虚拟机运行的是Boot2Docker,其内核为4.19.130 - boot2docker)中,存在对进程数量、文件描述符数量、虚拟内存等多种资源的限制。
      • Java虚拟机(JVM)相关问题
        • 尽管调整了JAVA_OPTS中的堆内存大小,但仍然出现资源不足的情况。这可能是因为JVM除了堆内存之外,还需要其他资源,如线程栈空间(由-Xss参数控制)、元空间(在Java 8中,虽然通过-Xms-Xmx调整了堆内存,但元空间也可能出现问题)等。而且,Error occurred during initialization of VM. Cannot create VM thread. Out of system resources.这个错误提示表明,可能是创建JVM线程时缺乏足够的系统资源,这可能与操作系统层面的资源限制有关。
      • Docker容器资源限制与实际需求不匹配
        • 尽管在docker run命令中设置了--memory=512m--cpus = 1--ulimit nproc = 4096--ulimit nofile = 4096等限制参数,但容器仍然无法正常启动。这可能是因为这些参数的设置没有准确匹配容器的实际资源需求,或者是因为虚拟机本身的资源限制导致无法满足容器的最低资源要求。
    2. 解决方案建议
      • 检查和调整虚拟机的其他资源限制
        • 进程数量限制(nproc
          • 在虚拟机的Linux系统中,可以通过ulimit -a命令查看当前的资源限制情况。如果nproc(最大进程数量)限制过低,可能会导致JVM无法创建足够的线程。可以尝试在/etc/security/limits.conf文件中增加* soft nproc* hard nproc的值(例如,将其设置为更高的值,如65535,但要注意不要设置过高以免影响系统稳定性)。修改后,需要重新启动虚拟机以使设置生效。
        • 文件描述符数量限制(nofile
          • 同样通过ulimit -a查看nofile(最大打开文件数量)的限制。如果这个值过低,可能会影响容器的运行。可以在/etc/security/limits.conf文件中增加* soft nofile* hard nofile的值(例如,将其设置为65535或者更高,具体取决于应用的需求),然后重新启动虚拟机。
      • 进一步优化Java虚拟机参数
        • 元空间(Metaspace)调整
          • 在Java 8中,元空间用于存储类的元数据。如果元空间不足,也可能导致JVM启动失败。可以尝试在JAVA_OPTS中添加-XX:MetaspaceSize-XX:MaxMetaspaceSize参数来调整元空间的大小。例如,可以设置-XX:MetaspaceSize = 64m -XX:MaxMetaspaceSize = 128m,根据实际情况调整这两个值。
        • 线程栈空间调整
          • 虽然已经设置了-Xss512k,但可以尝试进一步调整这个值。如果线程栈空间设置过大,可能会导致在有限的内存资源下无法创建足够的线程。可以适当减小这个值,如设置为-Xss256k,但要注意避免栈溢出错误。
      • 检查Docker容器资源限制与实际需求的匹配度
        • 内存限制重新评估
          • 重新评估容器所需的内存量。虽然设置了--memory = 512m,但可能这个值仍然不足以满足容器的实际需求。可以尝试逐步增加这个值,同时密切关注虚拟机的整体资源使用情况,以找到一个既能满足容器运行又不会导致虚拟机资源耗尽的平衡点。
        • CPU限制重新评估
          • 对于--cpus = 1的设置,检查容器中的应用是否对CPU有更高的要求。如果应用是CPU密集型的,可以适当增加这个值,但要注意不要过度分配CPU资源,以免影响虚拟机中其他容器或进程的运行。
    评论

报告相同问题?

问题事件

  • 创建了问题 9月26日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?