Vagrant简介

Vagrant是一款用来构建虚拟开发环境的外挂工具,可以简化虚拟机配置和管理。它底层支持VirtualBox、VMware、AWS等,非常适合使用php/python/ruby/java语言开发web应用。

Box仓库

官方仓库:https://atlas.hashicorp.com/boxes/search

官方镜像:https://vagrantcloud.com/boxes/search

第三方仓库:http://www.vagrantbox.es/(国内)

Vagrant常用命令

初始化配置

vagrant init [options] [name [url]]

Options:

--box-version VERSION        添加box(虚拟机)版本、具有约束作用
-f, --force                  强制执行、覆盖原有创建的Vagrantfile文件
-m, --minimal                创建的Vagrantfile文件不包含任何的注释
--output FILE                这会将 Vagrantfile 输出到给定的文件。 如果这是“-”,则 Vagrantfile 将被输出到当前终端
--template FILE              提供用于生成 Vagrantfile 的自定义 ERB 模板
--[no-]color                 启用或者禁用 颜色区分


如果 Vagrantfile文件尚未存在,则通过创建初始Vagrantfile文件,将当前目录初始化为Vagrant环境。

如果给出第一个参数,它将在创建的 Vagrantfile 中预填充 config.vm.box 设置。

如果给出第二个参数,它将在创建的 Vagrantfile 中预填充 config.vm.box_url 设置

启动虚拟机

vagrant up [options] [name|id]

Options:

--[no-]provision             启用或者禁用规定
--provision-with x,y,z       以特定规定的类型或者名称启动
--[no-]destroy-on-error      启动发生任何错误都直接删除虚拟机
--provider PROVIDER          指定启动的环境、默认是本地

根据初始化的Vagrantfile来启动虚拟机。

在本地初始化的环境,直接执行vagrant up命令启动,默认根据本地初始化的Vagrantfile配置执行。

登录虚拟机

vagrant ssh [options] [name|id] [-- extra ssh args]

Options:

-c, --command COMMAND        指定vagrant安装文件
-p, --plain                  普通模式,将身份验证留给用户

通过ssh登录指定环境所在虚拟机(默认为本地)

通常情况下,vagrant在创建虚拟机的时候,内置了1个用户:

username: vagrant

password: vagrant

挂起虚拟机

vagrant suspend [options] [name|id]

-a, --all-global  挂起全部正在运行的虚拟机

重启虚拟机

vagrant reload

关闭虚拟机

vagrant halt [options] [name|id]

Options:

-f, --force         强制挂起虚拟机

查看虚拟机状态

vagrant status

删除虚拟机

vagrant destroy [options] [name|id]

Options:

-f, --force              强制关闭虚拟机
-g, --graceful          关闭虚拟机电源

上传文件到虚拟机

将本地文件上传到虚拟机

vagrant upload [options] <source> [destination] [name|id]


destination: 客户机器上上传文件或目录的路径。

source:主机上文件或目录的路径以上传到客户机。

compress:在上传到客户机之前压缩文件或目录。

compression-type:
type- 压缩文件或目录以供上传时使用的压缩类型。默认zip,可选择:tgz, zip。

temporary:在客户机上创建一个临时位置并将文件上传到该位置。

显示安装的虚拟机

vagrant box list

删除虚拟机

vagrant box remove [box_name]

Vagrant快照管理

新建快照

vagrant snapshot save your_snapshot_name    

查看快照

vagrant snapshot list    

恢复快照

vagrant snapshot restore your_snapshot_name    

删除快照

vagrant snapshot delete your_snapshot_name    

Vagrant网络配置

vagrant提供了三种网络配置方式:端口映射(默认)、私有网络、公有网络,可以在 配置文件 Vagrantfile 进行网络配置,推荐使用私有网络。

端口映射(Forwarded port)

端口转发指把宿主机的端口映射到虚拟机的某一个端口上,访问宿主机端口时,请求实际是被转发到虚拟机上指定端口的。
比如:我配置本机计算机的8080端口为虚拟机的80端口,这样我访问该机器的8080端口,vagrant会把请求转发到虚拟机的80端口是那个去处理。

config.vm.network "forwarded_port", guest: 80, host: 8080
Vagrant.configure("2") do |config|
  config.vm.network  
      "forwarded_port"(必须) //端口转发标识
      , guest(必须): //虚拟机端口
      , host(必须): //宿主机端口,值必须大于1024
      ,guest_ip(可选): //虚拟机端口绑定虚拟机ip地址
      ,host_ip(可选): //虚拟机端口绑定宿主机ip
      ,protocol(可选)://指定通信协议,可以使用tcp/udp,默认tcp
      ,auto_correct(可选)://true/false,若配置为true,则每次开启虚拟机的时候自动检查是否存在端口冲突
end


注:若guest_ip和host_ip两项配置为空,则局域网下的所有设备都可以访问该虚拟机。
注:宿主机指运行虚拟机的物理机。

通过这种方式,我们可以有针对性的把虚拟机的某些端口公布到外网让其他人去访问。

私有网络(Private network)

私有网络是指只有宿主机可以访问虚拟机,如果多个虚拟机设定在同一个网段也可以互相访问。
既然是private,那么这种方式是只允许主机访问虚拟机。如果多个虚拟机设定在同一个网段,那么几个虚拟机之间也可以互相访问。这种方式,就好像是搭建了一个私有的linux集群。而且只有一个出口,那就是该主机。

config.vm.network "private_network", ip: "192.168.21.4"
Vagrant.configure("2") do |config|
  config.vm.network 
  "public_network" //必须 公有网络标识
  ,ip(string):  //可选,配置静态ip
  ,bridge(string/array): "en1: Wi-Fi (AirPort)"//可选,设置桥接的网卡
end

使用这种方式,非常安全,因为只有一个出口,但是你的虚拟机只允许你自己进行操作。团队成员不能操作,那你的电脑就成服务器主机了。

公有网络(Public network)

虚拟机享受实体机器一样的待遇,一样的网络配置,vagrant1.3版本之后也可以设定静态IP。设定语法如下:

config.vm.network "public_network", ip: "192.168.1.120"

这种网络配置方式,方便团队开发,别人也可以访问你的虚拟机。当然,你和你的虚拟机必须在同一个网段中。

Vagrant 文件配置详解

# -*- mode: ruby -*-
# vi: set ft=ruby :

# 声明安装box版本
Vagrant.configure("2") do |config|
  # 安装的box
  config.vm.box = "typercode/centos-7.5"

  # box更新检查 不推荐设置
  # config.vm.box_check_update = false

  # 端口映射 客户机端口映射到虚拟机的端口配置
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  # 指定IP的端口映射
  # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

  # 私有网络 
  # config.vm.network "private_network", ip: "192.168.33.10"

  # 共有网络
  # config.vm.network "public_network"

  # 文件同步 第一个参数:本地同步目录 」 第二个参数:虚拟机同步目录
  # config.vm.synced_folder "../data", "/vagrant_data"
  # 虚拟机配置信息
  # config.vm.provider "virtualbox" do |vb|
  #   是否安装有界面虚拟机 false无界面安装(推荐)
  #   vb.gui = true
  #   虚拟机CPU核数 
  #   vb.cpus = 2
  #   虚拟机内存
  #   vb.memory = "1024"
  # end
  #
end

Vagrant实战(多机部署)

机器配置

实战部署两台虚拟机,一台作为项目前端、一台作为项目中间件、一台作为项目后台
webui: 192.168.126.135 18000
middle: 192.168.126.136
backend: 192.168.126.137 18002

配置文件

Vagrant.configure("2") do |config|
    
    config.vm.define "web" do |web|
        web.vm.box = "typercode/centos-7.5"
        web.vm.box_url = "User/onepiece/vagrant/vagrant-centos-6.7.box"
        web.vm.hostname = "webui"
        web.vm.network "forwarded_port", guest: 18000, host: 18000
        web.vm.synced_folder "/Users/onepiece/develop/web", "/opt/soft"
    config.vm.provider "virtualbox" do |vb|
        vb.gui = false
        vb.cpus = 2
        vb.memory = "2048"
      end

    config.vm.define "middle" do |middle|
        middle.vm.box = "typercode/centos-7.5"
        middle.vm.box_url = "Users/onepiece/vagrant/vagrant-centos-6.7.box"
        middle.vm.hostname = "middle"
        middle.vm.network "forwarded_port", guest: 3306, host: 13306
        middle.vm.network "forwarded_port", guest: 6379, host: 16379
        middle.vm.synced_folder "/Users/onepiece/develop/middle", "/opt/soft"
    config.vm.provider "virtualbox" do |vb|
        vb.gui = false
        vb.cpus = 2
        vb.memory = "4096"
    end

    config.vm.define "backend" do |backend|
        backend.vm.box = "typercode/centos-7.5"
        backend.vm.box_url = "Users/onepiece/vagrant/vagrant-centos-6.7.box"
        backend.vm.hostname = "backend"
        backend.vm.network "forwarded_port", guest: 18002, host: 18002
        backend.vm.synced_folder "/Users/onepiece/develop/middle", "/opt/soft"
    config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.cpus = 2
    vb.memory = "2048"
    end
end
Last modification:August 22, 2022
如果觉得我的文章对你有用,请随意赞赏