侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 352 篇文章
  • 累计创建 135 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

docker overlay2文件缺失导致docker服务无法启动的解决方案

孔子说JAVA
2022-09-28 / 0 评论 / 0 点赞 / 203 阅读 / 2,414 字 / 正在检测是否收录...
广告 广告

公司机房停电后,发现docker容器启动不起来了,报错如下:Error response from daemon: Cannot restart container redis: error creating overlay mount to /var/lib/docker/overlay2/5ae9f9cd84696280d193923f9cde8ab6ddcd99d9bb56df633177c5326af1ebcf/merged: invalid argument。此情况可通过命令 docker system prune -a 来解决。

1、问题

公司机房停电,等恢复供电后发现docker容器启动不起来了,报错信息如下:

root@xnzysq20210118001:/# docker restart container_redis6.2.6 
Error response from daemon: Cannot restart container container_redis6.2.6: mkdir /var/lib/docker/overlay2/cb2466ef3d5aac7897ce777aa2a7a0acf

另外如果我们手动删除了 /var/lib/docker/overlay2 下的文件,也会导致重新启动容器失败(会有类似的错误)。

2、解决办法

解决办法主要是使用命令 docker system prune 清理没有使用的数据,然后再重建容器。

2.1 docker system prune命令介绍

该步骤是对 docker system prune 命令的介绍,可以跳过此步骤,直接看第二步。

使用命令 docker system prune 清理没有使用的数据,包括镜像数据,已经停止的容器等。

[root@localhost ~]# docker system prune
WARNING! This will remove:
        - all stopped containers # 清理停止的容器
        - all networks not used by at least one container #清理没有使用的网络
        - all dangling images #清理废弃的镜像
        - all build cache #清理构建缓存
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

更进一步,使用-a选项可以做深度清理。使用命令 docker system prune -a

$ docker system prune -a
WARNING! This will remove:
        - all stopped containers
        - all volumes not used by at least one container
        - all networks not used by at least one container
        - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: test:latest
deleted: sha256:c515ebfa2...
deleted: sha256:07302c011...
deleted: sha256:37c0c6474...
deleted: sha256:5cc2b6bc4...
deleted: sha256:b283b9c35...
deleted: sha256:8a8b9bd8b...
untagged: alpine:latest
untagged: alpine@sha256:58e1a1bb75db1...
deleted: sha256:4a415e366...
deleted: sha256:23b9c7b43...
Total reclaimed space: 2.151GB

这个命令将清理整个系统,并且只会保留真正在使用的镜像,容器,数据卷以及网络,因此需要格外谨慎。比如,我们不能在生产环境中运行prune -a命令,因为一些备用镜像(用于备份,回滚等)有时候需要用到,如果这些镜像被删除了,则运行容器时需要重新下载。

此时,所有未绑定容器的镜像将会被删除。由于第一次prune命令删除了所有容器,因此所有镜像(它们没有绑定任何容器)都会被删除。执行完上述命令后,我们可以使用 docker psdocker images 查看,可以看到容器和镜像都被清空了。

image-1664269096766

2.2 清理docker无效数据

本文中我们直接使用命令 docker system prune -a

image-1664268858991

执行完上述命令后,我们可以使用 docker ps查看,可以看到还有1个容器在运行,这是因为该容器是一个有效的,正在运行的容器,使用该命令不会删除掉。

image-1664269772554

2.3 重启docker

使用下述命令重启docker,如果不重启可能还是会报错。

systemctl  restart  docker

2.4 重新创建容器

经过上述处理后,我们就可以正常使用docker了。如下所示,我们重新创建了一个redis容器。

docker run -it -p 6379:6379  \
--name redis6-1 \
--privileged=true \
--restart=always \
-v /usr/local/docker/redis/redis6-1/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/docker/redis/redis6-1/data:/data \
-v /etc/localtime:/etc/localtime \
-e TZ="Asia/Shanghai" \
-d redis:6.2.6 redis-server /etc/redis/redis.conf

image-1664270080456

可以看到容器已经创建成功。

image-1664270227338

进入docker容器,设置和获取值的测试都没问题,之后退出容器。

另外:在连接redis的时候,密码可以通过auth命令单独指定。

image-1664270475978

0

评论区