1. 程式人生 > >vagrant特性——基於docker開發環境(docker和vagrant的結合)-1-簡介

vagrant特性——基於docker開發環境(docker和vagrant的結合)-1-簡介

原文https://www.hashicorp.com/blog/feature-preview-docker-based-development-environments

Feature Preview: Docker-Based Development Environments

vagrant 1.6版本提供了一個新的內建provider:Docker。Docker提供者允許vagrant管理在容器中執行的開發環境,而不是在虛擬機器中。這在Linux、Mac OS X和Windows上執行是不需要任何附加軟體的。

在Vagrant中的Docker provider 使得你保持在Vagrant和Docker上使用的工作流程變得非常容易,同時還獲得了vagrant的所有好處:跨平臺的可移植性、同步資料夾、網路、預配置程式、vagrant共享、外掛等等。

在本地不支援Linux容器的平臺上,如Mac OS X和Windows, Vagrant會自動開啟並共享一個代理虛擬機器來執行Docker。這個代理VM是完全可定製的,並且Vagrant確保同步資料夾和網路工作如你所料。vagrant的使用者不需要擔心手動執行這些操作。

Docker, With Vagrant

Vagrant是為使用任何技術構建的應用程式管理開發環境的最佳方式。在許多情況下,虛擬機器是最好的答案,所以vagrant已經使用虛擬機器很多年了。但是,Vagrant並不完全與虛擬機器繫結,在某些情況下,容器是最好的選擇。Vagrant通過Docker provider使用Docker構建的Linux容器構建開發環境。

使用vagrant進行開發的Docker使用者可以得到vagrant最出名的東西就是:vagrant工作流(可見本部落格的vagrant之道(即其工作流程))。使用vagrant up命令能夠使得在Linux、Mac或Windows上的開發人員可以獲得一致的開發環境。除了安裝Vagrant之外,沒有其他步驟,沒有單擊,作業系統之間沒有中斷。

由於Vagrant的靈活性,你可以保留相同的工作流來管理不使用Docker的系統。這可能是另一個基於linux的系統,也可能是完全不同的系統,比如基於windows的開發環境。對於vagrant,工作流程總是一樣的。

 

Docker Host VM

Linux容器不能在非Linux機器上本地執行。如果你的開發人員使用的是Mac或Windows,那麼他們就不能本地執行Docker容器。vagrant檢測這些情況,並自動執行Linux虛擬機器來執行Docker容器。
然後,針對所有基於docker的開發環境,vagrant與vagrant共享這個虛擬機器。這意味著僅使用一個虛擬機器,vagrant就可以管理許多Docker環境。

即使是在使用Docker主機虛擬機器時,同步資料夾、SSH和其他一些特性也可以像你預期的那樣在所有平臺上統一工作。
如果Linux上的Docker使用了Vagrant,那麼Vagrant不會自動執行虛擬機器,而是會本地執行Docker。

在預設情況下,Vagrant執行安裝了Docker的預設虛擬機器。但是你也可以指定任何vagrant管理的機器作為Docker主機。一個例子如下:

Vagrant.configure("2") do |config|
  config.vm.provider "docker" do |d|
    d.vagrant_vagrantfile = "../docker-host/Vagrantfile"
  end
end

通過上面的配置,Vagrant將在指定為Docker主機的Vagrantfile中使用預設的機器。這是非常強大的。有了這個特性,就可以讓Vagrant使用其支援的任何作業系統(如Ubuntu、RHEL或CoreOS)自動管理Docker主機。如果需要,還可以針對每個開發環境更改主機VM。
vagrant是聰明的:如果主機VM匹配多個Vagrantfile檔案,那麼單個VM將被共享。如果沒有必要,vagrant不會啟動多個vm。
由於Vagrant只是在幕後重用它來管理這個主機VM,所以你可以使用這個VM的所有特性:provider、同步資料夾、網路等等。這是構建適合你專案的開發環境的最終靈活性。

 

Dockerfiles or Docker Index

Vagrant中的Docker provider很靈活,支援本地dockerfile和Docker索引中的Docker容器。這對於能夠在Dockerfile上進行迭代,同時還可能依賴於索引中的某些內容非常有用。
例如,下面是一個可以用於web開發環境的Vagrantfile檔案:

Vagrant.configure("2") do |config|
  config.vm.define "app" do |app|
    app.vm.provider "docker" do |d|
      d.build_dir = "."
      d.link "db"
    end
  end

  config.vm.define "db" do |app|
    app.vm.provider "docker" do |d|
      d.image = "paintedfox/postgresql"
      d.name = "db"
    end
  end
end

在上面的例子中,我們從Dockerfile構建“app”環境,Dockerfile可能構建web應用程式的容器。然後,該應用程式環境連結到“db”環境,該環境使用“paintedfox/postgresql”映象提供postgresql資料庫。
在這兩種情況下,同步資料夾的工作方式與vagrant一樣,所以資料可以持久化到容器之外,檔案修改可以映象回容器中。

 

Containers with SSH

Docker容器的一般方法是讓每個容器都是一個應用程式,而不是一個完整的多程序系統。在這些情況下,SSH不可用,所以你不能利用vagrant 的特性,例如vagrant SSH、預配置等。但是,如果容器確實支援SSH,那麼所有這些特性都會得到支援併發揮作用。
例如,下面的Vagrantfile使用Phusion建立的baseimage映象,它的行為更像是一個輕量級虛擬機器:

Vagrant.configure("2") do |config|
  config.vm.provider "docker" do |d|
    d.cmd     = ["/sbin/my_init", "--enable-insecure-key"\]
    d.image   = "phusion/baseimage"
    d.has_ssh = true
  end

  config.ssh.username = "root"
  config.ssh.private_key_path = "phusion.key"
end

假設你在適當的位置上有“phusion.key”,上面將啟動容器,等待SSH,執行任何預配置,設定任何主機名等等。
同樣,無論你是本地執行Docker,還是通過Vagrant的自動託管主機VM執行Docker,所有這些特性都可以工作。

 

Docker-Specific Enhancements

到目前為止,將Docker與Vagrant結合使用的行為和工作流程與將vagker與VirtualBox、VMware或EC2等雲服務結合使用的行為和工作流程是相同的。
但是,vagrant 1.6確實引入了一些新命令,這些命令是專門為Docker提供程式而編寫的,目的是為vagrant提供一些額外的實用程式。
docker-logs顯示來自容器的日誌,還允許跟蹤日誌。對於單程序(非ssh)容器,這是觀察程序輸出的好方法。一個例子如下:

$ vagrant docker-logs web
Server listening on port 3000...
GET / 200 62.4ms
GET /images/header.png 200 3.1ms
GET /images/footer.png 200 2.8ms

docker-run允許在新容器中執行一次性命令。與同步資料夾一起,這對於某些環境非常有用。例如,如果你想在Rails環境中執行測試,它可能看起來像這樣:

$ vagrant docker-run web -- rake test:unit

 

Next

Docker provider允許vagrant使用Docker管理的Linux容器管理開發環境。這使得vagrant的使用者可以在有意義的地方使用這種風格的開發,而無需犧牲任何其他開發環境的工作流。
我們現在正接近vagrant 1.6版本的發行!功能預覽剛剛結束,我們很高興很快就可以釋出了。

 

詳細使用往下看