Vagrant搭建虚拟环境
Vagrant 是基于 VirtualBox 虚拟机的,通俗的讲,就是用虚拟机的环境运行本地的代码。代码可以在本地直接编辑和调试,你可以在本地浏览器里查看运行中 Web 应用。而这套虚拟机是可以直接导入到其他电脑上的使用的,这样团队其他成员省去了配置时间,更能保证开发环境和生产环境的统一。
Vagrant的强大在于是一个镜像,配置完以后镜像可以放到任何地方去,真正做到了一劳永逸了。
Vagrant的官方网站: http://www.vagrantup.com/
Vagrant镜像
1.安装Virtualbox 下载地址:https://www.virtualbox.org/wiki/Downloads
修改配置虚拟机安装路径
2.安装Vagrant 下载地址:https://www.vagrantup.com/downloads.html
更改vagrant配置文件的位置
将C:\Users\user_name\.vagrant.d
移动到新的位置,新建环境变量VAGRANT_HOME
,并指向新路径
3.初始化虚拟机 3.1 在线方式 1 2 3 4 5 6 7 8 # 添加镜像 $ vagrant box add debian https://dl.dropboxusercontent.com/u/3523744/boxes/debian-8.1-amd64-lxc-puppet/debian-8.1-lxc-puppet.box # 初始化 $ vagrant init debian # 启动 $ vagrant up
3.2 本地方式 CentOS 7 box地址:https://app.vagrantup.com/centos/boxes/7/versions/1902.01
由于在vagrant box hub上下载box速度很慢,这里提前下载好centos 7 boxes,保存于H:\vagrant\box_files 文件夹下,注意:目录结构保持与我的一致。下载方法是box地址+提供商名字 (用迅雷下载比较快)如:https://app.vagrantup.com/centos/boxes/7/versions/1902.01/providers/virtualbox.box
CentOS-7-x86_64-Vagrant-1902_01.VirtualBox.json文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 { "name" : "centos/7" , "versions" : [ { "version" : "1902.01" , "providers" : [ { "name" : "virtualbox" , "url" : "file://H:/vagrant/box_files/CentOS-7-x86_64-Vagrant-1902_01.VirtualBox.box" } ] } ] }
添加镜像
1 2 3 4 5 6 7 8 $ cd H:/vagrant/box_files# 执行以下命令 $ vagrant box add CentOS-7-x86_64-Vagrant-1902_01.VirtualBox.json # 删除box模板 $ vagrant box remove centos/7
3.3 启动一个虚拟机 1 2 3 4 5 $ mkdir -p H:/vagrant/box_files/test$ cd H:/vagrant/box_files/test# 初始化,生成vagrantfile $ vagrant init centos/7
修改Vagrantfile配置,并准备系统配置脚本,注意virtualbox的网段在192.168.56.1
Vagrntfile文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.require_version ">= 1.6.0" # virtualbox虚拟机网段是192.168.56.1 boxes = [ { :name => "test", :eth1 => "192.168.56.100", :mem => "2048", :cpu => "2" } ] Vagrant.configure(2) do |config| config.vm.box = "centos/7" config.vbguest.auto_update = false config.vbguest.no_remote = true boxes.each do |opts| config.vm.define opts[:name] do |config| config.vm.hostname = opts[:name] config.vm.provider "vmware_fusion" do |v| v.vmx["memsize"] = opts[:mem] v.vmx["numvcpus"] = opts[:cpu] end config.vm.provider "virtualbox" do |vb| vb.name = "lab-#{config.vm.hostname}" vb.customize ["modifyvm", :id, "--memory", opts[:mem]] vb.customize ["modifyvm", :id, "--cpus", opts[:cpu]] end config.vm.provider :libvirt do |lv| lv.host = "lab-#{config.vm.hostname}" end config.vm.network :private_network, ip: opts[:eth1] end end # 禁用vagrant的默认共享目录 # config.vm.synced_folder "." , "/vagrant" , disabled:true # config.vm.synced_folder "../public" , "/opt" , mount_options:["dmode=777" ,"fmode=666" ] config.vm.provision "shell", privileged: true, path: "./setup.sh" end
setup.sh文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 # /bin/sh # Delta RPMs disabled because /usr/bin/applydeltarpm not installed. sudo yum install -y deltarpm # 设置时区 timedatectl set-timezone Asia/Shanghai # 关闭防护墙及selinux sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config setenforce 0 systemctl stop firewalld.service systemctl disable firewalld.service # 允许密码登录 sed -i '/^PasswordAuthentication no/s/no/yes/g' /etc/ssh/sshd_config systemctl restart sshd.service # install some tools sudo yum install -y git vim gcc glibc-static telnet bridge-utils net-tools # install docker # sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # sudo yum makecache fast sudo yum -y install docker-ce # sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://c8x7u9xt.mirror.aliyuncs.com"] } EOF # start docker service sudo usermod -aG docker vagrant sudo systemctl start docker sudo systemctl enable docker # install docker-compose curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
安装vagrant-vbguest插件
1 2 $ vagrant plugin install vagrant-vbguest $ vagrant vbguest
安装vagrant-vbguest插件用于文件夹共享
启动虚拟机
3.4 vagrant ssh登录虚拟机 虚拟机安装好后,默认已经创建了vagrant用户,密码是vagrant,root用户的默认密码也是vagrant。 在命令行下执行vagrant.exe ssh ,将以vagrant用户登录虚拟机。也可以用Secure CRT、xshell等工具连接登录。
1 2 3 4 5 6 # SSH登录 $ vagrant ssh # 默认账号密码 vagrant/vagrant root/vagrant
4.常见命令
命令
说明
vagrant box list
查看目前已有的box
vagrant box add
新增加一个box
vagrant box remove
删除指定box
vagrant init
初始化配置Vagrantfile
vagrant up
启动虚拟机
vagrant ssh
ssh登录虚拟机
vagrant suspend
暂停虚拟机,虚拟机内存等信息将以状态文件的方式保存在本地,可以执行恢复操作后继续使用
vagrant reload
重启虚拟机
vagrant halt
关闭虚拟机
vagrant status
查看虚拟机状态
vagrant destroy
销毁(删除)当前虚拟机(除Vagrantfile中的配置所有数据都不会保留)
vagrant resume
恢复虚拟机,与前面的暂停相对应
5.打包分发 当你配置好开发环境后,退出并关闭虚拟机。在终端里对开发环境进行打包:
打包完成后会在当前目录生成一个package.box 的文件,将这个文件传给其他用户,其他用户只要添加这个box并用其初始化自己的开发目录就能得到一个一模一样的开发环境了。
注:如果网络模式中使用 private_network 的话,在打包之前需要清除一下private_network的设置,避免不必要的错误: sudo rm -f /etc/udev/rule.d/70-persistent-net.rules 制作完成之后直接将box文件拿到其他计算机上配置即可使用。
更多内容请查阅官方文档http://docs.vagrantup.com/
6.Vagrant 插件: 6.1 snapshot 插件 1 2 3 4 5 vagrant plugin install vagrant-vbox-snapshot Installing the 'vagrant-vbox-snapshot' plugin. This can take a few minutes... Fetching: vagrant-vbox-snapshot-0.0.10.gem (100%) Installed the plugin 'vagrant-vbox-snapshot (0.0.10)'!
Vagrant建立快照备份
使用Vagrant的快照功能可以很方便快速的创建当前虚拟机的一个临时备份状态,在进行重要操作时可以先创建一个快照以便在操作失误后快速恢复。
1 2 3 4 5 6 7 8 9 10 11 12 $ vagrant snapshot Usage: vagrant snapshot <command> [<args>] Available subcommands: back delete go list take For help on any individual command run `vagrant snapshot <command> -h
使用方法:
1 vagrant snapshot take [vm-name] <SNAPSHOT_NAME>
1 vagrant snapshot list [vm-name]
1 vagrant snapshot go [vm-name] <SNAPSHOT_NAME>
1 vagrant snapshot delete [vm-name] <SNAPSHOT_NAME>
6.2 vbguest 插件
自定义共享目录,有时候我们发现有些virtualbox无法使用自定义的共享目录,这时候就需要安装vbguest客户端(类似于VMware的client)
1 vagrant plugin install vagrant-vbguest
6.3 hostmanager 插件
用主机名访问,可以实现虚机之间用主机名互相访问,也可以实现宿主机用主机名访问虚机。
1 vagrant plugin install vagrant-hostmanager
6.4 vagrant-bindfs 支持多种共享模式 插件bindfs可以支持多种共享模式,如nfs,samba
命令行下输入:
1 vagrant plugin install vagrant-bindfs
修改Vgrantfile文件:
1 2 3 4 5 6 config.vm.define "node1" do |node1 | node1.vm.network "private_network" , ip: "192.168.33.11" node1.vm.hostname="node1.yulongjun.com" node1.vm.synced_folder "./app" "/mnt/app-data" , type: "nfs" node1.bindfs.bind_folder "/mnt/app-data" "/app" force_user: "root" , force_group: "root" , o: "noempty"