什么是Vagrant
Vagrant 是用于管理虚拟机生命周期的命令行实用程序。在一个一次性和一致的环境中隔离依赖项及其配置。
为什么要使用Vagrant
通过定义我们知道Vagrant主要是用于管理虚拟机的。当我们需要创建很多虚拟机的时候,使用Vagrant无疑是一个非常明智的选择。为什么说明智呢?因为我们只需要使用少数几个命令就可以快速地创建一个虚拟机,下文会讲到如何使用Vagrant创建虚拟机。
使用Vagrant创建虚拟机
安装虚拟机软件
在使用Vagrant之前,我们需要安装好虚拟机软件。Vagrant支持例如VirtualBox、VMware Fusion,、Hyper-V等虚拟机软件。由于VirtualBox是免费的,此处我们选用VirtualBox作为示例。(VirtualBox安装教程此处不赘述)
配置虚拟机存放位置
虚拟机创建后会占用较多的磁盘空间,在 Windows 系统下默认的虚机创建位置是在 C 盘,最好配置到其它地方。打开VirtualBox,然后按下快捷键Ctrl + g
,在全局设定的对话框中将“默认虚拟电脑位置(M)”修改为指定路径。
安装Vagrant
进入官网下载对应版本的安装包,点击安装,然后一直下一步完成安装即可。
验证安装
打开命令窗口,输入vagrant -h
,显示版本信息表示安装成功。
配置Vagrant
通过 Vagrant 创建虚机需要先导入镜像文件,也就是 box
,它们默认存储的位置在用户目录下的 .vagrant.d
目录下,对于 Windows 系统来说,就是 C:\Users\用户名\.vagrant.d
。
Vagrant的虚拟机都是根据镜像文件(及box文件)创建的,所以在创建虚拟机之前都会先导入镜像文件。对于 Windows 系统来说,镜像文件导入后默认是存储在 C:\Users\用户名\.vagrant.d
。如果不想存储在这里,我们可以通过设置环境变量VAGRANT_HOME
来指定存储路径。
创建虚拟机
有两种方式可以创建虚拟机:
-
在线导入虚拟机文件创建
- 建立一个文件夹用于保存本镜像的Vagrantfile(镜像的配置文件),后续针对本镜像的操作都需进入本路径下执行;
- 进入到目标路径后,执行
vagrant init --box-version VERSION
命令,用于创建Vagrantfile文件。可以从官方镜像站找到相应的box-version和VERSION(实测VERSION不写没关系,写错了也没关系)
- 执行
vagrant up
命令启动虚拟机,由于是在线导入镜像,所以这个过程时间会稍微长点(与网络也有关系)
- 执行
vagrant status
命令验证运行状态,如果为running
表示镜像导入成功,并成功运行虚拟机。
-
导入下载好的镜像文件后创建
- 从官方镜像站或者CentOS 镜像站或者Ubuntu镜像站以及清华大学镜像站等镜像站下载自己所需的镜像文件;
- 创建好Vagrantfile文件存放路径,并进入,然后执行
vagrant box add {file} --name {boxname}
来导入镜像;
- 执行
vagrant box list
命令验证镜像是否创建成功
- 执行
vagrant init {boxname}
创建虚拟机
- 执行
vagrant up
命令启动虚拟机
连接虚拟机
- 使用
vagrant ssh
连接
默认采用的是【网络地址转换(NAT)】(设置了端口映射,比如说将宿主机的2200端口映射到虚拟机的22端口)的方式连接虚拟机,这种方式虚拟机可以实现外网访问,但是宿主机必须通过端口转发形式访问,虚拟机之间的通信也必须经由宿主机的端口转发。这里提供两种方式优化:第一种,网络连接设置为【桥接网卡】。这种方式的好处是将虚拟机当做一台实体机,可以方便访问外网以及虚拟机之间通信;不好的地方是虚拟机直接暴露在外网中,有一定风险;第二种,双网卡设置,第一张网卡设置为【网络地址转换(NAT)】连接方式不变,保证可以访问外网,第二张网卡设置为【仅主机(Host-Only)网络】,确保主机可以顺利访问到虚拟机,虚拟机之间也可以正常访问。不管是那种方式,均可以通过修改Vagranfile配置实现。
# 设置【桥接网卡】
# config.vm.network "public_network" 找到这一行,将注释打开
# 设置【仅主机(Host-Only)网络】
# config.vm.network "private_network", ip: "192.168.33.88" 找到这一行,将注释打开,注意多个虚拟机之间的IP不要冲突了
# config.vm.network "private_network", type: "dhcp" 这种方式是设置为动态IP,但是不建议,实测这种方式VirtualBox不能有别的开启了DHCP的Host-Only网卡,否则会冲突(见下图);即便将别的Host-Only网卡都删除了,自动分配的IP也是冲突的(见下图db01和db02的IP)。
其他命令
# 暂停
vagrant suspend [name|id]
# 还原
vagrant resume [name|id]
# 关机
vagrant halt
# 删除虚拟机
vagrant destroy
ps:其他命令可参见官网参考手册
创建Vagrant镜像文件
vagrant镜像文件是基于已有的虚拟机创建的,所以我们要先准备一个能够正常运行的虚拟机,并进行一些必要或者建议操作。
# 安装必要的软件(建议)
apt install -y lsof net-tools wget curl axel systemd xfsprogs util-linux ssh openssh-server samba vsftpd openntpd ntpdate
# 配置ssh(建议)
systemctl enable --now ssh.service
# 优化ssh连接速度(建议)
sed -i 's/#UseDNS no/UseDNS no/g' /etc/ssh/sshd_config
sed -i 's/#GSSAPIAuthentication no/GSSAPIAuthentication no/g' /etc/ssh/sshd_config
sudo systemctl restart sshd
# 设置时区与时间同步(建议)
systemctl enable --now openntpd.service
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ntpdate ntp6.aliyun.com
# 创建vagrant用户(必须)
useradd -s /bin/bash -m vagrant
passwd vagrant
# 配置免密sudo
echo 'vagrant ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/vagrant
# 添加 vagrant’s public key(必须)
sudo su - vagrant
mkdir -m 0700 -p /home/vagrant/.ssh
curl https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub > /home/vagrant/.ssh/authorized_keys
chmod 0600 /home/vagrant/.ssh/authorized_keys
# 优化histoty展示效果(建议)
echo "export HISTFILESIZE=500000000" >> /etc/profile
echo "export HISTSIZE=1000000" >> /etc/profile
echo "export PROMPT COMMAND="history -a"" >> /etc/profile
echo "export HISTTIMEFORMAT=\"%Y-%m-%d %H:%M:%S `whoami` \"" >> /etc/profile
# 清理(建议)
apt-get autoclean #清理旧版本的软件缓存
apt-get clean #清理所有软件缓存
apt-get autoremove #删除系统不再使用的孤立软件
rm -rf /var/cache/apt/archives/*
rm -rf /tmp/*
rm -f /var/log/wtmp /var/log/btmp
history -c
配置完成后,关闭虚拟机,然后执行打包命令即可完成打包
# vagrant package --output [boxName] --base [虚拟机名称]
# 生产的虚拟机会在当前执行命令的路径下
vagrant package --output ubuntu-base.box --base ubuntu-base