開發環境管理利器Vagrant

引言

不知道你是否經歷過,開發環境與生產環境不一致、Windows開發和Linux上的包效果不同、在我這運行時好的啊 等等等問題,那有沒有解決方法呢?html

答案就是Vagrant、Dockerdocker

一、簡介

1.1 什麼是Vagrant?

Vagrant是一種在單個工做流程中構建和管理虛擬機環境的工具。經過易於使用的工做流程並專一於自動化,Vagrant下降了開發環境的設置時間,提升了生產一致性,並使「在個人機器上工做」成爲過去的遺留物。shell

Vagrant經過虛擬機相關平臺更加高級的一種管理形式,直接經過平臺api進行管理,而你只須要準備好你的文件就能夠了。centos

Vagrant將在一個一致的環境中隔離依賴關係及其配置,而不會犧牲您習慣使用的任何工具(編輯器,瀏覽器,調試器等)。一旦您或其餘人建立了單個 Vagrant文件,您只須要vagrant up安裝並配置全部內容便可使用。團隊的其餘成員使用相同的配置建立他們的開發環境,所以不管您是在Linux,Mac OS X仍是Windows上工做,您的全部團隊成員都在同一環境中運行代碼,針對相同的依賴項,全部組件都配置相同辦法。告別「在個人機器上工做」的錯誤。api

1.2 Vagrant與Docker對比

Vagrant是一個專一於跨多個操做系統提供一致的開發環境工做流的工具。Docker是一種容器管理,只要存在容器化系統,就能夠始終如一地運行軟件。瀏覽器

容器一般比虛擬機更輕,所以啓動和中止容器很是快。Docker在MAC OS,Linux和Windows上使用本機容器化功能。安全

目前,Docker缺少對某些操做系統(如BSD)的支持。若是您的目標部署是這些操做系統之一,Docker將不會提供與Vagrant之類的工具相同的生產相同的體驗。Vagrant還容許您在Mac或Linux上運行Windows開發環境。ruby

對於微服務繁重的環境,Docker可能頗有吸引力,由於您能夠輕鬆啓動單個Docker VM並快速啓動多個容器。這是Docker的一個很好的用例。Vagrant也可使用Docker提供程序執行此操做。Vagrant的主要好處是一致的工做流程,但在不少狀況下,純Docker工做流程確實有意義。服務器

Vagrant和Docker都擁有龐大的社區貢獻「Image」或「Box」庫供您選擇。網絡

對於開發環境若是沒有上Docker平臺的話,咱們是很是建議使用Vagrant的,相對於Docker具備更加原生的體驗。

1.3 安裝Vagrant

Vagrant是一個管理工具,經過Ruby開發,直接經過官方下載對應的安裝包便可。傳送門:https://www.vagrantup.com/downloads.html

這裏的平臺工具咱們推薦使用VirtualBox,固然它還支持其餘平臺,自行研究了。

這裏安裝方式都比較簡單,咱們推薦使用最新版本便可。以確保兼容性。

二、Vagrant快速入門

本章節咱們經過Vagrant快速構建咱們的開發環境平臺,咱們會設計到經常使用的知識;這裏個人環境以下:

  • Windows 10 操做系統
  • Vagrant + VirtualBox 都是最新版本
  • GitBash 用來代替Windows10操做系統上的傳統Bash

固然沒有GitBash只要熟悉傳統Bash就能夠了,我推薦安裝GitBash來代替CMD,在絕大多數的場景下都是不錯的選擇。

2.1 準備Box

咱們徹底不須要從頭來安裝一個操做系統,龐大的社區已經幫助咱們只完成了相關能夠直接使用的Box,咱們只須要經過以下命令添加便可:

$ vagrant box add centos/7
==> box: Loading metadata for box 'centos/7'
    box: URL: https://vagrantcloud.com/centos/7
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) libvirt
3) virtualbox
4) vmware_desktop

Enter your choice: 3      # <== 選擇平臺
==> box: Adding box 'centos/7' (v1902.01) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/1902.01/providers/virtualbox.box
    box: Download redirected to host: cloud.centos.org
    box: Progress: 0% (Rate: 57869/s, Estimated time remaining: 3:06:12)

這裏我選擇CentOS7的Box由於CentOS接近咱們的生產,我使用這個,若是網絡很差的小夥伴能夠複製上面的連接,使用迅雷等工具下載便可。

連接: https://vagrantcloud.com/centos/boxes/7/versions/1902.01/providers/virtualbox.box

以後咱們手工添加一下就能夠了

vagrant box add /e/迅雷下載/CentOS-7-x86_64-Vagrant-1902_01.VirtualBox.box --name centos/7

若是同局域網的小夥伴那怎麼搞呢?能夠作一個HTTP放進去就能夠了。這裏就不在作過多的介紹了。

2.2 建立一個項目

建立一個項目咱們初始化Vagrant配置就能夠了。

$ mkdir vagrant_getting_started
$ cd vagrant_getting_started

初始化Vagrant

$ vagrant init centos/7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

這裏我使用的是GitBash, 若是使用cmd建立目錄的話請自行查找; init 後面是指定的Box的Name

這裏會在當前目錄下建立一個Vagrantfile配置文件,不要慌張,後面咱們會介紹。

2.3 啓動Box和SSH

啓動Box,咱們能夠直接在當前目錄下執行以下命令可使其服務啓動

$ vagrant up

執行完成後咱們能夠打開virtualbox,是否是啓動了一臺虛擬機呢?

那咱們如何鏈接虛擬機呢,若是你仔細觀察就會發現日誌中有以下展現:default: 22 (guest) => 2222 (host) (adapter 1) 這個是建立了一個端口映射,咱們能夠經過SSH鏈接工具進行鏈接,固然Vagrant提供了一個ssh接口能夠直接經過以下命令就能夠登陸機器了

$ vagrant ssh

目前整體來講,Windows系列 Win10以前的操做系統不支持這個操做。 默認虛擬機的SSH經過私鑰認證,私鑰存放的文件就在當前目錄下的.vagrant目錄之中。

登陸完成後就和虛擬是同樣的了,能夠經過exit進行退出。

2.4 同步目錄

默認狀況下咱們在本地進行開發,提交到虛擬使用的是同步目錄這個功能,默認會有一個default的同步目錄在/vagrant和/home/vagrant家目錄;Vagrant支持的同步模式有:Rsync、SMB、NFS、virtualbox本身支持的服務

很遺憾Rsync和NFS在Windows上不支持,可使用SMB,相對於virtualbox性能更高;可是對於我只是Coding來講virtualbox本身就夠用了。

若是使用virtualbox還須要注意關閉Nginx和Apache的sendfile,以下:

In Nginx:
sendfile off;

In Apache:
EnableSendfile Off

由於virtualbox有可能會損壞這些文件。

咱們能夠在配置文件中增長兩行以下配置在config模塊之中

config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.synced_folder ".", "/opt/devops", create: true

上面的一行表示關閉默認的Vagrant同步目錄,我通過很久調試也不能成功,最後咱們直接棄用,多是使用GitBash的問題吧,有解決的小夥伴也能夠@我,第二行我增長一個同步目錄,表示將當前目錄同步到服務器/opt/devops目錄下。

更多相關參數能夠查詢官方文檔:https://www.vagrantup.com/docs/synced-folders/basic_usage.html

Windows配置完成這兩行還不行,你可能須要安裝一個插件:vagrant plugin install vagrant-vbguest

配置完成後,咱們只須要reload一下虛擬機就能夠生效。

$ vagrant reload

爲了驗證效果你能夠建立文件,來測試:

Administrator@SKY-20180619MUG MINGW64 ~/vagrant_getting_started
$ vagrant.exe ssh
Last login: Mon Mar 18 07:18:08 2019 from 10.0.2.2
[vagrant@localhost ~]$ touch /opt/devops/v.f
[vagrant@localhost ~]$ logout
Connection to 127.0.0.1 closed.

Administrator@SKY-20180619MUG MINGW64 ~/vagrant_getting_started
$ ls
v.f  Vagrantfile

2.5 訪問服務

默認Vagrant提供了三種網絡機制:端口映射、專有網絡、公有網絡

  • 端口映射:單機開發最經常使用的一種網絡模式,也是咱們本文會說起到的重點;
  • 專有網路:通常多用於本地虛擬機集羣使用,也是很是有用的;
  • 公有網路:相似橋接網絡,應用場景較少,安全性也沒有特別好的保證。

咱們如何配置端口映射呢, 只須要增長以下配置就能夠了:

config.vm.network :forwarded_port, guest: 80, host: 4567

Guest表示虛擬機的端口,host表示映射在宿主機上的端口。

2.6 配置機器資源

默認機器只有一個核心512M的內存,是在不夠用,那咱們如何配置呢,且看以下配置:

config.vm.provider "virtualbox" do |vb|
     vb.memory = "1024"
     vb.cpus = 2
   end

config模塊之中增長如上配置, 重啓服務便可生效, 另外咱們給服務器添加一個名字

config.vm.hostname = "demo"

2.7 主機初始化

你可能會發現,爲何時區是UTC不是CST,字符集是英文等等,咱們接下來就開始配置它。

配置字符集:(字符集配置經過ENV指定就能夠了,添加在config模塊之上)

ENV["LC_ALL"] = "en_US.UTF-8"

如何配置時區呢,咱們能夠經過Vagrant提供的初始化命令來搞定就能夠了,看配置。

config.vm.provision "shell", inline: <<-SHELL
     ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
   SHELL

這個功能很是的強大,咱們這裏只是皮毛,更加詳細的能夠查看官方文檔。

檢驗

$ vagrant.exe ssh
Last login: Mon Mar 18 08:17:14 2019 from 10.0.2.2
[vagrant@demo ~]$ date
Mon Mar 18 08:23:15 UTC 2019

爲何這裏沒有生效呢,緣由就是這個模塊只在主機啓動的地址次生效,若是想讓這個模塊再次執行須要經過以下命令重啓虛擬機:

$ vagrant reload --provision

三、主機打包

若是咱們將Box更高了不少,那麼經過provision來初始化比較困難,咱們能夠直接在封裝咱們的Box便可。

第一步:進入VirtualBox的安裝目錄

第二步:執行以下命令

$ ./VBoxManage.exe list vms
"devops" {7d1da681-b04e-469c-bfd2-488cdc1ce789}
"vagrant_getting_started_default_1552893022395_22364" {c60854df-69fc-48f2-8533-5f7479f121fc}

這裏咱們須要的就是VM的名字,固然了你經過UI直接Copy也是能夠的

第三步:打包當前VM

$ vagrant package --base vagrant_getting_started_default_1552893022395_22364 --output ./MyCentOS7.box

這裏須要一些時間,請耐心等待。

第四步:若是須要能夠add到本地Box便可。

第五步:應用方式在init時指定便可。

第六步:如何分發呢?創建一塊HTTP服務就能夠。

四、最後個人實例配置

實例配置以下:

$ cat Vagrantfile
ENV["LC_ALL"] = "en_US.UTF-8"
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.hostname = "demo"
  config.vm.network :forwarded_port, guest: 80, host: 4567
  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.synced_folder ".", "/opt/devops", create: true

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.cpus = 2
  end

  config.vm.provision "shell", inline: <<-SHELL
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  SHELL
end

私鑰位置以下:

.vagrant/machines/default/virtualbox/private_key

終於能夠愉快的開發了。

相關文章
相關標籤/搜索