升级服务器网卡,引发VM-Docker-Container无法启动
最近给服务器升级了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.sh2. 本地修改setenv.sh
在 CATALINA_OPTS 变量末尾加上,注意要加空格和加号
-XX:+UseContainerSupport=false3. 把修改好的文件拷回容器
docker cp ./setenv.sh <container>:/opt/<container>/bin/setenv.sh4. 重启容器
docker restart <container>5. 查看状态
docker ps -a不得不说现在AI真的挺方便,更考验一个人的提问方式。
好问题才会有好答案!










Discussion
New Comments
暂无评论。 成为第一个!