升级服务器网卡,引发VM-Docker-Container无法启动

2025年12月9日

最近给服务器升级了10G网卡,升级后发现一台虚拟机Docker有一个容器起不来了,最开始以为restart container 就可以了,Restart后发现还是起不来。

让AI帮忙分析了原因

  • 换网卡和重启后,系统的 cgroup 版本或配置发生了变化,切换到了 cgroup v2
  • JDK 17.0.2 对 cgroup v2 支持不完善,导致启动时读取 cgroup mount point 出错,抛 NullPointerException,Tomcat 启动失败。
  • 之前可能是用旧内核或 cgroup v1,没触发这个问题。

排查问题

1. 检查当前系统使用的是 cgroup v1 还是 v2

stat -fc %T /sys/fs/cgroup/
  • 返回 cgroup2fs 就是 cgroup v2。
  • 返回 tmpfs 通常是 cgroup v1。

2. 查看 Docker 版本及默认 cgroup 配置

docker info | grep -i cgroup

确认 Docker 运行时是否使用 cgroup v2。

可以看到,系统的 cgroup 版本 和 Docker 运行使用的都是 cgroup v2,大概找到原因了。

解决方案

方法有很多哈,比如升级JDK版本,删除容器重新部署,修改启动脚本等,我这里写两种方式怎么解决。

方法1. 删除旧容器,使用带参数的命令启动

删除旧容器

dockers rm <container>

带参数命令

docker run -d --name <container>-p 8090:8090 \
  -e JAVA_OPTS="-XX:+UseContainerSupport=false" \
  --network <container>-network \
  <container>:<version>

方法2. 修改启动脚本

现在容器没进入"running" 状态, docker exec 命令运行不了。

这里我们先把文件拷出来,修改后再拷回容器,最后重启容器即可,步骤如下:

1. 先用 docker cp 把文件拷出来

docker cp <container>:/opt/<container>/bin/setenv.sh ./setenv.sh

2. 本地修改setenv.sh

CATALINA_OPTS 变量末尾加上,注意要加空格和加号

 -XX:+UseContainerSupport=false

3. 把修改好的文件拷回容器

docker cp ./setenv.sh <container>:/opt/<container>/bin/setenv.sh

4. 重启容器

docker restart <container>

5. 查看状态

docker ps -a

不得不说现在AI真的挺方便,更考验一个人的提问方式。

好问题才会有好答案!

KubernetesDocker,Server

Posted by Thomas