Vagrant 搭建 CentOS 環境

it書童發表於2019-08-19

前言

macos 作為開發環境已經相當方便,有很豐富的工具,如 homebrew 很方便地安裝各種開發工具。但終究與線上生產環境不同,即便安裝的是相同的軟體,安裝目錄,管理方式都有所不同。當專案很複雜,或者有多個專案時,很容易將mac本地環境弄得亂七八糟。

為了能與線上生產環境一致,嘗試過用 docker, 由於我對dokcer的瞭解還太少,使用起來諸多不便

衡量各種方案後,最終選擇用 vagrant 與 virtualBox 搭建一個完整的 linux 系統,這樣能夠與線上生產環境一致,也能很方便地進行移植。

環境準備

我選擇的是 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 可檢視私鑰的路徑

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

相關文章