乐趣区

关于virtualbox:22-vagrantVirtualBox-for-Mac

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
退出移动版