# 简介
Vagrant 是一款基于 Ruby 的工具,主要用于创建和配置轻量级的、可复制的开发环境。
大家使用的桌面系统通常多种多样(如 Mac/Windows/Linux 等),但部署通常采用 Linux(如 Centos/Ubuntu/Debian 的等),不同系统间存在诸多差异,经常会出现 “代码在服务器上跑不起来,但是在我机子上运行的好好的” 这种情况,排查起来也很困难。我们可以通过 Vagrant 封装一个 基于 Linux 的代码运行环境,然后分发给团队成员,成员可以在自己喜欢的桌面系统上进行开发,开发好的程序可以运行在统一的环境中,避免之前提到的问题,从而大大提高开发效率。
Vagrant 与 Docker 对比
Vagrant 的计算资源利用率较低,但易于开发环境的构建与维护,它通过提供统一的工作流程来管理虚拟机,适合与传统的完整堆栈环境配合使用。Docker 则更侧重于容器化技术,它允许开发者将应用及其依赖打包在容器中,从而实现更快速地部署和更高效的资源利用,非常适合用于应用的微服务架构和敏捷开发实践中。
# 软件安装
# 安装 Vagrant
选择适合自己系统的版本进行下载安装即可,下载地址:
https://developer.hashicorp.com/vagrant/install
Vagrant 是没有图形界面的,所以安装完成后也没有桌面快捷方式。Vagrant 的安装程序会自动把安装路径加入到 PATH 环境变量,所以可以通过命令行执行 vagrant -v
检查是否安装成功
# 安装 VirtualBox
选择适合自己系统的版本进行下载安装即可,下载地址:
https://www.virtualbox.org/wiki/Downloads
Vagrant 也支持 VMware,不过 VMware 是收费的,对应的 Vagrant 版本也是收费的
# 配置
# 添加基础镜像
可以通过命令 vagrant box add {title} {url}
来添加
vagrant box add centos/7 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box |
限于国内网络环境,最好还是提前下载好官方封装的基础镜像,然后在通过命令 vagrant box add {title} {local file}
来添加本地文件
vagrant box add centos/7 path/to/centos7.box |
CentOS 7 x64 下载地址
如果你要其他系统的镜像,可以来这里下载:http://www.vagrantbox.es
如果已经有团队封装好的开发环境镜像,则可以直接添加团队镜像
vagrant box add centos/7 path/to/centos7-your-team.box |
# 初始化
创建一个开发目录(比如:~/dev),你也可以使用已有的目录,切换到开发目录里,用 centos/7 镜像初始化当前目录的环境
cd ~/dev | |
vagrant init centos/7 # 初始化环境 | |
vagrant up # 启动环境 | |
Bringing machine 'default' up with 'virtualbox' provider... | |
==> default: Clearing any previously set forwarded ports... | |
==> default: Clearing any previously set network interfaces... | |
==> default: Preparing network interfaces based on configuration... | |
default: Adapter 1: nat | |
default: Adapter 2: hostonly | |
==> default: Forwarding ports... | |
default: 22 (guest) => 2222 (host) (adapter 1) | |
==> default: Booting VM... | |
==> default: Waiting for machine to boot. This may take a few minutes... | |
default: SSH address: 127.0.0.1:2222 | |
default: SSH username: vagrant | |
default: SSH auth method: private key | |
==> default: Machine booted and ready! | |
==> default: Checking for guest additions in VM... | |
==> default: Configuring and enabling network interfaces... | |
==> default: Mounting shared folders... | |
default: /source => ~/dev/source | |
default: /vagrant => ~/dev/vagrant/pypy | |
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision` | |
==> default: flag to force provisioning. Provisioners marked to run always will still run. |
# 登录虚拟机
虚拟机启动后,通过 ssh 登录虚拟机,然后配置自己所需的开发环境即可
虚拟机
vagrant ssh | |
Last login: Mon Feb 28 17:59:15 2022 from 10.0.2.2 | |
[vagrant@localhost ~]$ | |
# 在虚拟机中配置环境 | |
... |
Windows 用户注意,Windows 终端并不支持 ssh,所以需要安装第三方 SSH 客户端,比如:Putty、Cygwin 等。
采用团队镜像进行初始化并启动后可直接使用,无需再额外配置。
# 定制设置
Vagrant 初始化成功后,会在初始化的目录里生成一个 Vagrantfile 的配置文件,可以修改配置文件进行个性化的定制。
# 任意本地 ip,仅限本机访问,注意 ip 地址不要冲突 | |
config.vm.network "private_network", ip: "192.168.56.111" | |
# 将本地代码存放目录映射到虚拟环境中的 /source 目录下 | |
config.vm.synced_folder "local/code/path", "/source" | |
# 关闭每次执行 vagrant up 时检查每个 box 的更新情况 | |
config.vm.box_check_update = false | |
# 配置密码方式登录虚拟环境 | |
config.ssh.password = "vagrant" |
# 打包分发
当你配置好开发环境后,退出并关闭虚拟机。在终端里对开发环境进行打包:
vagrant package |
打包完成后会在当前目录生成一个 package.box 的文件,将这个文件传给其他用户,其他用户只要添加这个 box 并用其初始化自己的开发目录就能得到一个一模一样的开发环境了。
# 常用命令
vagrant init # 初始化 | |
vagrant up # 启动虚拟机 | |
vagrant halt # 关闭虚拟机 | |
vagrant reload # 重启虚拟机 | |
vagrant ssh # SSH 至虚拟机 | |
vagrant status # 查看虚拟机运行状态 | |
vagrant destroy # 销毁当前虚拟机 |
更多内容请查阅 官方文档
# 其他
# 共享目录
直接使用 vagrant 的共享目录虽然也是可以满足需求的,但是性能不佳,可以换用 NFS 来共享目录,步骤如下:
- 在 OS X 上配置 NFS Server
配置 /etc/exports 文件后使用 nfsd 开启服务
# <shared folder> <options> <client IP> | |
/vagrant/source -mapall=501:20 -alldirs 127.0.0.1 | |
-mapall=501:20 表示客户端 (FreeBSD) 对于文件的任意改动将被视为 OS X 上用户的操作,其 | |
中 501为UID、20为GUID | |
-alldirs 允许客户端上的用户 mount 任意共享文件夹 |
127.0.0.1 使用 127.0.0.1 回路 IP 代替 VirtualBox 客户端 IP,以此所有其他 VMs 可通过 NAT 网络进行访问
修改 /etc/nfs.conf 文件
nfs.server.mount.require_resv_port = 0 |
最后开启 NFS 服务
nfsd update |
- ubuntu 下默认开启 NFS Client ,只需要将共享目录挂载到合适目录下即可
mount 10.0.2.2:/vagrant/source /mnt/vagrant |
- 如果需要 ubuntu 启动后自动 mount 共享文件,可修改 /etc/fstab 文件
mount 10.0.2.2:/vagrant/source /mnt/vagrant nfs rw 0 0 |
# 静态文件缓存问题
使用 Apache/Nginx 时会出现诸如图片修改后但页面刷新仍然是旧文件的情况,是由于静态文件缓存造成的。需要对虚拟机里的 Apache/Nginx 配置文件进行修改:
# Apache 配置添加: | |
EnableSendfile off | |
# Nginx 配置添加: | |
sendfile off; |
# windows 系统下 shell 脚本无法执行问题
在 windows 系统中通过 git pull 下来的代码可能会存在 shell 脚本无法执行的情况,需要在虚拟环境下执行 dos2unix 命令
find . -type f -exec dos2unix {} \; |
# 使用 Navicat 访问 vagrant 里的 mysql
- 常规选项主机名填写 localhost,用户名密码填写 mysql 的即可
- SSH 选项填写 vagrant 的 ip 地址,用户密码填写 vagrant/vagrant