精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

1+1>2:用Docker和Vagrant構建簡潔高效開發環境

譯文
云計算
Docker和Vagrant經常被認為是兩種相互替代的工具,其實它們可以結合使用,構建隔離的、可重復的開發環境。我們將證明該環境可以構建一個Docker容器以便開發Java應用程序,并充分利用Vagrant的強大功能,以解決一些現實當中的實際問題。

Docker和Vagrant經常被認為是兩種相互替代的工具,其實它們可以結合使用,構建隔離的、可重復的開發環境。我們將證明該環境可以構建一個Docker容器以便開發Java應用程序,并充分利用Vagrant的強大功能,以解決一些現實當中的實際問題。

1+1>2:用Docker和Vagrant構建簡潔高效開發環境

這篇博客的第一部分探討了開發環境的常見缺陷、簡單Docker環境的構建以及Vagrant+Docker配置具有的優點。但是如果你想就開始使用Docker和Vagrant,不妨直接跳到本文的這個章節:使用Vagrant,讓Docker容器易于移植。

開發環境有什么問題?

要花很長的時間來構建

新的開發人員要花多長時間才能構建好當前項目的開發環境?答案取決于諸多因素(項目時間、從事該項目的開發人員數量等),但至少需要半天時間并不罕見。

嘿!其實應該比這快得多:查看腳本,執行腳本。就是這樣。這兩個步驟應該足以構建你的環境,并準備隨時開發。

它可能與測試環境和生產環境大不一樣

你有沒有因構建的環境在機器上未通過而跳過自動化測試?或者更糟糕的是,即使更改的內容在機器上順利編譯,但是在持續整合(CI)服務器上老是失敗,你有沒有查過問題的根源出在哪里?

任何稍有不同,就會導致意料不到的行為。有的方法可能很簡單,比如試一試框架的上一個版本,或者改用不同的項目。

查明什么導致你的系統出現不同行為是每個開發人員都應該避免的煩人任務。

虛擬機和Docker

因而,開發環境應該具有兩個特點:

隔離:你不希望在測試某個新工具或不同項目時弄得一團糟。

可重復:同一個環境應該在每個團隊成員的機器、持續整合服務器和生產服務器上都一再可復制。

虛擬機環境確保了這些特性,可是典型的虛擬機很耗費資源。開發人員需要每隔幾分鐘編碼/構建/測試,不會接受虛擬化帶來的開銷。

這時候,Docker顯得大有幫助。相比典型的虛擬機,其輕型容器極其快速,而且在開發人員當中極受歡迎。下面是來自Docker博客的一段摘要,解釋了這種成功的原因:

 在問世后的頭12個月內,Docker在初創企業和早期采用者當中迅速流行起來,他們重視該平臺的這一功能,即可以將應用程序開發管理的問題與基礎設施提 供、配置和運營的問題分離開來。Docker為這些早期用戶提供了一種新穎的、更迅速的方法,可以構建分布式應用程序,另外提供了一種“編寫一次到處運 行”的部署選擇,部署對象從筆記本電腦、裸機、虛擬機到私有云/公有云,不一而足。

使用Docker來配置的、可重復的開發環境

為了舉例說明,我們將構建一個構建并測試Vert.x HTTP服務器的Docker容器。

Vert.x是一種輕型應用程序框架,鼓勵小型、獨立微服務的架構。微服務“就是一種小巧的獨立式可執行程序,可與其他的獨立式可執行程序進行溝通”(Uncle Bob,http://blog.cleancoder.com/uncle-bob/2014/09/19/MicroServicesAndJars.html)。我們認為,它在Docker容器中再合適不過了,這就是為什么我們在此選擇它作為例子。

要是你之前還沒有安裝過Docker,先安裝它。你可以參閱官方文檔(https://docs.docker.com/installation/),或者使用get docker script(https://get.docker.io)來安裝它。我們假設在本章節中,我們在Linux上運行。即使Docker也可以安裝到Windows和Mac上(借助boot2docker),我們會在下一章中看到如何使用Vagrant來安裝、為什么Vagrant是一種更好的選擇。

#p#

Docker文件(Dockerfile)

為了描述容器,我們需要一個Docker文件:

FROM ubuntu:14.04

# 安裝開發工具:jdk和git等

  1. RUN apt-get update 
  2.  
  3. RUN apt-get install -y openjdk-7-jdk git wget 

# jdk7是默認JDK

  1. RUN ln -fs /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java /etc/alternatives/java 

# 安裝vertx

  1. RUN \ 
  2.  
  3. mkdir -p /usr/local/vertx && cd /usr/local/vertx && \ 
  4.  
  5. wget http://dl.bintray.com/vertx/downloads/vert.x-2.1.2.tar.gz -qO - | tar -xz 

# 將vertx添加到路徑

  1. ENV PATH /usr/local/vertx/vert.x-2.1.2/bin:$PATH 
  2.  
  3. RUN mkdir -p /usr/local/src 
  4.  
  5. WORKDIR /usr/local/src 
  6.  
  7. CMD ["bash"

Docker文件確實簡單直觀,當你需要更深入地挖掘時,有一份出色的在線參考手冊(https://docs.docker.com/reference/builder/)。

FROM ubuntu:14.04定義了我們依賴的基本映像。你可以在docker中心(registry.hub.docker.co)找到Docker基本映像的完整列表。就這個例子而言,我們使用了docker團隊構建Docker所用的基本映像。

后面幾行描述了將應用到基本映像上的改動:

  • 使用apt-get安裝開發工具:openjdk、git、wget
  • 下載和安裝vertx
  • 將vertx二進制文件夾添加到路徑
  • 創建文件夾/usr/local/src,并讓它成為默認的工作目錄

一旦我們拷貝了Docker文件,就可以構建Docker映像:

  1. $ sudo docker build -t=vertxdev . 

獲得源代碼

我們剛構建的映像已安裝了git。我們可以用它從Github獲取源代碼:

  1. $ sudo docker run -t --rm -v /src/vertx/:/usr/local/src vertxdev git clone https://github.com/vert-x/vertx-examples.git 

請注意:git在容器里面運行,源代碼因而在容器里面傳送(確切的位置是在文件夾/usr/local/src)。為了讓代碼具有持續性,即使在容器停止和刪除之后,我們也可以使用標志-v /src/vertx/:/usr/local/src,將容器的文件夾/usr/local/src綁定掛載到主機文件夾/src/vertx。一旦git clone命令完成了執行,--rm”就銷毀容器。

構建并運行應用程序

由于源代碼已獲取,我們將啟動新的容器,這個容器負責構建并運行vertx示例:HelloWorldServer。要注意:vertx run同時負責vertx應用程序的構建和執行。

  1. $ sudo docker run -d -v /src/vertx/:/usr/local/src -p 8080:8080 vertxdev vertx run vertx-examples/src/raw/java/httphelloworld/HelloWorldServer.java 

與前一個容器相反,這個容器在停止后不會被銷毀,暴露端口8080(-p 8080:8080),在后臺運行(-d)。若想看一看vertx run的輸出結果:

  1. $ sudo docker logs 
  2.  
  3. Succeeded in deploying verticle 

不妨使用curl,從主機端測試應用程序:

  1. $ curl localhost:8080 
  2.  
  3. Hello World 

這個簡單例子應該足以體現出運行Docker容器有多快速。在Docker容器里面運行git clone和vertx run的開銷可忽略不計。

但構建的這個環境很基本。在現實環境中,純Docker配置存在一些不足,而Vagrant就有助于克服這些不足。

#p#

Docker + Vagrant

Docker(其實是作為Docker模塊的libcontainer)仍需要Linux內核3.8或更高版本和x86_64架構。這在大大限定了Docker能夠原生運行在其中的環境。

Vagrant是一種開源軟件,它為跨眾多操作系統構建可重復的開發環境提供了一種方法。Vagrant使用提供者(provider)來啟動隔離的虛擬環境。默認的提供者是Virtualbox;自v1.6以來,基于docker的開發環境也得到支持。相比幫助Docker在非Linux平臺上運行的其他工具(比如boot2docker),Vagrant具有一些重大優點:

配置一次,即可到處運行:Vagrant就是原生支持Docker的系統上的Docker封裝器,同時它可啟動“主機虛擬機”,以便在不支持它的系統上運行容器。用戶沒必要操心Docker是不是得到原生支持:同一個配置可適用于每一個操作系統。

  • Docker主機并不局限于boot2docker(Tiny Core Linux的Virtualbox映像),但Debian、Ubuntu、CoreOS及其他Linux發行版也得到支持。而且可以在比Virtualbox更穩定的虛擬機管理器(比如VMware)上運行。
  • Vagrant可以編排Docker容器:同時運行多個容器,并且把它們聯系起來。

1+1>2:用Docker和Vagrant構建簡潔高效開發環境

在Linux及其他操作系統上使用Vagrant運行Docker

在下面三個章節中,我們將探討這每一個要點。

使用vagrant,讓Docker容器易于移植

Vagrant可支持Docker,既作為提供者,又作為配置者。但是為了讓它可以在Windows和Mac上自動創建Docker主機虛擬機,應該將它用作提供者。

我們將重復使用我們在上面見到的同一個Docker文件。與上面一樣,我們將運行兩個Docker容器,以便執行git clone和vertx run。不過將改而使用Vagrant命令,而不是Docker命令。

安裝Vagrant(https://www.vagrantup.com/downloads)和Virtualbox(https://www.virtualbox.org/wiki/Downloads),以便能夠運行示例。

Vagrantfile

Vagrantfile描述了Vagrant設備。我們將使用下列內容:

  1. ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker' 
  2.  
  3. Vagrant.configure("2"do |config| 
  4.  
  5. config.vm.define "vertxdev" do |a| 
  6.  
  7. a.vm.provider "docker" do |d| 
  8.  
  9. d.build_dir = "." 
  10.  
  11. d.build_args = ["-t=vertxdev"
  12.  
  13. d.ports = ["8080:8080"
  14.  
  15. d.name = "vertxdev" 
  16.  
  17. d.remains_running = true 
  18.  
  19. d.cmd = ["vertx""run""vertx-examples/src/raw/java/httphelloworld/HelloWorldServer.java"
  20.  
  21. d.volumes = ["/src/vertx/:/usr/local/src"
  22.  
  23. end 
  24.  
  25. end 
  26.  
  27. end 

ENV'VAGRANT_DEFAULT_PROVIDER' = 'docker' 讓我們不必在每個Vagrant命令中指定提供者是Docker(默認提供者是Virtualbox)。該文件的其余部分擁有Vagrant構建Docker映像和運行容器所用的選項。想了解更多信息,請參閱Vagrantfilehttps://docs.vagrantup.com/v2/vagra...(https://docs.vagrantup.com/v2/vagrantfile/index.html)和Docker提供者(https://docs.vagrantup.com/v2/docker/configuration.html)說明文檔。

獲得源代碼

一旦我們將Vagrantfile拷貝到Dockerfile文件夾中,我們可以運行git clone,以獲取源代碼:

  1. $ vagrant docker-run vertxdev -- git clone https://github.com/vert-x/vertx-examples.git 

與之前一樣,git clone完成執行后,容器將被銷毀。請注意:我們還沒有構建映像,Vagrant自動構建了映像。減少了手動步驟。

構建并運行應用程序

我們能夠構建并運行HTTP Hello World服務器:

  1. $ vagrant up 

在底層,Vagrant將執行docker run,啟動容器的命令由d.cmd選項指定。

想獲得vertx run命令的輸出結果:

  1. $ vagrant docker-logs 
  2.  
  3. ==> vertxdev: Succeeded in deploying verticle 

測試

在Linux平臺上,只要運行:

  1. $ curl localhost:8080 
  2.  
  3. Hello World 

在Windows和Mac上,端口8080并不從Docker主機虛擬機被轉發到主vagrant主機(不過Docker容器端口被轉發到Docker主機)。因而,我們需要通過ssh進入到Docker主機虛擬機,以便連接至HTTP服務器。不妨檢索Vagrant默認Docker主機的ID:

  1. $ vagrant global-status 
  2.  
  3. id name provider state directory 
  4.  
  5. ------------------------------------------------------------------------------------------------------- 
  6.  
  7. c62a174 default virtualbox running /Users/mariolet/.vagrant.d/data/docker-host 

一旦檢索到該設備,我們可以測試HTTP服務器了:

  1. $ vagrant ssh c62a174 -c "curl localhost:8080" 
  2.  
  3. Hello World 

#p#

你有說過一模一樣嗎?如何定制Docker主機?

在不支持容器的平臺上,默認情況下,Vagrant啟動一個Tiny Core Linux(boot2docker)Docker主機。如果我們的持續整合環境、試運行環境或生產環境不運行boot2docker,我們會在這些環境的配置之間有一個缺口。這實際上是生產環境缺陷的根源,不可能在開發環境中發現。不妨試著解決這個問題。

1+1>2:用Docker和Vagrant構建簡潔高效開發環境

不同環境上的不同Docker主機:實際上違反安全

如上所見,Vagrant的主要便利之一是,它讓我們可以指定自定義的Docker主機。換句話說,我們并不被boot2docker和Tiny Core Linux所束縛。

Docker主機虛擬機Vagrantfile

我們將使用一個新的Vagrantfile來定義Docker主機虛擬機。下面這個文件基于Ubuntu Server 14.04 LTS:

  1. Vagrant.configure("2"do |config| 
  2.  
  3. config.vm.provision "docker" 
  4.  
  5. # 下面這一行終結所有ssh連接,因此 
  6.  
  7. # Vagrant將被迫重新連接。 
  8.  
  9. # 那是在PATH中擁有docker命令的替代辦法 
  10.  
  11. config.vm.provision "shell", inline: 
  12.  
  13. "ps aux | grep 'sshd:' | awk '{print $2}' | xargs kill" 
  14.  
  15. config.vm.define "dockerhost" 
  16.  
  17. config.vm.box = "ubuntu/trusty64" 
  18.  
  19. config.vm.network "forwarded_port"
  20.  
  21. guest: 8080, host: 8080 
  22.  
  23. config.vm.provider :virtualbox do |vb| 
  24.  
  25. vb.name = "dockerhost" 
  26.  
  27. end 
  28.  
  29. end 

將它保存到原始的Vagrantfile文件夾,名稱為DockerHostVagrantfile。

在自定義的Docker主機中運行Docker容器

下一步指定使用這個新的虛擬機作為Docker主機,而不是默認主機,因而將下面新的兩行添加到a.vm.provider代碼段:

  1. config.vm.define "vertxdev" do |a| 
  2.  
  3. a.vm.provider "docker" do |d| 
  4.  
  5. [...] 
  6.  
  7. d.vagrant_machine = "dockerhost" 
  8.  
  9. d.vagrant_vagrantfile = "./DockerHostVagrantfile" 
  10.  
  11. end 
  12.  
  13. end 

請注意:配置自定義的Docker主機有另一個好處:我們現在可以指定自定義的轉發端口:

  1. config.vm.network "forwarded_port"
  2.  
  3. guest: 8080, host: 8080 

因而,我們能夠從主主機操作系統里面訪問vertx HTTP服務器:

1+1>2:用Docker和Vagrant構建簡潔高效開發環境

不同環境上同樣的Docker主機和端口轉發

當然,主機虛擬機并不局限于Ubuntu。可以在Vagrant云(https://vagrantcloud.com)上發現更多的vagrant設備。值得關注的支持Docker的設備有boot2docker(原始版和改良版)和CoresOS。

#p#

使用Vagrant編排Docker容器

就在不久前,我們還每次只能運行一個Docker容器。然而在現實生活中,我們卻常常需要同時運行多個容器:數據庫、http、Web容器等都在單獨的容器中運行。

我們在本章節將探討使用Vagrant“多機器”環境(https://docs.vagrantup.com/v2/multi-machine/),同時執行多個docker容器。然而,我們不會考慮Docker容器分布在不同的Docker主機這一場景:所有容器都在同一個主機里面運行。

運行多個容器

1+1>2:用Docker和Vagrant構建簡潔高效開發環境

多個容器

作為第一個例子,我們將使用Vert.x Event Bus Point to Point這個例子。我們利用了在文章開頭定義的同一個Docker文件,并且在新的Vagrantfile文件里面配置了兩個Docker容器:“vertxreceiver”和“vertxsender”:

  1. ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker' 
  2.  
  3. DOCKER_HOST_NAME = "dockerhost" 
  4.  
  5. DOCKER_HOST_VAGRANTFILE = "./DockerHostVagrantfile" 
  6.  
  7. Vagrant.configure("2"do |config| 
  8.  
  9. config.vm.define "vertxreceiver" do |a| 
  10.  
  11. a.vm.provider "docker" do |d| 
  12.  
  13. d.build_dir = "." 
  14.  
  15. d.build_args = ["-t=vertxreceiver"
  16.  
  17. d.name = "vertxreceiver" 
  18.  
  19. d.remains_running = true 
  20.  
  21. d.cmd = ["vertx""run""vertx-examples/src/raw/java/eventbus_pointtopoint/Receiver.java","-cluster"
  22.  
  23. d.volumes = ["/src/vertx/:/usr/local/src"
  24.  
  25. d.vagrant_machine = "#{DOCKER_HOST_NAME}" 
  26.  
  27. d.vagrant_vagrantfile = "#{DOCKER_HOST_VAGRANTFILE}" 
  28.  
  29. end 
  30.  
  31. end 
  32.  
  33. config.vm.define "vertxsender" do |a| 
  34.  
  35. a.vm.provider "docker" do |d| 
  36.  
  37. d.build_dir = "." 
  38.  
  39. d.build_args = ["-t=vertxsender"
  40.  
  41. d.name = "vertxsender" 
  42.  
  43. d.remains_running = true 
  44.  
  45. d.cmd = ["vertx""run""vertx-examples/src/raw/java/eventbus_pointtopoint/Sender.java","-cluster"
  46.  
  47. d.volumes = ["/src/vertx/:/usr/local/src"
  48.  
  49. d.vagrant_machine = "#{DOCKER_HOST_NAME}" 
  50.  
  51. d.vagrant_vagrantfile = "#{DOCKER_HOST_VAGRANTFILE}" 
  52.  
  53. end 
  54.  
  55. end 
  56.  
  57. end 

對這兩個docker容器而言,vagrant_mahchine即Docker主機虛擬機的ID是dockerhost。Vagrant要足夠智能化,才能重復使用dockerhost的同一個實例來運行兩個容器。

想啟動vertxsender和vertxreceiver,把Vagrantfile換成這一個文件,并運行vagrant up:

  1. $ vagrant up 
  2.  
  3. ... 
  4.  
  5. $ vagrant docker-logs 
  6.  
  7. ==> vertxsender: Starting clustering... 
  8.  
  9. ==> vertxsender: No cluster-host specified so using address 172.17.0.18 
  10.  
  11. ==> vertxsender: Succeeded in deploying verticle 
  12.  
  13. ==> vertxreceiver: Starting clustering... 
  14.  
  15. ==> vertxreceiver: No cluster-host specified so using address 172.17.0.19 
  16.  
  17. ==> vertxreceiver: Succeeded in deploying verticle 
  18.  
  19. ==> vertxreceiver: Received message: ping! 
  20.  
  21. ==> vertxsender: Received reply: pong 
  22.  
  23. ==> vertxreceiver: Received message: ping! 
  24.  
  25. ==> vertxreceiver: Received message: ping! 
  26.  
  27. ==> vertxsender: Received reply: pong 
  28.  
  29. ==> vertxsender: Received reply: pong 
  30.  
  31. ... 

即使vertxsender和vertxreceiver根本不知道彼此的主機名和IP地址,vertx eventbus協議卻有一項發現功能,以便連接發送方和接收方。對于沒有類似功能的應用程序而言,Docker提供了容器連接選項。

#p#

連接容器

在這個例子中,我們先運行Docker容器(vertxdev),它啟動我們之前看到的那個HelloWorld Web服務器。然后,第二個容器(vertxdev-client)將使用wget執行HTTP請求:

  1. ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker' 
  2.  
  3. Vagrant.configure("2"do |config| 
  4.  
  5. config.vm.define "vertxdev" do |a| 
  6.  
  7. a.vm.provider "docker" do |d| 
  8.  
  9. d.image = "vertxdev:latest" 
  10.  
  11. d.ports = ["8080:8080"
  12.  
  13. d.name = "vertxdev" 
  14.  
  15. d.remains_running = true 
  16.  
  17. d.cmd = ["vertx""run""vertx-examples/src/raw/java/httphelloworld/HelloWorldServer.java"
  18.  
  19. d.volumes = ["/src/vertx/:/usr/local/src"
  20.  
  21. d.vagrant_machine = "dockerhost" 
  22.  
  23. d.vagrant_vagrantfile = "./DockerHostVagrantfile" 
  24.  
  25. end 
  26.  
  27. end 
  28.  
  29. config.vm.define "vertxdev-client" do |a| 
  30.  
  31. a.vm.provider "docker" do |d| 
  32.  
  33. d.image = "vertxdev:latest" 
  34.  
  35. d.name = "vertxdev-client" 
  36.  
  37. d.link("vertxdev:vertxdev"
  38.  
  39. d.remains_running = false 
  40.  
  41. d.cmd = ["wget","-qO""-","--save-headers","http://vertxdev:8080"
  42.  
  43. d.vagrant_machine = "dockerhost" 
  44.  
  45. d.vagrant_vagrantfile = "./DockerHostVagrantfile" 
  46.  
  47. end 
  48.  
  49. end 
  50.  
  51. end 

這個新Vagrantfile文件的重要部分是這一行d.link("vertxdev:vertxdev")。由于這一行,vertxdev-client就能夠解析主機名vertxdev,因而使用命令wget -qO - --save-headers http://vertxdev:8080,處理HTTP請求。

想運行容器,把Vagrantfile換成這個新文件,并運行vagrant up.。--no-parallel選項確保vertxdev容器在vertxdev-client之前啟動。

  1. $ vagrant up --no-parallel 

不妨看一下日志,以證實發生的情況:

  1. $ vagrant docker-logs 
  2.  
  3. ==> vertxdev: Succeeded in deploying verticle 
  4.  
  5. ==> vertxdev-client: HTTP/1.1 200 OK 
  6.  
  7. ==> vertxdev-client: Content-Type: text/plain 
  8.  
  9. ==> vertxdev-client: Content-Length: 11 
  10.  
  11. ==> vertxdev-client: 
  12.  
  13. ==> vertxdev-client: Hello World 

#p#

伙計,我的IDE在哪里?

雖然集成開發環境(IDE)是開發環境的一個重要部分,但我們還沒有討論它。那是由于圖形化應用程序并不通常在Docker容器里面運行。Eclipse或IntelliJ等IDE在主主機中通常很適合,源代碼在主機和容器之間使用Docker卷來共享。這就是本章節所介紹的內容。

Vagrant隨帶synced_folder選項,以便在docker容器和主主機之間共享文件夾:

  1. ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker' 
  2.  
  3. Vagrant.configure("2"do |config| 
  4.  
  5. config.vm.synced_folder ".""/usr/local/src" 
  6.  
  7. config.vm.define "vertxdev-src" do |a| 
  8.  
  9. a.vm.provider "docker" do |d| 
  10.  
  11. d.build_dir = "." 
  12.  
  13. d.build_args = ["-t=vertxdev"
  14.  
  15. d.ports = ["8080:8080"
  16.  
  17. d.name = "vertxdev-src" 
  18.  
  19. d.remains_running = true 
  20.  
  21. d.cmd = ["vertx""run""vertx-examples/src/raw/java/httphelloworld/HelloWorldServer.java"
  22.  
  23. d.vagrant_machine = "dockerhost" 
  24.  
  25. d.vagrant_vagrantfile = "./DockerHostVagrantfile" 
  26.  
  27. end 
  28.  
  29. end 
  30.  
  31. end 

在這個例子中,vertxdev-src文件夾/usr/local/src將與主主機Vagrantfile文件夾(.)同步。請注意:Vagrant負責為我們構建Docker卷。

一旦我們把Vagrantfile換成這一個文件,就可以運行git clone,再次使用vertxdev-src容器:

  1. $ vagrant docker-run vertxdev-src -- git clone https://github.com/vert-x/vertx-examples.git 

一旦克隆完畢,源代碼將同時出現在容器和主主機。因而,我們可以直接訪問,還可以編輯文件:

  1. $ cd vertx-examples/src/raw/java/httphelloworld/ 
  2.  
  3. $ sed -i '' 's/Hello World/I m in a docker container and I feel good/' HelloWorldServer.java 

想測試該應用程序,運行vagrant up:

  1. $ cd - 
  2.  
  3. $ vagrant up 
  4.  
  5. $ curl localhost:8080 
  6.  
  7. I m in a docker container and I feel good 

結束語

如果你在處理一系列不同的平臺:一些平臺支持Docker,另一些不支持,那么使用Vagrant來控制Docker容器很有用。在這種場景下,使用Vagrant可以讓構建環境的過程在不同平臺上具有一致性。

作為Vagrant的替代方案,Fig(http://www.fig.sh)無疑值得關注。Docker雇用Fig的主要開發人員,大力支持它,將其視作一種構建基于Docker的開發環境的出色工具。

原文標題:Setting up a development environment using Docker and Vagrant

責任編輯:Ophira 來源: 51CTO
相關推薦

2011-03-17 13:33:35

虛擬化網絡交換機H3C

2012-09-24 09:35:31

APUCPUGPU

2018-02-01 21:18:40

戴爾

2013-05-16 10:07:42

固態硬盤RAID 0三星840 Pro

2020-06-22 10:21:44

物聯網藍牙技術

2015-07-21 14:07:51

微軟云計算Office 365

2016-04-19 11:56:48

中國新聞網

2010-09-07 17:02:39

家庭布線

2014-12-15 10:19:17

2020-06-08 15:41:00

邊緣計算數據中心5G

2021-02-02 09:50:51

紫光云

2018-01-21 23:14:09

戴爾

2019-12-23 14:14:47

5GAI人工智能

2020-10-21 17:27:44

IT技術遠程工作

2022-01-19 15:16:33

區塊鏈加密貨幣代幣

2025-04-07 07:00:00

2016-06-22 12:30:48

聯想

2015-03-30 18:22:38

開發環境API構建

2016-01-27 09:48:44

無線覆蓋無線路由器

2015-11-06 10:31:08

物聯網5G
點贊
收藏

51CTO技術棧公眾號

少妇欧美激情一区二区三区| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 日韩影片中文字幕| 久久在线免费观看| 国产精品ⅴa在线观看h| wwwww黄色| 国产激情综合| 亚洲国产精品天堂| 欧美精品七区| 中文字幕黄色av| 日韩激情在线| 欧美高清视频一二三区 | 国产视频第一页在线观看| 青青草一区二区三区| 久久福利视频网| 亚洲香蕉中文网| 午夜精品成人av| **欧美大码日韩| 国内一区二区在线视频观看| 中文字幕手机在线视频| 国产精品久久天天影视| 欧美va在线播放| 日韩精品免费播放| 伊人影院蕉久影院在线播放| a级精品国产片在线观看| 日本中文字幕不卡免费| 婷婷色中文字幕| 视频一区在线观看| 精品久久一区二区三区| 国产精彩免费视频| 欧美xxxx少妇| 中文字幕+乱码+中文字幕一区| 999国产视频| 91视频久久久| 一区在线播放| 日韩中文字幕久久| 国产精品jizz| 亚洲精品18| 欧美视频一区二区在线观看| 高清无码一区二区在线观看吞精| 国产小视频在线| 国产成人午夜片在线观看高清观看 | 国产精品扒开腿做爽爽| 亚洲精品在线a| 欧美日韩免费在线视频| 乱子伦视频在线看| 欧美日韩国产观看视频| 亚洲欧美日韩一区| 亚洲精品视频一二三| 午夜福利一区二区三区| 国产精品一区二区黑丝| 国产精品专区第二| 日韩电影在线观看一区二区| 亚洲婷婷在线| 欧美不卡视频一区发布| 日本免费www| 国产成人精品免费视| 亚洲成人黄色网| 精产国品一二三区| 91成人精品观看| 欧美系列亚洲系列| 亚洲欧美另类动漫| 伊人久久国产| 日韩欧美黄色动漫| 久久福利一区二区| gogogo高清在线观看免费完整版| 狠狠色狠狠色综合| 国产噜噜噜噜噜久久久久久久久 | www.色就是色| 欧美日韩尤物久久| 欧美性大战久久久久久久| 成人在线激情网| 在线毛片观看| 色综合久久88色综合天天免费| 欧美成人高潮一二区在线看| 亚洲大胆人体大胆做受1| 日韩理论在线观看| 综合色婷婷一区二区亚洲欧美国产| 国产在线视频网| 久久久久国产免费免费| 国产一区免费| 水中色av综合| 久久只精品国产| 欧美日韩亚洲在线| 国产三级视频在线看| 欧美国产视频在线| 亚洲自拍三区| 超碰在线免费播放| 亚洲国产视频一区| 噜噜噜久久亚洲精品国产品麻豆| 性欧美18~19sex高清播放| 欧美性69xxxx肥| www黄色在线| 欧美另类激情| 欧美成人a∨高清免费观看| 一级全黄裸体片| 免费精品一区| 欧美va亚洲va| 国产精品一级黄片| 超碰成人久久| 欧美xxxx18性欧美| 天天综合网入口| 老牛影视一区二区三区| 日韩美女在线观看一区| 亚洲熟女乱色一区二区三区久久久| 美女视频一区在线观看| 亚洲永久在线观看| 五月婷婷丁香六月| 国产日韩欧美不卡| 亚洲一区 在线播放| av毛片午夜不卡高**水| 欧美午夜精品一区二区三区| 国产欧美精品一二三| 久久久亚洲欧洲日产| 伊人久久精品视频| 久久久精品99| 日本中文一区二区三区| av一区观看| 久久手机免费观看| 亚洲免费观看高清在线观看| www.av片| 亚洲二区av| 日韩理论片久久| 99成人在线观看| 亚洲视频播放| 97在线资源站| 午夜激情视频在线观看| 亚洲成人免费视| www.com久久久| 啪啪激情综合网| 欧美精品制服第一页| 久久精品女人毛片国产| 国产精品毛片| 91精品视频免费看| 日韩在线视频观看免费| 国产欧美中文在线| 国产精品第157页| 四虎成人精品一区二区免费网站| 亚洲国产欧美日韩精品| 99久久久无码国产精品不卡| 中文欧美日韩| 国产成人免费观看| 浪潮av一区| 欧美在线看片a免费观看| 野战少妇38p| 亚洲澳门在线| 国产黑人绿帽在线第一区| 天堂国产一区二区三区| 亚洲美女视频在线观看| 8x8x最新地址| 亚洲免费观看高清完整版在线观| 欧美人在线视频| 一炮成瘾1v1高h| 欧美极品少妇xxxxⅹ高跟鞋| 黄色片视频在线免费观看| 99国产精品免费网站| 麻豆成人在线看| 亚洲中文字幕在线观看| 欧美国产欧美综合| 狠狠操精品视频| 国产精品亚洲片在线播放| 午夜精品久久久99热福利| 亚洲国产精品久久久久久6q| 伊人色综合久久天天人手人婷| 在线观看中文av| 午夜精品视频一区二区三区在线看| 国产精品视频网址| 国产精品一级伦理| 色呦呦一区二区三区| 新91视频在线观看| 日韩精品三区四区| 五月天色一区| 日韩色性视频| 久久精品电影网站| 97人妻精品一区二区三区视频| 国产精品乱码久久久久久 | 久久国产婷婷国产香蕉| 亚洲成人第一| 国产精品久久久久久久久久久久久久久 | 18av在线播放| 亚洲成人1234| 美日韩一二三区| 久久嫩草精品久久久久| 成人黄色一区二区| 国产精品久久久久久久久久10秀| 成人午夜激情免费视频| 性欧美videos高清hd4k| 日韩一区二区在线播放| 日本亚洲欧美在线| 久久精品亚洲乱码伦伦中文| 男人的天堂日韩| 香港欧美日韩三级黄色一级电影网站| 亚洲一区中文字幕| ririsao久久精品一区| 日韩激情片免费| 日韩国产亚洲欧美| 亚洲视频中文字幕| 一二三区视频在线观看| 黑丝一区二区| 欧美日韩在线不卡一区| 国产精品美女午夜爽爽| 欧美日韩福利在线观看| 欧美一级特黄aaaaaa| 色婷婷一区二区| 麻豆明星ai换脸视频| 99国产精品国产精品久久| 久久婷婷国产91天堂综合精品| 国产精品久久久久无码av| 国产精品自拍首页| 超碰超碰人人人人精品| 日韩中文av在线| 99热精品在线播放| 在线区一区二视频| 成人性生活毛片| 2021中文字幕一区亚洲| 思思久久精品视频| 亚洲专区免费| 丰满人妻一区二区三区53号| 精品一区欧美| 97久久天天综合色天天综合色hd | 久久亚洲影音av资源网| 四虎在线免费看| 欧美一级日韩免费不卡| 免费视频久久久| 日韩美女视频一区| 亚洲の无码国产の无码步美| 精品在线免费视频| 久草在在线视频| 亚洲第一黄网| 五月天男人天堂| 久久99国产精品视频| 99免费在线观看视频| 成人黄色毛片| 日本欧美在线视频| 国精一区二区三区| 自拍偷拍亚洲欧美| 日本在线视频1区| 日韩欧美国产小视频| 制服丝袜在线一区| 色综合激情五月| 国产视频91在线| 亚洲综合在线免费观看| av免费播放网站| 91丝袜国产在线播放| 无码人妻一区二区三区精品视频| 性娇小13――14欧美| 青青视频免费在线| 波多野结衣在线观看一区二区三区| 高清av免费一区中文字幕| 成人国产精品| 国产99在线|中文| 亚洲女色av| 亚洲91精品在线观看| 超碰在线caoporn| x99av成人免费| 日本a级在线| 中文字幕在线成人| 成人欧美亚洲| 亚洲精品一区二区三区婷婷月 | 欧美尤物美女在线| 一个人看的www久久| 免费人成在线观看网站| 日韩不卡中文字幕| 亚洲精品无amm毛片| 欧美性猛交xxxx乱大交退制版| www.天天色| 亚洲激情校园春色| 国产在线视频卡一卡二| 亚洲动漫第一页| 久久精品国产亚洲av无码娇色| 伊人夜夜躁av伊人久久| 久久久久99精品成人片毛片| 一区二区成人在线| 久久网免费视频| 亚洲成人av免费| 日韩在线观看第一页| 日韩欧美黄色动漫| 五月激情丁香网| 欧美日韩精品一区二区三区四区 | 亚洲风情在线资源站| 男人天堂中文字幕| 狠狠综合久久av一区二区小说| 国产一级片毛片| 色国产精品一区在线观看| 尤物视频免费观看| 精品视频一区 二区 三区| 91精品国产色综合久久不8| 69精品人人人人| 国模私拍视频在线| 精品国产一区二区三区忘忧草 | 美女视频在线免费| 国产成人啪精品视频免费网| 国产极品嫩模在线观看91精品| 成人乱色短篇合集| www.久久东京| 久久一区二区三区欧美亚洲| 国产91精品对白在线播放| 日韩成人av电影在线| 天天综合一区| 成人黄色大片网站| 视频一区视频二区中文字幕| 在线观看岛国av| 国产a级毛片一区| 久久久亚洲av波多野结衣| 国产精品毛片久久久久久| 清纯粉嫩极品夜夜嗨av| 色综合久久久久网| 国产精品无码一区二区桃花视频 | 亚洲免费av网站| 天天综合网久久综合网| 日本国产一区二区| av在线亚洲天堂| 亚洲另类激情图| 超碰在线caoporen| 国产成人av在线播放| 国产95亚洲| 久久青青草原| 天天做天天爱天天综合网| 国模吧无码一区二区三区| 久久99精品久久久久久动态图| 菠萝菠萝蜜网站| 亚洲视频资源在线| 五月婷婷激情视频| 日韩视频不卡中文| 嫩草精品影院| 久久国产精品网站| 日韩在线短视频| 国产精品日本一区二区| 欧美电影免费观看高清| 久久av综合网| 久久最新视频| 欧美污在线观看| 欧美国产一区二区在线观看| 国产麻豆视频在线观看| 婷婷久久综合九色综合绿巨人| 国产乱淫av免费| 国产亚洲一区二区精品| 亚洲精品成人图区| 狠狠色狠狠色综合人人| 91成人精品| wwwwxxxx日韩| 2021久久国产精品不只是精品| 久久久一二三区| 欧美日韩国产成人在线免费| 天堂91在线| 97视频在线看| 国产色噜噜噜91在线精品| 四虎免费在线观看视频| 日本网站在线观看一区二区三区| 法国伦理少妇愉情| 欧美视频在线观看 亚洲欧| 亚洲AV无码乱码国产精品牛牛| 久久久精品一区二区| 国产精品麻豆成人av电影艾秋| 欧洲一区二区在线观看| 国产精品亚洲欧美| 色婷婷精品久久二区二区密| 亚洲桃色在线一区| 亚洲视频在线免费播放| 精品亚洲一区二区三区| 国产第一页在线视频| 亚洲伊人第一页| 天天综合网网欲色| 少妇一级淫免费播放| 国产精品视频免费看| 国产性生活视频| 亚洲精品一线二线三线| yw在线观看| 国产一区二区香蕉| 狠久久av成人天堂| 中文字幕日韩三级片| 欧美色手机在线观看| 蜜桃成人365av| 欧美亚洲精品日韩| 久久99蜜桃精品| 国产污片在线观看| 国产亚洲欧洲黄色| 伊人久久噜噜噜躁狠狠躁| 国模吧无码一区二区三区| 自拍偷拍欧美激情| 色播色播色播色播色播在线 | 午夜视频一区二区在线观看| 免费成人午夜视频| 国产精品少妇自拍| 欧美一区,二区| 国产精品一区二区久久| 亚洲大片在线| 肉色超薄丝袜脚交69xx图片| 亚洲第一色在线| 国内欧美日韩| 久久国产亚洲精品无码| 亚洲欧洲av色图| 欧美婷婷久久五月精品三区| 91日本在线视频| 丝袜国产日韩另类美女| 久久久久久久久久一区二区三区 | 亚洲欧美成人影院| 日韩精品最新在线观看| 成人福利电影精品一区二区在线观看| 五月天中文字幕|