前言
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 協議》,轉載必須註明作者和本文連結