【过程】
已经建立的容器却怎么也不能启动,用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,问题到此解决。

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

被折叠的 条评论
为什么被折叠?



