解决docker容器因报错无法启动的问题,检查修复容器错误并重启

Posted 呆萌的代Ma

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决docker容器因报错无法启动的问题,检查修复容器错误并重启相关的知识,希望对你有一定的参考价值。

问题复现

使用:

sudo docker ps -a

查看当前的docker容器:

我们想启动name为【docker-mongo】的这个容器,因此要执行

sudo docker start docker-mongo

但是执行后仍旧没有重启,大概率是重启的时候报错了,查看日志:

sudo docker logs -f docker-mongo

可以看到其中有这样的日志:

"t":"$date":"2022-12-29T00:35:32.551+00:00","s":"E",  "c":"NETWORK",  "id":23024,   "ctx":"initandlisten",
"msg":"Failed to unlink socket file",
"attr":
	"path":"/tmp/mongodb-27017.sock",
	"error":"Operation not permitted"
	

查到的解决方法是删除/tmp/mongodb-27017.sock文件即可。但是问题是我们无法启动docker,也无法进入到容器内部,所以就有两种解决方案:

  1. 在不启动容器的情况下,进入到容器的目录中,然后对文件做操作
  2. 在启动容器且不启动应用的情况下,把容器“夯住”,进入容器内部调试

这里我们使用第一种解决方案

解决方法

首先查看docker的这个容器在硬盘上的目录结构

sudo docker inspect docker-mongo

可以找到一段配置项:

"MergedDir": "/var/lib/docker/overlay2/457e851851b8ef6e1b56ebd89aaefab3133e8e1013adc59a98af72e6e5b93a51/merged",
"UpperDir": "/var/lib/docker/overlay2/457e851851b8ef6e1b56ebd89aaefab3133e8e1013adc59a98af72e6e5b93a51/diff",
"WorkDir": "/var/lib/docker/overlay2/457e851851b8ef6e1b56ebd89aaefab3133e8e1013adc59a98af72e6e5b93a51/work"

这便是容器与本地的地址映射(注意这个目录大概率不会与ID类似,即不会包含“32f8a297fb99”这个字段,因此需要手动查看目录与容器ID的对应关系),所以我们进入这个目录:

cd /var/lib/docker/overlay2/457e851851b8ef6e1b56ebd89aaefab3133e8e1013adc59a98af72e6e5b93a51

然后就可以找到与容器内文件相似的目录结构了,比如我想删除碍事的/tmp/mongodb-27017.sock文件,可以使用:

su # 变为管理员权限
cd /var/lib/docker/overlay2/457e851851b8ef6e1b56ebd89aaefab3133e8e1013adc59a98af72e6e5b93a51/diff
rm mongodb-27017.sock
exit # 退出root用户

这里根据自己的情况对文件进行操作,一般是配置错误导致的docker重启失败

然后就可以重启了:

sudo docker start docker-mongo
sudo docker ps


重启成功!

以上是关于解决docker容器因报错无法启动的问题,检查修复容器错误并重启的主要内容,如果未能解决你的问题,请参考以下文章

Docker 启动network报错解决方案

关闭或启动linux防火墙后,docker启动容器报错问题解决方式

Error response from daemon ... no space left on device docker启动容器服务报错

解决Linux docker启动不了的问题

docker 启动 容器----bootstrap checks failed

docker 启动 容器----bootstrap checks failed