Vagrant是什么?
Vagrant是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。
我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。
可以参考这篇文章https://segmentfault.com/a/1190000000264347
安装vagrant
去http://vagrantup.com/下载安装包, 进行安装
安装完毕之后, 在终端输入vagrant
, 如果能识别, 那么就说明安装成功了.
安装centos box
要实现centos的虚拟机, 还要用到centos box.
可以去https://app.vagrantup.com/boxes/search?provider=virtualbox寻找到一款最新的稳定的box, 复制下box的名字
在终端输入: vagrant box add 你复制的box名字
会让你选择版本, 选择virtualbox
版本
vagrant就会给你下载对应的box.
下载安装完毕之后, 输入vagrant box list
, 看看你刚刚下载的box是否在其中. 在其中说明下载成功
初始化虚拟机
- 新建一个文件夹
mkdir xxx
- 进入文件夹
cd xxx
- 初始化虚拟机
vagrant init 你复制的box名字
经过上面的步骤, 虚拟机成功创建
查看虚拟机当前的状态, 可以使用vagrant status
启动, 停止, 重启, 销毁虚拟机
- 开启虚拟机:
vagrant up
- 登录虚拟机:
vagrant ssh
- 关机:
vagrant halt
- 暂停:
vagrant suspend
- 暂停恢复:
vagrant resume
- 关机重启:
vagrant reload
- 销毁:
vagrant destory
为虚拟机配置共享目录
一开始, 虚拟机共享目录为当前目录. 即在哪里init的vagrant, 那么这个文件夹就与虚拟机中的一个文件夹为共享文件夹.
例如在桌面创建一个文件夹, 名为
vagrantXXX
,在vagrant init
完毕之后, 执行vagrant up
在执行命令结束时, 你可以看到一条log:Rsyncing folder: /Users/apple/Desktop/vagrantXXX/ => /vagrant
这是说桌面的vagrantXXX文件夹与虚拟机中的vagrant文件夹是共享文件夹
那如何配置其他的共享目录呢?
可以打开作为虚拟机文件夹下的Vagrantfile
找到config.vm.synced_folder
所在的那一行, 解掉注释, 并修改成这样:
config.vm.synced_folder "../data", "/vagrant_data",
create: true, owner: "root", group: "root"
那么就把当前文件夹上一级文件夹中的data
文件夹与虚拟机中的vagrant_data
文件夹设置为共享文件夹了.
保存, 然后执行vagrant reload
如果报错, 执行:
vagrant plugin install vagrant-vbguest
vagrant vbguest
之后, 再次执行vagrant reload
即可.
这时, 如果上个文件夹不存在data
这个文件夹, 那么系统会自动创建这个文件夹.
配置网络
vagrant 虚拟机有三种网络模式
- 私有网络
- 共有网络
- 端口转发
配置私有网络
在私有网络中, 只有自己的电脑设备可以访问到.
在Vagrantfile
中, 找到config.vm.network "private_network", ip: "192.168.33.10"
这一行, 解掉注释, (后面的ip地址就是建立好私有网络时的虚拟机的ip地址)
然后vagrant reload
重启虚拟机, ping一下, 发现可以连接上.
vagrant ssh
登录到服务器, 然后执行命令ip addr
即可得到当前服务器的网络信息.
配置公有网络
在公有网络中, 会使用路由来分配IP地址.
首先在Vagrantfile
中注释掉其他的网络配置信息. 找到config.vm.network "public_network"
这行, 解掉注释. 然后vagrant reload
, 选择一下网络环境, 即可
打包分发
当你配置好开发环境后,退出并关闭虚拟机。在终端里对开发环境进行打包:
$ vagrant package
打包完成后会在当前目录生成一个 package.box 的文件,将这个文件传给其他用户,其他用户只要添加这个 box 并用其初始化自己的开发目录就能得到一个一模一样的开发环境了。
添加方法:
假设我们拿到的 box 存放路径是 ~/box/package.box,在终端里输入:
$ vagrant box add hahaha ~/box/package.box # 添加 package.box 镜像并命名为 hahaha
$ cd ~/dev # 切换到项目目录
$ vagrant init hahaha # 用 hahaha 镜像初始化。
集成预安装
从上面这条看下来,你会发现每次都修改了一点点内容,再打包分发给其他用户其实很麻烦。为此 Vagrant 还提供了更为便捷的预安装定制。打开 Vagrantfile 文件末尾处有下面被注释的代码:
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y apache2
SHELL
没错,这段代码就是让你在初次运行 vagrant up 后,虚拟机创建过程众自动运行的初始化命令。 取消注释,把要预先安装的 php/mysql/redis 和配置之类的通通都写进去。初始化时这些程序都会根据你写好的方法安装并配置。
如果你不是初次运行,同时又修改了这里的命令,想让系统再次运行这里面的命令,你可以使用 vagrant reload --provision 进行重载。所以在这种情况下,你只要将 Vagrantfile 共享给团队的其他成员就可以了,其他成员运行相同的命令即可,是不是比打包分发要方便许多。
你还可以把要运行的命令单独写在一个文件里存放在相同的目录下,比如 bootstrap.sh:
#!/usr/bin/env bash
apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
rm -rf /var/www
ln -fs /vagrant /var/www
fi
然后在 Vagrantfile 里这样添加:
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
...
config.vm.provision "shell", path: "bootstrap.sh" # 添加这行
end
效果和直接写在 Vagrantfile 是一样的。
网友评论