Vagrant

作者: Oo晨晨oO | 来源:发表于2017-12-18 22:59 被阅读70次

    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是否在其中. 在其中说明下载成功

    初始化虚拟机

    1. 新建一个文件夹 mkdir xxx
    2. 进入文件夹 cd xxx
    3. 初始化虚拟机 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 虚拟机有三种网络模式

    1. 私有网络
    2. 共有网络
    3. 端口转发

    配置私有网络

    在私有网络中, 只有自己的电脑设备可以访问到.

    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 是一样的。

    相关文章

      网友评论

          本文标题:Vagrant

          本文链接:https://www.haomeiwen.com/subject/cnevwxtx.html