曾几何时 Docker 就流行起来了,容器技术的风头盖过了各种虚拟机,如果一个后端开发者说不懂 Docker 出去都不好意思。但是 Windows 下 Docker 的支持并不是很友好,MacOS 下还需要包一层 alpine 容器,所以要达到与生产环境一致个人认为在这两个平台下,Vagrant + Docker 的组合应该是最佳实践。由于一开始制作 Vagrant Box 镜像的时候,遵循镜像规范主硬盘都不会设置的很大,比如 centos-x64 的主硬盘大小有 10G 算上系统占用等,实际使用量只有 7G+ ,如果还要在里面玩 Docker 有时候就显得空间不是很够。下面将给出两种方案,让硬盘扩容。

直接扩容

虚拟机主硬盘扩容

首先需要 vagrant halt 关闭虚拟机
如果你的虚拟机硬盘文件是 vdi 格式的,那么恭喜你,vdi 格式是动态扩容的,只需要执行如下命令:

VBoxManage modifyhd "centos-vm-disk1.vdi" --resize 50000

如果是 vmdk 格式的,要先转换成 vdi 格式

VBoxManage clonehd "centos-vm-disk1.vmdk" "clone-disk1.vdi" --format vdi
VBoxManage modifyhd "clone-disk1.vdi" --resize 50000
VBoxManage storageattach centos_x64 --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium clone-disk1.vdi
## centos-vm-disk1.vmdk 具体硬盘名  centos_x64 具体虚拟机名

虚拟机内扩容

修改好虚拟机硬盘后,启动虚拟机 vagrant ssh 进入,设置挂载硬盘分区,以CentOS_x64 7.2 为例

sudo lsblk  ##查看硬盘情况
sudo fdisk /dev/sda  ##对扩容的硬盘进行分区
# 按p显示分区表,默认是 sda1 和 sda2。
# 按n新建主分区。
# 按p设置为主分区。
# 输入3设置为第三分区。
# 输入两次回车设置默认磁盘起始位置。
# 输入t改变分区格式
# 输入3选择第三分区
# 输入8e格式成LVM格式 
# 输入w执行
sudo partprobe # 刷新分区表
sudo lsblk  # 此时应该有 /dev/sda3
# 分区好了后 CentOS是 LVM 格式的需要多做几步 进行LVM 扩容
sudo pvcreate /dev/sda3 # 创建物理卷
sudo pvdisply # 查看到卷组名字 VG NAME centos
sudo vgextend centos /dev/sda3 # 添加进卷组
sudo lvresize -L +50G /dev/mapper/centos-root # 增加逻辑卷大小
sudo xfs_growfs /dev/mapper/centos-root # 刷新逻辑卷大小 
# 如果此逻辑卷上的文件系统是EXT3/EXT4类型,需要使用resize2fs工具
# 如果此逻辑卷上的文件系统是XFS类型,需要使用  xfs_growfs
sudo df -hT  # 检查是否扩容成功

新增硬盘扩容

相比直接修改主硬盘扩容,新增硬盘扩容不会破坏原始 Box 内的硬盘大小,而且可以随时添加多块硬盘,更加的灵活一些。
这里直接在 Vagrantfile 里修改了

config.vm.provider "virtualbox" do |vb|
    vb.name = "centos7.2-docker"
    vb.cpus = 2
    vb.memory ="1024"
    unless File.exist?('./docker.vdi')
      vb.customize ['createhd', '--filename', './docker.vdi', '--variant', 'Fixed', '--size', 50 * 1024]
    end
    # unless File.exist?('./thirdDisk.vdi')
    #   vb.customize ['createhd', '--filename', './thirdDisk.vdi', '--variant', 'Fixed', '--size', 10 * 1024]
    # end
    vb.customize ['storageattach', :id,  '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', './docker.vdi']
    # vb.customize ['storageattach', :id,  '--storagectl', 'SATA', '--port', 2, '--device', 0, '--type', 'hdd', '--medium', './thirdDisk.vdi']
end

添加好硬盘后,还需要按照第一种方法进行虚拟机内的扩容,加上文件判断,这样第二次 vagrant up 的时候就不再重新添加一遍硬盘了。

如果不是 LVM 格式的则直接分区格式化挂载即可,LVM 则需要多做几步。LVM 能够跨硬盘管理分区,并且用户在无需停机的情况下调整各个分区大小,非常的方便,推荐使用。

至此,Vagrant 的硬盘扩容就告一段落了,可以愉快的 Docker 了。

参考资料

Vagrant - Adding a second hard drive