本文已参与「新人创作礼」活动,一起开启掘金创作之路。
背景
国庆假期回来,照例将几台内网服务器重启,其中一台服务器的docker服务却怎么都启动不起来。
根据报错提示中journalctl -xe命令查看细节日志,发现docker服务初始化失败。
常见解决方案
在网上查询了一些方法,主要有以下两种:
1.umask更改docker权限
systemctl unmask docker.service
systemctl unmask docker.socket
systemctl start docker.service
2.创建daemon.json文件
vi /etc/docker/daemon.json # 编辑此文件,并插入内容{}
问题排查与解决
试了一下,第一种方式不行,第二种因为我本地本身就有此文件,所以无需尝试。
但是在查看daemon.json文件时,其中有一项配置"graph": "/home/docker_home"给了我启发,因为我曾经更改过docker的主目录,于是查看/home下的docker_home目录:
发现并无此目录,/home下只有区区两三个目录,这显然不对。这才想起这台服务器一直挂载了一块磁盘,就挂载在/home下,于是通过“df -h”命令发现/home目录只有53G,该磁盘并未挂载在下面。
问题原因:存有docker相关文件目录的磁盘未挂载
查看磁盘挂载情况:
fdsik -l # 查看磁盘挂载情况
找到了该块磁盘/dev/sdb
解决方案:挂载指定磁盘到指定目录
挂载磁盘:
mount /dev/sdb /home # 将磁盘/dev/sdb挂载到/home目录下
再次查看/home目录,原来的docker_home目录已恢复:
重启docker服务:
systemctl start docker
systemctl status docker
docker服务已恢复正常:
小结
此次docker初始化失败问题的原因是由于我更改过docker的主目录,而docker的主目录存放于某个磁盘中,该磁盘未挂载,所以找不到docker相关目录文件所致。挂载磁盘、重启docker后恢复正常。 总结一下排查思路:
- 查看docker home目录是否正常,比如是否更改过目录、目录是否存在挂载
- 查看防火墙状态,有时候防火墙打开也会影响docker的启动,可以先关闭docker
至于为什么更改docker主目录,是因为docker安装完成后,默认存储路径为/var/lib/docker。创建容器后,每个容器的数据卷容量上限与/var/lib/docker所在的挂载的磁盘大小有关。例如下图所示:挂载的磁盘大小为50GB,则docker容器数据卷上限就是50GB,如果有多个容器,则这些容器共享50GB的容量,而且同时也与挂载磁盘下的其他目录共享使用。那么如果运行的容器数量较多,或是遇到需要存储大量数据如gitlab这类容器,50G显然就有些捉襟见肘。此时可以通过修改docker存储路径的方式扩容容器的容量上限。特别提一句,docker存储路径最好尽早修改,这样可以避免后期因磁盘写满导致的各种容器运行异常问题。