Vagrant下载
- Vagrant本质上就是命令行版的virtualbox,它依赖VirtualBox
- 它使用命令行来执行virtualbox的各种操作,提高开发的效率
- vagrant执行的成果,也可以在virtualbox上无缝呈现。
- 可以在各种系统上做各种测试,而无需污染物理主机上运行的系统
Vagrant与Docker有很多相似之处,又有不少不同。一言蔽之,Vagrant用来管理虚拟机,Docker用来隔离应用环境。 https://www.vagrantup.com/downloads.html
vagrant -v
Vagrant 2.1.1
Centos上安装
wget https://releases.hashicorp.com/vagrant/2.1.2/vagrant_2.1.2_x86_64.rpm
yum install -y vagrant_2.1.2_x86_64.rpm
vagrant镜像
vagrant box add 只会下载镜像,并不会立刻创建一个虚拟机
vagrant box list/add/remove
vagrant虚拟机
CLI列表
https://www.vagrantup.com/doc...
1. 创建centos7系统
#会生成一个Vagrantfile文件
vagrant init centos/7
#基于Vagrantfile配置文件,创建启动centos7
vagrant up
#进入启动完成的centos7系统
vagrant ssh
如果需要使用vagrant创建其他系统,可以访问 https://app.vagrantup.com/box...,查看所有的系统列表
如果追求稳定版,可以优先使用 https://app.vagrantup.com/bento
2. 查看centos7状态
vagrant status
Current machine states:
default running (virtualbox)
The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
3. 关机
vagrant halt
4. 重启
vagrant reload
默认情况下会更新Vagrantfile文件中除了config.vm.provision
配置以外的配置,然后重启系统。
使用--provision
选项,会强制更新config.vm.provision
配置
vagrant reload
5. 修改root为进入系统的默认用户
默认情况下,我们是使用用户名为vagrant、密码为vagrant的账号登陆的。但是在执行命令前不加sudo
就常常会导致权限问题。因此可以通过如下方式,将默认账号改为root:
密码方式登陆
先使用vagrant账号登陆进系统,然后su -
切换成root用户,root用户的密码默认为vagrant
修改/etc/ssh/sshd_config
文件,修改为或添加如下配置,然后 systemctl reload sshd
重启sshd服务
如果是密码方式登陆:
PermitRootLogin yes
PasswordAuthentication yes
如果是证书方式登陆:
PermitRootLogin yes
PubkeyAuthentication yes
最后编辑Vagrantfile文件,添加如下配置,vagrant reload
后重新vagrant ssh
即可
如果是密码方式登陆:
config.ssh.username = 'root'
config.ssh.password = 'vagrant'
如果是证书方式登陆:
config.ssh.username= "root"
config.ssh.private_key_path="~/.ssh/id_rsa"
private_key_path如果不显示声明的话,vagrant就会报错:
Authentication failure. Retrying...
PHPStorm目前并不支持Vagrant文件的语法高亮。使用IntelliJ打开项目,然后安装一个ruby插件,就可以实现语法高亮了
vagrant实战
- 打造一个自定义的vagrant
- 配置好lamp和lnmp环境
- 能够运行YII2、Laravel、ThinkPHP
1. 初始化启动虚拟机
vagrant默认的root密码为vagrant,为了便于记忆,我们将虚拟机中的各个软件的密码都设置为vagrant
2. 软件安装
- nginx
- mysql
- php
3. 高级知识
- 端口转发,实现宿主机与虚拟机端口的映射,要求宿主机的端口设置必须大于1024
按照如下配置,我们即可在宿主机上通过8080端口,去访问虚拟机中80端口的内容
config.vm.network "forwarded_port", guest: 80, host: 8080
- 共享目录,可以实现代码和资源文件的同步
4. 打包分发
打包前需要vagrant halt
虚拟机,注意打包文件的输出目录一定不要放在vagrant数据同步的目录内,原因你懂的。。。
vagrant package --output xxx.box
vagrant package --output xxx.box --base 虚拟机名称
如果我们给别人了1.0版本的box,然后又分发了一个2.0的box,老用户想升级的话,此时可以由发行者在Vagrantfile文件的shell部分编写升级脚本.
如果我们通过sudo vagrant up
创建了一个vm,但是使用vagrant status
来读取vmzhuang tai
The VirtualBox VM was created with a user that doesn't match the
current user running Vagrant. VirtualBox requires that the same user
be used to manage the VM that was created. Please re-run Vagrant with
that user. This is not a Vagrant issue.
The UID used to create the VM was: 502
Your UID is: 501
别人拿到打包的.box文件,使用如下命令即可使用了
vagrant init siguoya.box
vagrant up
5. 常用配置
Vagrant.configure("2") do |config|
# https://docs.vagrantup.com.
config.vm.box = "centos/7"
config.vm.hostname = "centos"
config.vm.box_check_update = false
config.disksize.size = "60GB"
# config.vm.network "forwarded_port", guest: 80, host: 8080
# 配置private_network的好处:
# - 不需要配端口转发,突破端口转发宿主机端口设置不能小于1024的问题
# - 可以使用nfs进行文件同步,避免出现文件类型不一致的问题
# 记得不要和宿主机所在的网段冲突,例如我的宿主机为192.168.88.66,然后将ip设成192.168.88.168的时候就导致虚拟机无法启动了
# 设置auto_config为true,是为了打包分发别人的时候,避免私有ip导致的问题,保障能够正常使用
config.vm.network "private_network", ip: "192.168.33.10", auto_config: true
#由于VM的bug,需要将nginx的sendfile设置为false,不然可能会导致代码不能立即生效
#10.15 以前 config.vm.synced_folder "/usr/project/code", "/usr/project/code", :nfs => true
config.vm.synced_folder "/System/Volumes/Data/usr/local/coding/code", "/usr/local/coding/code", type: "nfs" , nfs_version: 3, nfs_udp: false
#由于虚拟机内外文件系统不一致,vagrant默认的文件夹同步会报错,因此通过如下方式进行禁止
config.vm.synced_folder ".", "/vagrant", :disabled => true
config.vm.provider "virtualbox" do |vb|
vb.name = "vagrant_siguoya"
vb.memory = "2048"
vb.cpus = "2"
end
end
配置了nfs同步之后,vagrant up
会要求输入密码,如果不想输入密码,可以 sudo vi /etc/sudoers
添加如下内容:
# VAGRANT
Cmnd_Alias VAGRANT_EXPORTS_ADD = /usr/bin/tee -a /etc/exports
Cmnd_Alias VAGRANT_NFSD = /sbin/nfsd restart
Cmnd_Alias VAGRANT_EXPORTS_REMOVE = /usr/bin/sed -E -e /*/ d -ibak /etc/exports
%admin ALL=(root) NOPASSWD: VAGRANT_EXPORTS_ADD, VAGRANT_NFSD, VAGRANT_EXPORTS_REMOVE
常见问题
如果/etc/exports
的文件内容如下:
# VAGRANT-BEGIN: 501 79c27c9a-9f3f-4ac7-b2b1-fb453217fb92
"/usr/project/code" 192.168.33.10 -alldirs -mapall=501:20
# VAGRANT-END: 501 79c27c9a-9f3f-4ac7-b2b1-fb453217fb92
# VAGRANT-BEGIN: 501 0b26c233-7623-4acd-931a-670b8ecbfcd4
"/usr/project/code/zy108830/docker-demo/vagrant-network/labs" 192.168.205.10 -alldirs -mapall=501:20
# VAGRANT-END: 501 0b26c233-7623-4acd-931a-670b8ecbfcd4
就会报错:
NFS is reporting that your exports file is invalid. Vagrant does this check before making any changes to the file. Please correct the issues below and execute "vagrant reload":
exports:5: /usr/project/code/zy108830/docker-demo/vagrant-network/labs conflicts with existing export /usr/project/code
If you had some previous images/boxes installed in your VirtualBox installation, so there were a few invalid entries in /etc/exports
already. So you had to clean up that file and restart your Vagrant box.
sudo rm /etc/exports && sudo touch /etc/exports
vagrant halt && vagrant up --provision