vagrant

vagrant环境搭建文档
puphpet 配置服务器

Vagrant 环境配置

安装相关软件

  • virtualbox
  • vagrant
  • xshell(官网下载比较麻烦,找百度或360吧)

安装完毕后重启电脑

Windows 必须要做的事情

注意,一定要开启 VT-x/AMD-V 硬件加速

开机进入BIOS选项 ,依次选Config->CPU->Intel Virtualization Technology,里面有个Intel VT-d Feature ,改成Enabled ,保存退出,关机,然后启动机器。

vagrant 常用命令

vagrant
vagrant list-commands
vagrant up -h

创建一个虚拟机的三步骤:

# 列出当前本机已有的 box
vagrant box list
# 下载官方 box
vagrant box add {title} {url}
# 手动下载 box 并添加到系统: vagrant box add ubuntu/trusty64 本地文件路径
vagrant box add ubuntu/trusty64 ubuntu_dev0.1.box
# 初始化一个新 box: vagrant init {title}
vagrant init ubuntu/trusty64
# 启动
vagrant up

设置 box 下载存放地址

boxes默认是放在~/.vagrant.d/boxes下面的。

cp ~/.vagrant.d/   /path/to/vagrant_home/

修改 ~/.zshrc 添加:
VAGRANT_HOME = /path/to/vagrant_home/

手动下载 box 并添加

vagrant init ubuntu/trusty64
vagrant up

等出现下载地址后,Ctrl+C 终止掉,复制 url 下载。下载完成后,在 virtualbox.box 相同目录下,创建原始文件 metadata.json,内容如下:

{
    "name": "ubuntu/trusty64",
    "versions": [{
        "version": "20160822.0.2",
        "providers": [{
            "name": "virtualbox",
            "url": "file:///d:/path/to/file.box"
        }]
    }]
}

然后倒入到系统:

vagrant box add metadata.json
vagrant box list

这种方式导入的 box 会有版本号。

Vagrant 使用 Ubuntu16.04

vagrant init ubuntu/xenial64
vagrant up

等出现下载地址后,Ctrl+C 终止掉,复制 url 用 EagleGet 下载。
下载完成后,在 virtualbox.box 相同目录下,创建原始文件 metadata.json,内容如下:

{
    "name": "ubuntu/xenial64",
    "versions": [{
        "version": "20160822.0.2",
        "providers": [{
            "name": "virtualbox",
            "url": "file:///d:/path/to/file.box"
        }]
    }]
}

F:\boxes\file.box 要更改为 F:/boxes/file.box

然后倒入到系统:

vagrant box add xenial64.json
vagrant box list

这种方式导入的 box 会有版本号。

用户名和密码保存在 C:\Users\用户名\.vagrant.d\boxes\ubuntu-VAGRANTSLASH-xenial64\20171221.0.0\virtualbox\Vagrantfile 中。

public key 在 box 所在目录下可以找到。

修改配置文件 Vagrantfile 记得关闭检查更新和网络:

config.vm.box_check_update = false

config.vm.network "public_network", ip: "分配的IP"

vagrant@ubuntu-xenial

为了避免安装软件时,会崩溃,需要开启 swap: http://haobing.wang/swap/

Centos7

vagrant box add centos/7

选择 provider virtualbox 一般下载会非常慢,甚至中途断开连接,所以直接ctrl + c,中断下载,复制链接,直接用迅雷加速下载 下载完毕后

vagrant box add centos/7  box_url # box_url 为box本地保存地址

切换到工作目录,然后创建虚拟机:

vagrant init centos/7

启动虚拟机:

vagrant up

这里会有问题:Vagrant with VirtualBox on Windows10: “Rsync” could not be found on your PATH

vagrant在host和box之间共享文件夹有多种方案,centos官方推荐nfs,不过我不喜欢在windows上在安装一个nfs server(因为开发目录要在host上),还是用virtualbox的 VirtualBox Guest Additions 修改目录C:\Users\yourname.vagrant.d\boxes\centos7\0\virtualbox下的Vagrantfile:

config.vm.synced_folder ".", "/vagrant", type: "rsync"

type 的值改为 virtualbox
Windows 下执行命令来安装插件:

vagrant plugin install vagrant-vbguest

ubuntu 如果启动不正常,可以卸载该插件:

vagrant plugin uninstall vagrant-vbguest

重新启动:

vagrant reload

登录虚拟机

虚拟机默认是通过 private key 登录的。

macos 下可以通过命令 vagrant ssh 直接登录。Windows 上使用 xshell 来登录。我们执行 vagrant ssh-config 可以看到该虚拟机对应的 private_key 路径,在 xshell 中将登录方法设置为 public key,然后选中 private_key 文件,用户名为 vagrant,即可正常登录了。

为项目创建一个 vbox

[D:\vagrant]$ mkdir myproject

[D:\vagrant\myproject]$ cd myproject

[D:\vagrant\myproject]$ vagrant init ubuntu/trusty64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.


# 启动我们的虚拟机,由于系统当前没有下载过任何镜像,所以 vagrant 就会到 https://atlas.hashicorp.com 去下载 ubuntu/trusty64 对应的镜像。
[D:\vagrant\myproject]$ vagrant up

设置网络方式

私有网络(Private network)

config.vm.network "private_network", ip: "192.168.33.10"

公有网络(Public network)

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

端口映射(Forwarded port)

config.vm.forwarded_port 80, 8080
cd /etc/nginx/site-available
sudo cp default app
vi app
cd ../site-enabled
sudo ln -s ../sites-available/app app

fix: npm ERR! syscall symlink with Virtualbox shared folders.

修复:npm ERR! syscall symlink

1.Windows用户,以管理员启动 cmd,运行 vagrant up 即可。
2.npm config set bin-links false

fix: Uncaught SyntaxError: Invalid or unexpected token

有一堆 \u0 追加在文件尾部

Maybe you are using config.vm.synced_folder try to use NFS:

# 将 Vagrantfile 所在的目录,映射到,虚拟机的 /vagrant
config.vm.synced_folder ".", "/vagrant", :nfs => true 

如果用的是 VirtualBox provider,需要修改 /etc/nginx/nginx.conf

sendfile on; 改为 sendfile off;

参考资料

打包

vagrant package --output xxx.box

异常关机恢复

C:\Users\bill\VirtualBox VMs{name} 下,将 {name}.vbox.tmp 改名为 {name}.vbox