Vagrant 搭建 CentOS 环境
前言
macos 作为开发环境已经相当方便,有很丰富的工具,如 homebrew
很方便地安装各种开发工具。但终究与线上生产环境不同,即便安装的是相同的软件,安装目录,管理方式都有所不同。当项目很复杂,或者有多个项目时,很容易将mac本地环境弄得乱七八糟。
为了能与线上生产环境一致,尝试过用 docker, 由于我对dokcer的了解还太少,使用起来诸多不便
衡量各种方案后,最终选择用 vagrant 与 virtualBox 搭建一个完整的 linux 系统,这样能够与线上生产环境一致,也能很方便地进行移植。
环境准备
-
下载安装 virtualBox
-
下载安装 vagrant
-
使用迅雷下载 官方镜像
我选择的是 centos7.2 的镜像
安装
新建目录centos
,作为vagrant的根目录
- 导入下载的镜像
$ vagrant box add centos ~/Downloads/vagrant-centos-7.2.box # 将box命名为centos
- 初始化
$ vagrant init
会自动生成Vagrantfile
配置文件
修改配置文件
- 设置box名称
box名称须与上面命令指定的box名一致
config.vm.box = "centos"
- 端口转发
config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
macos不允许将本机的80端口转发, 解决方案参照: mac设置端口转发
- 开启nfs
默认的virtualBox共享文件速度太慢,需要启用 nfs 支持
Vagrantfile 设置:
config.vm.network "private_network", type: "dhcp"
config.vm.synced_folder "mac 主机的绝对路径", "centos 虚拟机的绝对路径", :nfs => true, :mount_options => ['actimeo=2']
- 设置内存
内存大小根据物理机内存设置,建议不要超过物理机内存的一半
如果要安装mysql5.7,内存不能低于2G
config.vm.provider "virtualbox" do |vb|
vb.memory = "3072"
end
配置示例
config.vm.box = "centos"
config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
config.vm.network "forwarded_port", guest: 3306, host: 33060, host_ip: "127.0.0.1"
config.vm.network "forwarded_port", guest: 5000, host: 5000, host_ip: "127.0.0.1"
config.vm.network "private_network", type: "dhcp"
config.vm.synced_folder "/Users/senlongzhong/code", "/www/web/", :nfs => true, :mount_options => ['actimeo=2']
config.vm.synced_folder "/Users/senlongzhong/Downloads", "/home/vagrant/Downloads", :nfs => true, :mount_options => ['actimeo=2']
config.vm.provider "virtualbox" do |vb|
vb.memory = "4096"
end
启动与连接
启动虚拟机
$ vagrant up
默认情况下,vagrant 会用 ssh 与物理机建立连接,如果提示连接不上,按 ctrl + c 先跳过验证,直接用账号密码(两者默认都是 vagrant )登录
登入虚拟机
$ vagrant ssh
通过 vagrant ssh-config
可查看私钥的路径
可以用vagrant默认生成的key,也可以将自己的私钥替换到 IdentityFile 指定的文件,连接虚拟机后再将公钥放到虚拟机中的
~/.ssh/authorized_keys
默认的共享挂载目录:/home/vagrant
常用vagrant命令
-
vagrant up 启动
-
vagrant ssh 进入虚拟机
-
vagrant halt 关机
-
vagrant reload 重启
-
导出与导入
$ vagrant package --base centos_default_1533259579120_24934 --out centos7.2.box # 导出box
$ vagrant box add centos ./centos7.2.box # 导入box
清空重新导入镜像
当需要重新导入镜像时,为避免出现各种奇奇怪怪的问题,清空以下内容:
# 将现有的box删除
$ vagrant box list
centos (virtualbox, 0)
$ vagrant box remove centos
$ vagrant global-status --prune
$ rm -rf .vagrant
$ rm -rf Vagrantfile
$ cd ~/VirtualBox VMs
$ ls
centos_default_1534145188471_82398
$ rm -rf ./*
删除 vagrant
$ sudo rm -rf /opt/vagrant
$ sudo rm -f /usr/local/bin/vagrant
$ sudo pkgutil --forget com.vagrant.vagrant
重启电脑后,再重新导入镜像
填坑记录
以下是遇到的一些坑,因人因系统而异,不一定会遇到
nginx不同步本地修改的静态文件
同一个文件,本地修改后,centos虚拟机能看到同步的修改,但怎么刷新都看不到变化,只有在centos里面再修改文件才有效。而动态文件,如php文件修改后实时能看到变化
解决:
将nginx.conf的配置修改:
sendfile off;
apache也有相同问题,修改配置:
EnableSendfile off
本作品采用《CC 协议》,转载必须注明作者和本文链接