最近在项目里面, 发现了一个问题, 就是当初为了快速搭建Gitlab ,使用的是Docker 方案, Docker 默认的安装路径,其实是存放在系统盘里面的, 默认的系统盘空间仅仅是40G。随着Gitlab 在公司的使用人数和使用频率不断增加,Docker 占用的空间最终超过35G, 把系统盘的空间吃没了, out of diskspace。。。反映到程序员们, 问题就是Git 不能用了, 提交不了代码, 连接不上数据库了!
检查问题, 主要是空间不够了, 但是当认真检查硬盘设置的时候, 发现在阿里云的设置里面, 其实是是有两块硬盘的, 1块是vda1, 40G, 另外一块是vdb, 之前申请的时候是120G, 但是没有投入使用!! 主要是没有挂载到目录中, 空闲了~~~
解决方案是:
1. 挂载/dev/vdb存储到硬盘目录中, 当前设置为/mnt
2. 把docker目录从系统盘挂载到数据盘
主要分为下面几个步骤:
(1)首先先停止 Docker daemon,保证移动的时候数据完整,执行 service docker stop 命令停止 Docker daemon。
具体命令:
sudo systemctl stop docker
检查docker 状态, 确保已经停用:
sudo systemctl status docker
通过ps 命令进一步检查:
ps faux | grep -i docker
确保Docker 进程不再运行之后, 进行下一步操作。
(2)先将 Docker 默认数据目录下的数据移动到一个备份的目录,例如 /mnt/Docker_data,执行命令:
mv /var/lib/docker /mnt/Docker_data
或者使用rsync命令:
rsync -avxP /var/lib/docker/ /mnt/Docker_Data/docker
(3) 这一步里面, 就需要把Docker运行在新的数据盘里面, 这里有一篇可供参考的文章:秋刀鱼亦会过期 (https://blog.csdn.net/u014069688/article/details/102601088), 那里面的方法是, 直接把数据盘挂在Docker 目录下:
然后把新的格式化好的磁盘挂载到 /var/lib/docker 目录,执行命令 echo "/dev/vdb1 /var/lib/docker ext4 defaults 0 0" >>/etc/fstab && mkdir /var/lib/docker && mount -a。
这里我其实不太乐意这么做的, 因为这是把一个数据盘完全分配给Docker 了, 在我的服务器上, 就是相当于把一块120G硬盘, 都这么用了, 这有点可惜, 所以采用另外的方式, 就是把Docker 的工作目录切换到/mnt/Docker_data/docker
这涉及到更改Docker 服务的service 文件。
命令如下:
sudo vi /lib/systemd/system/docker.service
找到这一行:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
改成这样:
ExecStart=/usr/bin/dockerd -g /mnt/Docker_data/docker -H fd:// --containerd=/run/containerd/containerd.sock
最终的结果:
然后重新刷新Docker 服务:
sudo systemctl daemon-reload
这时候, 就可以启动Docker 服务了:
systemctl start docker
这时候, 使用systemctl status docker, 就能查看到dockerd的目录发生变化了:
另外一种验证方案, 就是查看某一个Docker 镜像的工作目录:
docker inspect image_id | grep WorkDir
这里就不贴图了,总之, 经过这么做之后, Docker 的工作目录成功更换到数据盘了, 搞定!