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


原文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版本的發行!功能預覽剛剛結束,我們很高興很快就可以發布了。

 

詳細使用往下看


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM