什么是vargrant?
vagrant是一個構件虛擬開發環境的工具。他用於創建部署虛擬的開發環境;
白話:使用vagrant來創建和管理虛擬機的,而裝虛擬機的文件由運維組對開發環境做的一個box的鏡像。
這樣做的目的,省去了我們搭建開發環境,直接裝一個虛擬機,把正在使用的開發環境的鏡像還原進去。
當然使用vagrant最主要解決的一個問題就是,讓開發環境同步。“代碼在我機子上運行沒有問題”這種說辭將成為歷史。
看下圖,其中,第一種是直接在物理機上裝 Hypervisor,然后再該層上安裝我們自己的虛擬機,第二種是先在物理機上裝任意一個操作系統,然后在此基礎上安裝 Hypervisor,再然后再該層上安裝我們自己的虛擬機,我們大部分用 Vmware 都是第二種,Vagrant就是第一種,微軟自帶的hyper-v ;
vagrant 的構成
- base box:vagrant使用的基礎鏡像文件,可以理解為Vagrant中使用的Linux的鏡像文件;
- providers:鏡像文件安裝在哪個虛擬機上,vagrant 必須依賴於 Provide,Provide有:vmware、virtualbox、hyper-v,其中,vmware是收費,vartualbox是免費,推薦、hyper-v是微軟自帶的;
- provisioners 啟動時、啟動后,去執行一些shell腳本(如配置網絡、安裝軟件環境等)
Vagrant 和 Docker 有什么區別?
Vagrant 對應的是VM層面的,而Docker對應的是Container
vagrant安裝
1、安裝 providers,你有兩種選擇,vritualbox 和 hyper-v,如果你是window10及以上系統,那么建議使用hyper-v,否則請您使用 vartualbox
如果是用微軟自帶的hyper-v,則你需要看:https://docs.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/about/;
如果你是用virtualBox,則你需要安裝它,https://www.virtualbox.org/wiki/Downloads;vmware因為收費不推薦;
2、安裝vagrant,https://www.vagrantup.com/downloads.html
檢查是否成功安裝:vagrant --version
通過vagrant安裝box鏡像
離線方式(強烈推薦)
1、下載box文件
vagrant部署環境時,需要一個box文件。如果是在公司里面,可以從他們那里拷一個box文件安裝。這樣安裝的環境與他們是一致的。即模擬了一個開發環境。box文件也可以在網上下載。如:
在 http://www.vagrantbox.es/ 或 https://app.vagrantup.com/boxes/search 上找到適合你自己的box,然后將box文件下載下來;
2、把box文件添加到虛擬機
新建一個目錄,將下載好的box鏡像文件丟入里面,在里面用poershell運行(需要管理員身份運行):
//添加box鏡像文件到虛擬機中
vagrant box add centosMix CentOS-7.1.1503-x86_64-netboot.box --provider=[hyperv|vertualbox]
或者你也可以不用下載下來,而是通過:
vagrant box add centosMix https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7.box
3、初始化虛擬機box文件
# centosMix 是上面命令中我們自定義的虛擬機名稱 vagrant init centosMix
執行完上面的命令之后,可以在目錄下看到一個已經生成的vagrantFile文件。這是一個配置文件,里面包含該虛擬機的一些配置信息,其實就幾行而已,你可以去掉注釋后看到。
4、啟動虛擬機
vagrant up --provider=hyperv --color # 注意,安裝到hyper上而不是virtualbox中 如果是 用virtualbox虛擬機的話,就寫成: vagrant up --provider=virtualbox --color
注意輸出的信息,一般的,virtualbox的ip為127.0.0.1 端口為2222,而hyperv的ip為其顯示的ip,端口是22;
判斷是否成功安裝:vagrant status
進行完上面步驟后,就可以像使用服務器一樣,遠程到虛擬機了。可以使用的工具有xshell工具,winscp等工具。
初始安裝的時候后,遠程的時候,使用的IP是127.0.0.1 端口號是2222(看輸出信息知道的)。這些信息可以后續在進行設置。如果嫌麻煩,也可以修改vagrantFile文件之后,在進行安裝。默認中的賬號密碼都為:vagrant
在線方式(國內用戶不推薦)
略
常用命令
vagrant up
啟動或創建(第一次)虛擬機
vagrant stauts
檢查虛擬機狀態
vagrant ssh <name>
通過ssh連接
vagrant ssh-config
查看ssh配置信息
vagrant suspend/resume/reload/hat <name>
暫停suspend / 重啟resume、重載reload、停止halt(停止的虛擬機需要 up 啟動)
vagrant destroy <name>
刪除/移除 虛擬機
vagrant destroy -f 強制刪除所有虛擬機
已經刪除的虛擬機,其所在的目錄中的 .vagrant 也最好刪除掉;
.vagrant 的目錄結構
> tree /F D:. │ Vagrantfile │ └─.vagrant ├─machines 虛擬機目錄 │ └─default 我們創建的虛擬機名稱,默認為default │ └─hyperv 我們default虛擬機provider,為 hyperv,即:default虛擬機是通過 hyperv 創建的 │ │ action_configure │ │ action_provision │ │ action_set_name │ │ box_meta │ │ creator_uid │ │ id │ │ index_uuid │ │ private_key ssh的登陸密鑰key │ │ synced_folders │ │ vagrant_cwd │ │ │ └─Virtual Hard Disks 虛擬機的磁盤文件 │ generic-ubuntu2004-hyperv.vhdx │ └─rgloader loader.rb
Box 文件目錄在哪兒?
一般在 用戶目錄下的 .vagrant.d 目錄中:
C:\Users\用戶名\.vagrant.d\
C:\Users\用戶名\.vagrant.d>tree /F C:. │ insecure_private_key │ setup_version │ ├─boxes // box就存放在這里 │ ├─hyperv │ │ └─0 │ │ └─hyperv │ │ │ info.json │ │ │ metadata.json │ │ │ Vagrantfile │ │ │ │ │ ├─Virtual Hard Disks │ │ │ generic-ubuntu2004-hyperv.vhdx │ │ │ │ │ └─Virtual Machines │ │ box.xml │ │ D90B1531-23A2-4D41-957F-8593E9356E69.vmcx │ │ D90B1531-23A2-4D41-957F-8593E9356E69.vmgs │ │ D90B1531-23A2-4D41-957F-8593E9356E69.VMRS │ │ │ └─ubuntu │ └─0 │ └─hyperv │ │ info.json │ │ metadata.json │ │ Vagrantfile │ │ │ ├─Virtual Hard Disks │ │ generic-ubuntu2004-hyperv.vhdx │ │ │ └─Virtual Machines │ box.xml │ D90B1531-23A2-4D41-957F-8593E9356E69.vmcx │ D90B1531-23A2-4D41-957F-8593E9356E69.vmgs │ D90B1531-23A2-4D41-957F-8593E9356E69.VMRS │ ├─data │ │ checkpoint_cache │ │ checkpoint_signature │ │ lock.dotlock.lock │ │ │ └─machine-index │ index │ index.lock │ ├─gems │ └─2.7.4 ├─rgloader │ loader.rb │ └─tmp boxe1394d60c23f1a8b64cfb37d8591b8a521b31cdf
vagrantfile文件的寫法
box的名稱為 centos/7
安裝后設置其hostname為vagrant-demo
安裝的box版本為1905.1(注意:如果本地不存在該版本,會從網上拉取下來)
每次配置 vagrantfile 好后,需要重新創建vagrant;
更多配置前往:https://www.vagrantup.com/docs/vagrantfile 查看
vagrant的ssh連接
我們可以在 vagrantfile 目錄下使用命令 vagrant ssh 來登陸我們的虛擬機而不需要輸入用戶名和密碼,這是為什么?
執行vagrant ssh 命令后,vagrant會找 當前目錄的.vagrant目錄中的private.key文件,來登陸對應的虛擬機;注意:public.key 在創建linux時被注入到linux中了;
你也可以通過 vagrant ssh-config 來查看當前所在的虛擬機的信息;
有些時候,我們需要通過用戶名密碼來登陸虛擬機中,而vagrant在安裝虛擬機時應將使用密碼來登陸的功能禁用了,vagrant的本意就是建議我們最好通過private_key來登陸虛擬機,但是我們就像用密碼,如何設置?
1、先用 vagrant ssh 登陸我們的虛擬機中(也就是先用 private_key 登陸我們的虛擬機)
2、在虛擬機中的 /etc/ssh/sshd_config 中,將 PermitRootLogin由no改為yes,保存
3、重啟sshd服務:sudo service sshd restart
4、完畢,你可以退出,然后使用賬號密碼(都為vagrant)登陸到虛擬機了;
但是,我們還是建議你在生產環境中使用private_key來登陸到虛擬機中;
使用ssh的技巧(推薦設置)
我們輸入 vagrant ssh-config 命令,輸出的內容是可以被我們的ssh所使用的,也就是說,在任何目錄中都能夠快速的登陸到我們虛擬機中,而不需要先進入到 vagrantfile 目錄中;
在 C:\Users\用戶名\.ssh\ 目錄中,新建一個 config 文件(如果不存在,注意沒有文件名后綴),將上面紅色框起來的內容復制到 config 文件中,修改 第一行 Host default,default 可以改為你熟悉的名字,比如這里是 hlinux;
這樣,你就可以在任何目錄中使用 ssh hlinux 來直接登錄到虛擬機中了;
注意:hyper-v 新建的虛擬機的ip地址是不固定的,可能會在你重啟電腦的時候變動,這時候使用 ssh hlinux 就無法登陸到虛擬機了,記得改ip即可;
insecure_private_key
所有創建出來的虛擬機,都可以使用 insecure_private_key 來連接到虛擬機中(vagrant在安裝虛擬機的時候創建一個public_key安裝在虛擬機中,對應的private_key就是:insecure_private_key 了);
insecure_private_key文件 存在哪里?
C:\Users\用戶名\.vagrant.d\ 下
但是,我們並現在並不能通過 insecure_private_key 來連接到虛擬機,因為在你安裝虛擬機時,vagrant會自己生成一個 一對private_key 和 public_key,public_key 注入到虛擬機,private_key 替換 insecure_private_key 了,如下圖:
每台虛擬機目錄中都有自己的 private_key文件:
而我想要的是以后所有創建出來的虛擬機都是用統一的 insecure_private_key 來登錄,如何做?要想禁止 vagrant 去生成每個虛擬機自己的 key,就想是用 insecure_private_key,可以在每個 vagrantfile 中添加一句話:
這樣,每次通過這個 vagrantfile 來生成虛擬機時,都不會生成自己獨有的 key,而是使用統一使用 insecure_private_key 文件來登錄到虛擬機中;
上圖中已經沒有 生成替換使用自己的key的信息了;
insecure_private_key 對應的 public_key 在虛擬中哪里呢?/home/vagrant/.ssh/authorized_keys,如下圖:
一個vagrantfile創建多台虛擬機並對每個虛擬機單獨設置
上圖中配置了需要創建了兩台虛擬機,第一台名為 web,且設置hostname和box_version,第二台名為 db,只設置了hostname,box_version將會使用全局的 1905.1 這個版本;
使用循環來設置多台虛擬機(更加靈活)
hyper-v 同步文件夾
宿主機的Vagrantfile所在的當前目錄同步到虛擬機中的 /vagrant 目錄中,同步的類型為smb
下面代碼,是適配了 用 virtualbox 和 hyperv 兩種provider的文件同步:
vagrant box 的操作(重要)
vagrant box 的存放是在:C:\Users\用戶名\.vagrant.d\ 下的;
命令:
vagrant box list 列出所有已經安裝的box
vagrant box add centos/7 下載 centos/7 這個box
vagrant box remove centos/7 [--provider=hyperv] 刪除centos/7這個box