简介
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。
(1)开发环境快速部署 (2)开发环境更迭
#Vagrant的主要概念
- Provider:指的是为Vagrant提供虚拟化支持的具体软件,比如vmware或virtual box。
- Box:代表虚拟机镜像。Vagrant根据Porvider的不同提供了很多的基础镜像(通过url从s3上获取),用户可以根据自己的需求使用vagrant package制作属于自己的box。
- Project:一个目录和目录中的Vagrantfile就组成了vagrant的一个项目,项目下可以有子项目,子项目中的Vagrantfile配置将继承和重写父项目的配置。项目的虚拟机实例并不会存储在这个目录(存储在~/.vagrant.d/box下),所以可以通过git等版本管理工具来管理项目。
- Vagrantfile:Vagrant的配置文件,使用Ruby的语法描述。里面定义了项目所使用的box,网络,共享目录,provision脚本等。当vagrant up命令运行时,将读取当前目录的Vagrantfile。
- Provisioning:指的是虚拟机实例启动后,所需要完成的基础配置工作,比如说安装LAMP服务等。Vagrant支持使用shell,puppet,chef来完成provisioning工作。
- Plugin:Vagrant提供了插件机制,可以很好的扩展对宿主机OS, GuestOS,Provider,Provisioner的支持,比如vagrant的aws和openstack支持都是通过plugin来实现的。
初始化第一个系统
1 | mkdir centos7 |
centos7默认账号/密码:vagrant/vagrant root/vagrant
常用命令
1 | Usage: vagrant [options] <command> [<args>] |
1 | vagrant box add "boxIdentity" remoteUrlorLocalFile 添加box |
Vagrant.configure(“2”) do |config|
# …
end
1 | configure("2")描述的是使用Vagrant 2.0.x配置方式。 |
config.vm.box = “centos/7”
1 | 配置Vagrant要去启用哪个box作为系统,默认名称为base |
config.vm.network: private_network, ip: “11.11.11.11”
1 | 这里设置为host-only模式,且虚拟机ip设置为"11.11.11.11" |
config.vm.hostname = “go-app”
1 | host用于识别虚拟主机。特别在有多台虚拟机时,务必进行设置 |
config.vm.synced_folder “d:/local/dir”, “/vm/dir/”
1 | 第一个参数是本地目录,第二个参数为虚拟机目录。 |
config.vm.network: forwarded_port, guest: 80, host: 8080
1 | 设置将主机上的8080端口forward到虚拟机的80端口上 |
#!/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
1 |
|
Vagrant.configure(“2”) do |config|
config.vm.box = “hashicorp/precise64”
config.vm.provision :shell, path: “bootstrap.sh”
config.vm.network :forwarded_port, guest: 80, host: 4567
end
1 | * 启动:vagrant up |
Vagrant.configure(“2”) do |config|
config.vm.define :web do |web|
web.vm.provider “virtualbox” do |v|
v.customize [“modifyvm”, :id, “–name”, “web”, “–memory”, “512”]
end
web.vm.box = “base”
web.vm.hostname = “web”
web.vm.network :private_network, ip : “11.11.11.1”
end
config.vm.define :db do |db|
db.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--name", "db", "--memory", "512"]
end
db.vm.box = "base"
db.vm.hostname = "db"
db.vm.network :private_network, ip : "11.11.11.2"
end
end
1 | 这里使用了:web和:db定义了两个VM,设置完后再使用vagrant up启动。可以通过vagrant ssh web和vagrant ss db分别登录指定虚拟机上。 |
$ vagrant box add hahaha ~/box/package.box # 添加 package.box 镜像并命名为 hahaha
$ cd ~/dev # 切换到项目目录
$ vagrant init hahaha # 用 hahaha 镜像初始化。
1 |
|
上面这条看下来,你会发现每次都修改了一点点内容,再打包分发给其他用户其实很麻烦。为此 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 是一样的。
# 用 vagrant 快速部署 docker 虚拟机集群
* https://blog.csdn.net/pmlpml/article/details/53925542
* https://blog.csdn.net/u011781521/article/details/80291765