用Vagrant部署开发环境
在Vagrant专题页我们介绍过Vagrant基于VirtualBox运行,本身并不是虚拟化技术,它只是外挂在VirtualBox虚拟机上的自动化程序,所以一定要先安装好VirtualBox,在安装完VirtualBox和Vagrant之后,你可以在http://www.vagrantbox.es/寻找镜像,这里的资源非常多,各种部署好的开发环境,如果你想自己练手做环境部署建议你下载一个纯净的OS。
Note:Vagrant支持远程和本地镜像的安装,由于国外网络访问慢、不稳定建议你下载box文件到本地安装,比如我下载了Centos7的镜像文件
CentOS-7.1.1503-x86_64-netboot.box
。
Vagrant的基本使用
在本地建立工作目录,打开命令行工具cmd并切换至该目录,由于Vagrant安装程序已经自动加入了path变量,所以我们直接可以使用vagrant命令:
vagrant box add boxname CentOS-7.1.1503-x86_64-netboot.box
vagrant box add
为创建镜像的命令;boxname为指定的名称(在VirtualBox中的虚拟主机名称);CentOS-7.1.1503-x86_64-netboot.box
是你的.box文件地址,可以是远程http地址,也可以是本地地址。
创建好镜像后执行命令来初始化配置
vagrant init boxname
这时候工作目录会生成出Vagrantfile
文件,这个文件非常重要。
Vagrandfile文件的配置:
一些重要的需要配置参数:
端口映射(Forwarded port)
config.vm.network "forwarded_port", guest: 80, host: 8080
guest为虚拟机的端口,host为宿主的端口,这行配置的意思是将虚拟机的80端口映射到宿主电脑的8080端口,也就是说如果你在虚拟机环境里搭建了某web项目,用的默认80端口你在本地浏览器使用8080端口即可访问。
当然这里可以配置多个端口映射,添加一行配置:
config.vm.network "forwarded_port", guest: 5000, host: 5050
讲虚拟机的5000端口映射至宿主电脑5050端口。
2018-01-18更新:
如果宿主电脑无法访问,但是虚拟机curl -I http://xxx可以访问,可以先查看一下防火墙的状态,如果防火墙处于开启状态需要关闭或者添加通行规则,基础使用命令:
firewall-cmd --zone=public --permanent --add-port=5000/tcp #一个端口 firewall-cmd --zone=public --permanent --add-port=4990-4999/udp #端口区间,不同的端口协议 firewall-cmd --zone=public --permanent --list-ports #查看端口开放情况
添加完规则后别忘记重启一下防火墙
systemctl restart firewalld
私有网络(Private network)
config.vm.network "private_network", ip: "192.168.33.10"
只有主机可以访问虚拟机,如果多个虚拟机设定在同一个网段也可以互相访问,当然虚拟机是可以访问外部网络的。
这里配置好之后可以用ssh直接使用22端口连接这个IP地址。
公有网络(Public network)
虚拟机享受实体机器一样的待遇,一样的网络配置,vagrant1.3版本之后也可以设定静态IP。设定语法如下:
DHCP分配IP
config.vm.network "public_network"
分配静态IP
config.vm.network "public_network", ip: "192.168.1.120"
目录映射(synced folder)
config.vm.synced_folder "Path/To/Host", "/Path/To/VirtualHost"
将宿主电脑的文件目录同步至虚拟机上,第一个参数是本地电脑目录,第二个是虚拟机的目录,如果不做任何配置会把当前工作目录映射至虚拟机/vagrant目录中。
启动时运行脚本
# config.vm.provision "shell", inline: <<-SHELL # sudo apt-get update # sudo apt-get install -y apache2 # SHELL
如果需要虚拟机启动时运行脚本可以配置该项
Vagrant常用的虚拟机管理命令
- vagrant up (启动虚拟机,开机)
- vagrant halt (关闭虚拟机,关机)
- vagrant suspend (暂停虚拟机,睡眠)
- vagrant resume (恢复虚拟机,唤醒)
- vagrant destroy (删除虚拟机,删除)
打包分享你的Box
Note:打包前先用命令
vagrant halt
关闭虚拟机
打包需要用到vagrant package命令,语法:
vagrant package -h
Usage: vagrant package [options] [name|id]
Options:
--base NAME Name of a VM in virtualbox to package as a base box
## 注意:这里是个小坑,这里的NAME是虚拟机vms的名称,一般VirtualBox会建立虚拟机的目录名,在这里就是目录名,比如我是把虚拟机全部放在D:\VirtualBox VMs
下,到这里找到对应的虚拟机目录名就好了
--output NAME Name of the file to output ##输出文件名
--include FILE... Additional files to package with the box ##打包包含那些文件
--vagrantfile FILE Vagrantfile to package with the box ##包含vagrantfile配置文件
-h, --help Print this help ##帮助
比如我要打包CentOS7上搭建LEMP的环境:
vagrant package --base vagrant-lemp_default_1484553482505_41668 --output centos7-lemp.box --vagrantfile Vagrantfile
E:\WorkSpace\Vagrant\vagrant-lemp>vagrant package --output centos7-lemp.box --base vagrant-lemp_default_1484553482505_41668 --vagrantfile Vagrantfile ==> vagrant-lemp_default_1484553482505_41668: Clearing any previously set forwarded ports... ==> vagrant-lemp_default_1484553482505_41668: Exporting VM... ==> vagrant-lemp_default_1484553482505_41668: Compressing package to: E:/WorkSpace/Vagrant/vagrant-lemp/centos7-lemp.box ==> vagrant-lemp_default_1484553482505_41668: Packaging additional file: Vagrantfile
这时候看到目录中已经多了一个名文centos7-lemp.box
的box文件了,这时候你可以分享这个box给其他人,无需再重复部署环境了。