挂载NTFS分区导致Docker容器无法启动,Exited (137)错误

本文详细记录了解决Docker容器因挂载NTFS分区启动时出现Exited (137)错误的过程。问题根源在于Docker存储目录位于NTFS分区,解决方案包括将分区格式化为ext4,修改挂载点,设置Docker默认存储目录等步骤。

【过程】
已经建立的容器却怎么也不能启动,用docker ps -a才能查到,STATUS显示Exited (137)。
而且不是一个容器如此,建立多个都是Exited (137)错误,无一幸免。
~$ docker inspect ba9c737aa0b7
显示:
 "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 137,

于是,根据这个错误去网上搜索“Exited (137)”,大概也就是说内存设置不对等等造成。给容器指定内存再做一遍,也是如此,几乎是一开启容器就被秒关。
后来又想到会不会是因为Docker版本太新,下载的镜像有问题。接下来,下载旧版本镜像,不同镜像试了也不行,然后卸载Docker,又安装了旧版本Docker,问题依旧没解决。
然后,怀疑是修改了Docker存储默认目录,于是又用目录挂载的方法mount --bind /media/Dpan/docker /var/lib/docker,问题依旧没解决。
难不成要把镜像容器全都堆到ubuntu的根分区里?这时候,灵感来了,会不会是因为/media/Dpan挂载的是一个ntfs格式的分区。那就简单了,先设置回/var/lib/docker,试一下ext4分区下有没有这个问题,结果一试,问题消失。终于找到了问题的症结,那就是ntfs分区造成的。具体原因是什么,不清楚,但解决方法就有了。

【原因】

Docker存储默认目录设置到一个NTFS分区造成容器在启动过程中出现问题,立即停止。

【解决方法】

1、把原来的ntfs分区重新格式化为ext4分区,我用的是Gparted这个桌面磁盘分区软件。

~$ sudo nano /etc/fstab
然后把所有挂载的ntfs分区前面打上#屏蔽掉,比如 # /dev/sda5 /media/Dpan ntfs defaults 0 0
(注意是所有的ntfs分区),保存退出
~$ sudo mount -a
没有显示,就是正常
~$ sudo reboot
重启系统

进入桌面后打开Gparted,找到准备用来存储Docker的分区,右键,分区格式化为ext4,点击绿色“√”按钮运行,完毕后退出。

2、设置新的挂载,我把分区挂载到/home/data

~$ sudo mkdir /home/data

再回去修改/etc/fstab文件
~$ sudo blkid
查出分区的uuid,比如
/dev/sda5: UUID="77ae9efc-8644-4381-a415-50641bc6af80" TYPE="ext4" PARTUUID="713f8fc2-05"

~$ sudo nano /etc/fstab
添加:
UUID=77ae9efc-8644-4381-a415-50641bc6af80 /home/data  ext4  defaults 0 0
再把其他ntfs分区前面的#去掉

保存退出,reboot重启

3、设置Docker存储默认目录

创建目录
~$ sudo mkdir /home/data/docker

修改配置文件
~$ sudo nano /usr/lib/systemd/system/docker.service

找到  ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock,这一行后面添加  “--graph 新的目录完整路径”
也就是修改为:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --graph /home/data/docker

保存退出,重启docker服务使配置生效
~$ sudo systemctl daemon-reload
~$ sudo systemctl restart docker.service

测试一下
$ docker info | grep "Docker Root Dir"

4、删除原来的存储目录(需要的话)

~$ sudo rm -rf /var/lib/docker

5、拉个镜像,跑个容器试试,我用nginx

$ docker pull nginx
$ docker images
$ docker run --name nginx-test -p 8080:80 -d nginx
$ docker ps
此时STATUS显示Up 8 seconds,不再是Exited。去浏览器输入主机ip:8080,进入nginx欢迎页面。
$ docker stop nginx-test
$ docker ps -a
$ docker start nginx-test
$ docker ps
停掉容器,再开容器,还是OK,问题到此解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值