写在前面
一台服务器使用docker容器
长时间运行会产生很多文件(不完全是日志或文件垃圾,运行数据永远是增量的)导致磁盘写满,最终导致容器不可用。
不考虑增加硬盘缓解问题,可以参考 清理docker磁盘占用。
下面我要介绍的是给liunx系统
增加磁盘并增加docker
的磁盘使用空间。
一、思路
- 给
liunx系统
挂一块盘,并且初始化分区 - 设置
liunx系统
将此分区挂载到文件夹,并且开机自动挂载 - 移动
/var/lib/docker
到新的分区(这里也可以考虑docker
数据盘模式)
二、在liunx
上挂载磁盘并初始化分区
注意:以下是分区操作的详细步骤,对每一步操作进行了截图和说明。
-
执行
fdisk -l
,查看新增数据盘- 这里显示了
2
块磁盘,一块是40G
,一块是200G
Disk
表示磁盘,Device
表示挂载信息。(我这里是2块磁盘都挂载好了)磁盘没有挂载的时候只会显示对应的Disk
,不会显示对应的Device
-
执行
fdisk /dev/vdb
,对磁盘进行分区(我这里忘记截图了,拿其他教程的相同步骤替代)- 输入
n
,按Enter键
,开始新建分区
- 磁盘有两种分区类型
p
表示主分区e
表示扩展分区- 磁盘使用
MBR分区
形式,最多可以创建4
个主分区
,或者3
个主分区
加1
个扩展分区
,扩展分区
不可以直接使用,需要划分成若干个逻辑分区
才可以使用。磁盘使用GPT分区
形式时,没有主分区
、扩展分区
以及逻辑分区
之分
- 磁盘有两种分区类型
- 输入
p
,按Enter键
,开始创建一个主分区
Partition number
表示主分区
编号,可以选择1-4
。
- 输入
主分区
编号1
,按Enter键
First sector
表示起始磁柱值
,可以选择2048-209715199
,默认为2048
- 使用默认
起始磁柱值
2048
即可,直接按Enter键
Last sector
表示截止磁柱值
,可以选择2048-209715199
,默认为209715199
;这里可以通过减小
这个截止磁柱值
来设置一部分的磁盘空间作为一个分区,但起始磁柱值
必须小于分区的截止磁柱值
- 使用默认
截止磁柱值
209715199
即可,直接按Enter键
。 - 输入
p
,按Enter键
,查看新建分区
的详细信息 - 请记下这个
Device Boot
值,非常关键,后面都要用的
- 请记下这个
- 输入
w
,按Enter键
,将分区结果写入分区
表中 - 如果之前进行了误操作,在这里输入
q
可以退出fdisk分区工具
,之前的分区结果也不会被保留
- 如果之前进行了误操作,在这里输入
到这里分区完成 , 但是现在通过df -TH
命令还看不到这个分区
三、设置将此分区挂载到文件夹,并且开机自动挂载
- 执行
partprobe
,将新的分区表变更同步至操作系统 - 执行
mkfs -t ext4 /dev/vdb1
,将新建分区文件系统设为系统所需格式 - 我该用什么文件系统:查看当前磁盘的分区
cat /etc/fstab
,可以看到有个UUID
的信息,磁盘是ext4
,这是当前正在使用的主磁盘,保持一致即可。 - 我忘了分区在哪里:就是上面记下的
Device Boot
信息。万一没记,执行fdisk -l
,可以看到多个Disk
,下面没有Device
的就是你要操作的磁盘。后面的数字就是你之前输入的主分区
编号,不出意外应该是/dev/vdb1
- 我该用什么文件系统:查看当前磁盘的分区
- 执行
mkdir /mnt/sdc
,新建挂载目录- 如果应为磁盘空间满了新建不了,请删除一些日志文件(比如/var/log文件夹)再重启服务器后再来执行新建挂载目录
- 这个
/mnt
目录最好固定,后面的sdc
可以自己更换其他名字,建议不要用中文或者特殊符号,不然出现奇怪问题自己整哈
- 执行
mount /dev/vdb1 /mnt/sdc
,将新建分区挂载到新建的目录下 - 执行
df -TH
,查看挂载结果
到这里已经可以看到挂载的磁盘了,并且可以正常使用,但是每次开机都要手动执行mount /dev/vdb1 /mnt/sdc
,下面开始设置自动挂载
- 执行
blkid /dev/vdb1
,查询磁盘分区的UUID
- 执行
echo "UUID=beacc427-80f0-4503-a845-26efbe67f98d /mnt/sdc ext4 defaults 0 2" >> /etc/fstab
- 第一列:就是上一步的
UUID
值 - 第二列:是挂载的文件夹
- 第三列:是文件系统格式
- 第四列:是磁盘分区的挂载选项,此处通常设置为
defaults
即可 - 第五列:为
Linux dump
备份选项。- 值
0
表示不使用Linux dump
备份。现在通常不使用dump
备份。 - 值
1
表示使用Linux dump
备份。
- 值
- 第六列:为
fsck
选项,即开机时是否使用fsck
检查磁盘。- 值
0
表示不检验。 - 挂载点为
/
根目录的分区,此处必须填写1
。根分区设置为1
,其他分区只能从2
开始,系统会按照数字从小到大依次检查下去
- 值
- 第一列:就是上一步的
- 验证自动挂载是否成功
- 执行
umount /dev/vdb1
,卸载已挂载的分区 - 执行
mount -a
,将/etc/fstab
文件所有内容重新加载 - 执行
mount | grep /mnt/sdc
,查询文件系统挂载信息
- 执行
到这里已经完成了自动挂载分区,接下来把这个分区分配给docker
使用
四、将docker
搬迁到新的分区中
我这里使用的是docker
文件搬迁,即将原来系统盘中的docker
搬迁到新的大磁盘上,对docker
现有容器无影响。另外一种使用docker
数据盘模式也是可行的,但是我没有实际试过。
- 开始搬迁
docker
文件 - 执行
systemctl stop docker
,停止docker
服务 - 执行
mv /var/lib/docker /mnt/sdc
,移动docker
文件到新的挂载文件夹 - 执行
ln -s /mnt/sdc/docker/ /var/lib/
,创建软链指向新的docker
目录 (如果执行不了ln -s
改为ln -sf
) - 向
/etc/docker/daemon.json
文件中增加属性"data-root":"/mnt/sdc/docker"
- 执行
systemctl start docker
,启动docker
服务
评论区