SlideShare a Scribd company logo
1 of 118
Download to read offline
a brief introduction to

    Vagrant
原來 Virtual Box 可以這樣玩


     http://ihower.tw
   2013/4/20@osdc.tw
我是誰?
• 張⽂文鈿 a.k.a. ihower
 •   http://ihower.tw

 •   http://twitter.com/ihower

• Ruby Developer since 2006
• CTO, Faria Systems Ltd.
• The organizer of RubyConf Taiwan
 •   http://rubyconf.tw
We’re hiring
Ruby on Rails developer
Agenda
•   Why?
•   What’s Vagrant
•   Features
    •   Shared Folder
    •   Networking
    •   Provisioning
    •   Pachaging
    •   Multi-VM
    •   More Providers
•   Conclusion
Why?
WebOps
WebOps


• 如何⾃自動化安裝和設定伺服器?
WebOps


• 如何⾃自動化安裝和設定伺服器?
• 需要開機器進⾏行安裝測試
缺點
缺點

• 無論是實體機器或 VPS, AWS EC2
缺點

• 無論是實體機器或 VPS, AWS EC2
• 緩慢的 Feedback loop
缺點

• 無論是實體機器或 VPS, AWS EC2
• 緩慢的 Feedback loop
 • 環境弄髒了,重灌很慢
WebDev
WebDev

• 如何設定開發環境?
WebDev

• 如何設定開發環境?
• 拿到⼀一個新專案,怎樣才能跑起來呢?
WebDev

• 如何設定開發環境?
• 拿到⼀一個新專案,怎樣才能跑起來呢?
 • 看 README
WebDev

• 如何設定開發環境?
• 拿到⼀一個新專案,怎樣才能跑起來呢?
 • 看 README
 • 有 setup script?
WebDev

• 如何設定開發環境?
• 拿到⼀一個新專案,怎樣才能跑起來呢?
 • 看 README
 • 有 setup script?
 • 不斷嘗試錯誤,找出 dependency
WebDev (cont.)
WebDev (cont.)


• 這功能在我電腦上是正常的
WebDev (cont.)


• 這功能在我電腦上是正常的
• 開發環境跟 Production 環境越接近,bug
 就越少
缺點
缺點

• 不總是 works
缺點

• 不總是 works
• 不是⾃自動化
缺點

• 不總是 works
• 不是⾃自動化
• 無法驗證正確
缺點

• 不總是 works
• 不是⾃自動化
• 無法驗證正確
• 不是 Isolated,不同機器環境就不同
缺點

• 不總是 works
• 不是⾃自動化
• 無法驗證正確
• 不是 Isolated,不同機器環境就不同
• 也是很慢
Solution
Virtual Machine
    ⽼老梗: 虛擬化
VM Providers
•   Virtual Box
•   Vmware Fusion
•   Parallels
•   LXC
•   KVM
•   Cloud computing:
    •   AWS EC2
    •   Rackspace Cloud
使⽤用 VM 的好處
使⽤用 VM 的好處
• Isolated
使⽤用 VM 的好處
• Isolated
• Repeatable
使⽤用 VM 的好處
• Isolated
• Repeatable
• Local (i.e. Fast)
使⽤用 VM 的好處
• Isolated
• Repeatable
• Local (i.e. Fast)
• Host-OS agnostic
使⽤用 VM 的好處
• Isolated
• Repeatable
• Local (i.e. Fast)
• Host-OS agnostic
• Anyone can do it (Faster on-boarding)
使⽤用 VM 的好處
• Isolated
• Repeatable
• Local (i.e. Fast)
• Host-OS agnostic
• Anyone can do it (Faster on-boarding)
• Less bugs
Vagrant
http://www.vagrantup.com/
Vagrant
•   Vagrant uses VirtualBox to build configurable,
    lightweight, and portable virtual machines
    dynamically
•   Open Source: MIT license
•   It support more providers recently:
    •   VMware Fusion
    •   AWS EC2
    •   Rackspace
The creator

• Mitchell Hashimoto
• 從 2010 年開始
• 2012/11 成⽴立 Hashicorp 公司作商業⽀支
 持,並提供更多(付費) Providers,包括
 VMware Fusion, Workstation 和 vSphere 等
 等。
Who use it?
•   Mozilla, Firefox
•   BBC News
•   New York Times
•   Openstack
•   NOKIA
•   Livingsocial
•   yammer
•   shopify
•   disqus
•   eventbrite
•   ngmoco
安裝 Vagrant

• 下載安裝 Virtualbox
• 下載安裝 Vagrant
• ⽀支援 Windows, Mac, Linux
Warning for
      Ruby developers

• Vagrant 1.1+ 之後不⽤用 rubygems 安裝了
• 主要理由: For non-rubyist
• http://mitchellh.com/abandoning-rubygems
從現有的專案開 VM

•   git clone git://github.com/eduvo/pair_tdd_get_started.git

• vagrant up
•   可以開始寫 Ruby 了
Live Demo
     請不要在會場做
第⼀一次跑需要下載 VM image, 306mb
新開⼀一個 Ubuntu VM

•   vagrant box add precise64
    http://files.vagrantup.com/precise64.box

•   mkdir my_box

•   cd my_box

•   vagrant init precise64

•   vagrant up
Demo
    真的,請不要在會場做
第⼀一次跑需要下載 VM image, 306mb
VM Lifecycle
              (基本指令)


• vagrant up 開機
• vagrant ssh 登⼊入
• vagrant suspend 暫停
• vagrant halt 關機
• vagrant destroy 刪除
Vagrantfile

• Vagrant 是 project-oriented
• 每個專案都有 Vagrantfile 設定檔
• Ruby DSL 語法,不會 Ruby 也很簡單
最基本的 Vagrantfile
Vagrant.configure("2") do |config|

  config.vm.box = "precise64"

  # 如果找不到上述的 box 檔案,從下列網址下載
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"

end
Base Boxes
• 開 VM 的基本 image
• box 是⼀一個檔案
• Vagrant 是 project-oriented,在 project 裡
  ⾯面玩,不影響 Box。
• 官⽅方有包 Ubuntu 10.04/12.04, 32bit/64bit
  for VirtualBox 的 boxes
• 更多第三⽅方 http://vagrantbox.es
Box 指令

• vagrant box list 列出
• vagrant box add 新增
• vagrant box remove 刪除
進階功能
• Shared Folder
• Networking
• Provisioning
• Packaging
• Multi-VM
• More providers via plugins
Host OS v.s. Guest VM

               Host OS

    Guest VM    Guest VM   Guest VM
How to Work in a VM?
Shared folder
config.vm.share_folder "foo", "/guest/path", "/host/path",
                       :nfs => true
Shared folder
config.vm.share_folder "foo", "/guest/path", "/host/path",
                       :nfs => true


   • 在 host 和 guest 之間共享檔案
Shared folder
config.vm.share_folder "foo", "/guest/path", "/host/path",
                       :nfs => true


   • 在 host 和 guest 之間共享檔案
   • 例如開發⽤用 Editor 在 host 跑,但是程式
      是在 guest 裡執⾏行
Shared folder
config.vm.share_folder "foo", "/guest/path", "/host/path",
                       :nfs => true


   • 在 host 和 guest 之間共享檔案
   • 例如開發⽤用 Editor 在 host 跑,但是程式
      是在 guest 裡執⾏行

   • 預設 guest 裡的 /vargant 就是專案⺫⽬目錄
Shared folder
config.vm.share_folder "foo", "/guest/path", "/host/path",
                       :nfs => true


   • 在 host 和 guest 之間共享檔案
   • 例如開發⽤用 Editor 在 host 跑,但是程式
      是在 guest 裡執⾏行

   • 預設 guest 裡的 /vargant 就是專案⺫⽬目錄
   • VirtualBox shared folder 效能差,Vagrant
      ⽀支援 NFS
Demo
在 Host OS 裡編輯,在 Guest VM 裡⾯面執⾏行
Networking
        以下三種可以依照需求選擇使⽤用,都⽤用也可以




• Port forwarding
• Host-only networking
• Bridged Networding
Port forwarding
config.vm.network :forwarded_port, guest: 80, host: 8080




 • 設定 host 某個 port 對應到 guest 的某個
    port
 • 例如 host 8080 對應到 guest 80
 • 最簡單
Host-only networking
config.vm.network :private_network, ip: "192.168.33.10"



  • 指定⼀一個 IP
  • Gust VMs 之間可以互通
  • Local only,只有本機可以存取
  • 最好⽤用,⼜又安全
  • 缺點: 可能會跟外部 IP 撞到
Bridge Networking
config.vm.network :public_network

 • 將 VM 橋接到 Host OS 上的網路 device
  • ⽤用 DHCP 拿⼀一個 IP
 • 優點: LAN 上的其他電腦也可以存取
 • 缺點: 不總是 works,會依賴 Router,例
   如飯店或 public wifi
Demo
在 Guest VM 裡開 Web Server
在 Host OS 外⽤用瀏覽器讀取
Provisioning
Server provisioning
Server provisioning

• Server provisioning is a set of actions to
  prepare a server with appropriate systems,
  data and software, and make it ready for
  network operation. (from wikipedia)
Server provisioning

• Server provisioning is a set of actions to
  prepare a server with appropriate systems,
  data and software, and make it ready for
  network operation. (from wikipedia)
• 就是裝 server 啦
Old-school
I’m System Administrator
Old-school
     I’m System Administrator



• 寫⽂文件,照著作
Old-school
       I’m System Administrator



• 寫⽂文件,照著作
• "multi-terminal",開⼀一個視窗打指令,同
 時好幾個 servers 都會執⾏行
Old-school
        I’m System Administrator



• 寫⽂文件,照著作
• "multi-terminal",開⼀一個視窗打指令,同
 時好幾個 servers 都會執⾏行

• 建⽴立 .iso image 以便拷⾙貝新機器
Old-school
        I’m System Administrator



• 寫⽂文件,照著作
• "multi-terminal",開⼀一個視窗打指令,同
 時好幾個 servers 都會執⾏行

• 建⽴立 .iso image 以便拷⾙貝新機器
• 缺點:版本維護
Old-school (cont.)
Old-school (cont.)

• 撰寫 setup shell script
Old-school (cont.)

• 撰寫 setup shell script
• 缺點: shell script 不聰明,不好維護
Old-school (cont.)

• 撰寫 setup shell script
• 缺點: shell script 不聰明,不好維護
 •   再跑⼀一次會裝第⼆二次
Old-school (cont.)

• 撰寫 setup shell script
• 缺點: shell script 不聰明,不好維護
 •   再跑⼀一次會裝第⼆二次

 •   套件之間的 dependency 關係
Old-school (cont.)

• 撰寫 setup shell script
• 缺點: shell script 不聰明,不好維護
 •   再跑⼀一次會裝第⼆二次

 •   套件之間的 dependency 關係

 •   套件的設定檔要如何管理?
Modern provisioning
       I’m DevOps
Modern provisioning
                  I’m DevOps

•   利⽤用 Configuration Management tools
Modern provisioning
                  I’m DevOps

•   利⽤用 Configuration Management tools
    •   Chef
Modern provisioning
                  I’m DevOps

•   利⽤用 Configuration Management tools
    •   Chef
    •   Puppet
Modern provisioning
                   I’m DevOps

•   利⽤用 Configuration Management tools
    •   Chef
    •   Puppet
    •   CFEngine
Modern provisioning
                   I’m DevOps

•   利⽤用 Configuration Management tools
    •   Chef
    •   Puppet
    •   CFEngine
•   撰寫 recipe (Chef) 或 manifest (Puppet) 設定要裝
    什麼東⻄西
Modern provisioning
                   I’m DevOps

•   利⽤用 Configuration Management tools
    •   Chef
    •   Puppet
    •   CFEngine
•   撰寫 recipe (Chef) 或 manifest (Puppet) 設定要裝
    什麼東⻄西
•   receipt 和 manifests 可以重複執⾏行,保持 server
    到最新版。不會發⽣生重裝第⼆二遍的情形。
Modern provisioning
       I’m DevOps
Modern provisioning
            I’m DevOps




• 易於設定 dependencies
Modern provisioning
            I’m DevOps




• 易於設定 dependencies
• 易於除錯
Modern provisioning
            I’m DevOps




• 易於設定 dependencies
• 易於除錯
• 版本控制
Modern provisioning
        I’m DevOps




• 易於設定 dependencies
• 易於除錯
• 版本控制
• 社群及商業⽀支援,不需要全部⾃自⼰己寫
Vagrant ⽀支援
         ⽅方便 DevOps 測試 Recipe




• shell
• Chef
• Puppet
• CFEngine
Vagrantfile Example

config.vm.provision :chef_solo do |chef|

      chef.cookbooks_path = "./cookbooks"
      chef.add_recipe "nginx"
      chef.json = { :nginx => { :worker_processes => "4" } }

end
Chef Example
package "nginx"

service "nginx" do
  supports :status => true, :restart => true, :reload => true
  action [:enable, :start]
end

template "/etc/nginx/nginx.conf" do
  source "nginx.conf.erb"
  notifies :reload, "service[nginx]"
end
Demo
修改 nginx template,再次 provision
 Server 就會套⽤用並重開 nginx
Packaging
將⺫⽬目前的 VM 打包成 Box

• vagrant package 產⽣生 package.box 檔案
• vagrant box add <name> package.box
• 使⽤用時機
 • Package up installed software
 • Use provisioners for configuration and
    managing services
Multi-VM
Multi-VM

• 同⼀一個 Vagrantfile 可以設定多個 VM
• vagrant up 就會同時開起來
• 適合 distributed 和 SOA 開發環境
 •   ⼀一台 Web server

 •   多台 Application servers

 •   ⼀一台 Database server
Vagrantfile example
         指定IP,VMs 之間也可以互通
Vagrant.configure("2") do |config|

  config.vm.define :web do |web|
    web.vm.box = "precise64"
    web.vm.network :private_network, :ip => "192.168.33.11"
  end

  config.vm.define :app do |app|
    app.vm.box = "precise64"
    app.vm.network :private_network, :ip => "192.168.33.12"
  end

  config.vm.define :db do |db|
    db.vm.box = "precise64"
    db.vm.network :private_network, :ip => "192.168.33.13"
  end

end
Demo
⼀一次開三台 VMs!
More providers
     via plugins
VMware Fusion

• 更快
• 更穩定
• 需付費購買
AWS
•   同樣的 vagrant up 指令,可以開 VM 在 EC2 或 VPC 上
•   使⽤用情境:
    •   可以開運算能⼒力的 EC2 機器作開發或測試運算
    •   可以開真正 production 使⽤用的機器作測試
    •   從開發、staging 到 production,都⽤用 vagrant 開 VM
        管理
•   無論 providers,Vagrantfile 皆共⽤用
Demo
vagrant up --provider=vmware_fusion
     vagrant up --provider=aws
Conclusion
   使⽤用情境
Conclusion
              使⽤用情境

• DevOps 開發和測試 Chef/Puppet/etc.
 scripts
Conclusion
              使⽤用情境

• DevOps 開發和測試 Chef/Puppet/etc.
 scripts
• WebDev 可以使⽤用上述 DevOps 開發的
 scripts 安裝出⾮非常接近 production 的開
 發環境
Conclusion
              使⽤用情境

• DevOps 開發和測試 Chef/Puppet/etc.
 scripts
• WebDev 可以使⽤用上述 DevOps 開發的
 scripts 安裝出⾮非常接近 production 的開
 發環境
• QA 測試⼯工程師可以使⽤用 CI 搭配 Vagrant
 來建構⾃自動化的部署測試、⼤大規模的 test
 environment 等等
Vagrant 讓整個 workflow
  從 dev 到 production
     變的⼀一致好⽤用
謝謝!
                    Thank you!
(對 Vagrant 或 Chef 有問題歡迎來 Faria 攤位找我們的 DevOps: Vincent)
References
•   http://www.hashicorp.com/blog
•   http://net.tutsplus.com/tutorials/php/vagrant-what-why-
    and-how/
•   O'Reilly Velocity 2012: Develop and Test Configuration
    Management Scripts with Vagrant
•   LARubyconf 2011: Working in Vurtual Machines-The
    Vagrant Way
•   ChefConf 2012: http://confreaks.com/videos/1672-
    chefconf2012-consistent-local-development-with-vagrant-
    and-chef

More Related Content

What's hot

Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Chu-Siang Lai
 
AWS EC2 for beginner
AWS EC2 for beginnerAWS EC2 for beginner
AWS EC2 for beginnerazole Lai
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & WindowsChu-Siang Lai
 
Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用Shengyou Fan
 
Composer 從入門到實戰
Composer 從入門到實戰Composer 從入門到實戰
Composer 從入門到實戰Shengyou Fan
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 SeedingShengyou Fan
 
Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)Vincent Chi
 
docker intro
docker introdocker intro
docker introkoji lin
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorialazole Lai
 
應用程式佈署
應用程式佈署應用程式佈署
應用程式佈署Shengyou Fan
 
DAE 新变化介绍
DAE 新变化介绍DAE 新变化介绍
DAE 新变化介绍Tianwei Liu
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者Shengyou Fan
 
DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略Will Huang
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
Package安裝與使用
Package安裝與使用Package安裝與使用
Package安裝與使用Shengyou Fan
 
給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由Shengyou Fan
 

What's hot (20)

Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)
 
AWS EC2 for beginner
AWS EC2 for beginnerAWS EC2 for beginner
AWS EC2 for beginner
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
 
Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用
 
Composer 從入門到實戰
Composer 從入門到實戰Composer 從入門到實戰
Composer 從入門到實戰
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 Seeding
 
Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)
 
docker intro
docker introdocker intro
docker intro
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorial
 
應用程式佈署
應用程式佈署應用程式佈署
應用程式佈署
 
DAE 新变化介绍
DAE 新变化介绍DAE 新变化介绍
DAE 新变化介绍
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者
 
DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
使用 Controller
使用 Controller使用 Controller
使用 Controller
 
Package安裝與使用
Package安裝與使用Package安裝與使用
Package安裝與使用
 
使用 Controller
使用 Controller使用 Controller
使用 Controller
 
給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由
 

Viewers also liked

Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介Wen-Tien Chang
 
Yet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom upYet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom upWen-Tien Chang
 
ALPHAhackathon: How to collaborate
ALPHAhackathon: How to collaborateALPHAhackathon: How to collaborate
ALPHAhackathon: How to collaborateWen-Tien Chang
 
Vagrant and docker
Vagrant and dockerVagrant and docker
Vagrant and dockerDuckDuckGo
 
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...Carlos Sanchez
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Wen-Tien Chang
 
淺談 Startup 公司的軟體開發流程 v2
淺談 Startup 公司的軟體開發流程 v2淺談 Startup 公司的軟體開發流程 v2
淺談 Startup 公司的軟體開發流程 v2Wen-Tien Chang
 
那些 Functional Programming 教我的事
那些 Functional Programming 教我的事那些 Functional Programming 教我的事
那些 Functional Programming 教我的事Wen-Tien Chang
 
Vagrant + Docker provider [+Puppet]
Vagrant + Docker provider [+Puppet]Vagrant + Docker provider [+Puppet]
Vagrant + Docker provider [+Puppet]Nicolas Poggi
 
不妥協的河蟹之道
不妥協的河蟹之道不妥協的河蟹之道
不妥協的河蟹之道Ken Kuan
 
"Up" with vagrant and docker
"Up" with vagrant and docker"Up" with vagrant and docker
"Up" with vagrant and dockerHiroshi Miura
 
從 Classes 到 Objects: 那些 OOP 教我的事
從 Classes 到 Objects: 那些 OOP 教我的事從 Classes 到 Objects: 那些 OOP 教我的事
從 Classes 到 Objects: 那些 OOP 教我的事Wen-Tien Chang
 
Behavior Driven Development on C.C.Agile
Behavior Driven Development on C.C.AgileBehavior Driven Development on C.C.Agile
Behavior Driven Development on C.C.AgileSam Huang
 
Vagrant and Docker
Vagrant and DockerVagrant and Docker
Vagrant and DockerNascenia IT
 
Virtualization with Vagrant (ua.pycon 2011)
Virtualization with Vagrant (ua.pycon 2011)Virtualization with Vagrant (ua.pycon 2011)
Virtualization with Vagrant (ua.pycon 2011)Dmitry Guyvoronsky
 
RubyConf Taiwan 2011 Opening & Closing
RubyConf Taiwan 2011 Opening & ClosingRubyConf Taiwan 2011 Opening & Closing
RubyConf Taiwan 2011 Opening & ClosingWen-Tien Chang
 
Vagrant-Overview
Vagrant-OverviewVagrant-Overview
Vagrant-OverviewCrifkin
 

Viewers also liked (20)

Vagrant For DevOps
Vagrant For DevOpsVagrant For DevOps
Vagrant For DevOps
 
Introduction to Vagrant
Introduction to VagrantIntroduction to Vagrant
Introduction to Vagrant
 
Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介
 
Yet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom upYet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom up
 
ALPHAhackathon: How to collaborate
ALPHAhackathon: How to collaborateALPHAhackathon: How to collaborate
ALPHAhackathon: How to collaborate
 
Vagrant
VagrantVagrant
Vagrant
 
Vagrant and docker
Vagrant and dockerVagrant and docker
Vagrant and docker
 
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀
 
淺談 Startup 公司的軟體開發流程 v2
淺談 Startup 公司的軟體開發流程 v2淺談 Startup 公司的軟體開發流程 v2
淺談 Startup 公司的軟體開發流程 v2
 
那些 Functional Programming 教我的事
那些 Functional Programming 教我的事那些 Functional Programming 教我的事
那些 Functional Programming 教我的事
 
Vagrant + Docker provider [+Puppet]
Vagrant + Docker provider [+Puppet]Vagrant + Docker provider [+Puppet]
Vagrant + Docker provider [+Puppet]
 
不妥協的河蟹之道
不妥協的河蟹之道不妥協的河蟹之道
不妥協的河蟹之道
 
"Up" with vagrant and docker
"Up" with vagrant and docker"Up" with vagrant and docker
"Up" with vagrant and docker
 
從 Classes 到 Objects: 那些 OOP 教我的事
從 Classes 到 Objects: 那些 OOP 教我的事從 Classes 到 Objects: 那些 OOP 教我的事
從 Classes 到 Objects: 那些 OOP 教我的事
 
Behavior Driven Development on C.C.Agile
Behavior Driven Development on C.C.AgileBehavior Driven Development on C.C.Agile
Behavior Driven Development on C.C.Agile
 
Vagrant and Docker
Vagrant and DockerVagrant and Docker
Vagrant and Docker
 
Virtualization with Vagrant (ua.pycon 2011)
Virtualization with Vagrant (ua.pycon 2011)Virtualization with Vagrant (ua.pycon 2011)
Virtualization with Vagrant (ua.pycon 2011)
 
RubyConf Taiwan 2011 Opening & Closing
RubyConf Taiwan 2011 Opening & ClosingRubyConf Taiwan 2011 Opening & Closing
RubyConf Taiwan 2011 Opening & Closing
 
Vagrant-Overview
Vagrant-OverviewVagrant-Overview
Vagrant-Overview
 

Similar to A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩

02.python.开发最佳实践
02.python.开发最佳实践02.python.开发最佳实践
02.python.开发最佳实践Na Lee
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術Yu Lung Shao
 
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛Edward Kuo
 
FHIR Server 安裝與使用
FHIR Server 安裝與使用FHIR Server 安裝與使用
FHIR Server 安裝與使用Lorex L. Yang
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用謝 宗穎
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
[OSDC12]相依性管理 - 以Ruby開發為例
[OSDC12]相依性管理 - 以Ruby開發為例[OSDC12]相依性管理 - 以Ruby開發為例
[OSDC12]相依性管理 - 以Ruby開發為例YC Ling
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定Shengyou Fan
 
Asp.net mvc 6 新功能初探
Asp.net mvc 6 新功能初探Asp.net mvc 6 新功能初探
Asp.net mvc 6 新功能初探Gelis Wu
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAEq3boy
 
Cloudstack dev/user sharing
Cloudstack dev/user sharingCloudstack dev/user sharing
Cloudstack dev/user sharinggavin_lee
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索Will Huang
 
Eventmachine Websocket 實戰
Eventmachine Websocket 實戰Eventmachine Websocket 實戰
Eventmachine Websocket 實戰Mu-Fan Teng
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0國昭 張
 
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Jeff Chu
 
以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計Amigo 陳兆祥
 

Similar to A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩 (20)

02.python.开发最佳实践
02.python.开发最佳实践02.python.开发最佳实践
02.python.开发最佳实践
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術
 
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
 
FHIR Server 安裝與使用
FHIR Server 安裝與使用FHIR Server 安裝與使用
FHIR Server 安裝與使用
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
[OSDC12]相依性管理 - 以Ruby開發為例
[OSDC12]相依性管理 - 以Ruby開發為例[OSDC12]相依性管理 - 以Ruby開發為例
[OSDC12]相依性管理 - 以Ruby開發為例
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定
 
Asp.net mvc 6 新功能初探
Asp.net mvc 6 新功能初探Asp.net mvc 6 新功能初探
Asp.net mvc 6 新功能初探
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAE
 
Cloudstack dev/user sharing
Cloudstack dev/user sharingCloudstack dev/user sharing
Cloudstack dev/user sharing
 
Ansible 101
Ansible 101Ansible 101
Ansible 101
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索
 
Eventmachine Websocket 實戰
Eventmachine Websocket 實戰Eventmachine Websocket 實戰
Eventmachine Websocket 實戰
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0
 
Html5
Html5Html5
Html5
 
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
 
以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計
 

More from Wen-Tien Chang

⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨Wen-Tien Chang
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Wen-Tien Chang
 
A brief introduction to Machine Learning
A brief introduction to Machine LearningA brief introduction to Machine Learning
A brief introduction to Machine LearningWen-Tien Chang
 
RSpec on Rails Tutorial
RSpec on Rails TutorialRSpec on Rails Tutorial
RSpec on Rails TutorialWen-Tien Chang
 
Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)Wen-Tien Chang
 
Exception Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyException Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyWen-Tien Chang
 
A brief introduction to SPDY - 邁向 HTTP/2.0
A brief introduction to SPDY - 邁向 HTTP/2.0A brief introduction to SPDY - 邁向 HTTP/2.0
A brief introduction to SPDY - 邁向 HTTP/2.0Wen-Tien Chang
 
RubyConf Taiwan 2012 Opening & Closing
RubyConf Taiwan 2012 Opening & ClosingRubyConf Taiwan 2012 Opening & Closing
RubyConf Taiwan 2012 Opening & ClosingWen-Tien Chang
 
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean StartupWen-Tien Chang
 
BDD style Unit Testing
BDD style Unit TestingBDD style Unit Testing
BDD style Unit TestingWen-Tien Chang
 
RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試Wen-Tien Chang
 
Service-Oriented Design and Implement with Rails3
Service-Oriented Design and Implement with Rails3Service-Oriented Design and Implement with Rails3
Service-Oriented Design and Implement with Rails3Wen-Tien Chang
 

More from Wen-Tien Chang (20)

⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛
 
A brief introduction to Machine Learning
A brief introduction to Machine LearningA brief introduction to Machine Learning
A brief introduction to Machine Learning
 
RSpec on Rails Tutorial
RSpec on Rails TutorialRSpec on Rails Tutorial
RSpec on Rails Tutorial
 
RSpec & TDD Tutorial
RSpec & TDD TutorialRSpec & TDD Tutorial
RSpec & TDD Tutorial
 
Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)
 
Exception Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyException Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in Ruby
 
A brief introduction to SPDY - 邁向 HTTP/2.0
A brief introduction to SPDY - 邁向 HTTP/2.0A brief introduction to SPDY - 邁向 HTTP/2.0
A brief introduction to SPDY - 邁向 HTTP/2.0
 
RubyConf Taiwan 2012 Opening & Closing
RubyConf Taiwan 2012 Opening & ClosingRubyConf Taiwan 2012 Opening & Closing
RubyConf Taiwan 2012 Opening & Closing
 
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
 
Git Tutorial 教學
Git Tutorial 教學Git Tutorial 教學
Git Tutorial 教學
 
BDD style Unit Testing
BDD style Unit TestingBDD style Unit Testing
BDD style Unit Testing
 
RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試
 
Git and Github
Git and GithubGit and Github
Git and Github
 
Service-Oriented Design and Implement with Rails3
Service-Oriented Design and Implement with Rails3Service-Oriented Design and Implement with Rails3
Service-Oriented Design and Implement with Rails3
 
Rails3 changesets
Rails3 changesetsRails3 changesets
Rails3 changesets
 
遇見 Ruby on Rails
遇見 Ruby on Rails遇見 Ruby on Rails
遇見 Ruby on Rails
 
Designing Ruby APIs
Designing Ruby APIsDesigning Ruby APIs
Designing Ruby APIs
 
Rails Security
Rails SecurityRails Security
Rails Security
 
Rails Performance
Rails PerformanceRails Performance
Rails Performance
 

A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩