Vagrant 主要功能在管理虛擬機,但是有時要同時是用資料庫跟NoSQL時,開多台虛擬機又很浪費記憶體,這邊介紹用 Vagrant 讓你在不同地方不同主機都可以建立一樣的環境,並使用 Docker 乘載你要的應用在同一台虛擬機上,爽XD。
首先先裝VirtualBox,因為免費,你要裝VMWARE也可以,但是對應的Vagrant的版本好像要收費
VirtualBox.org
ps.補充一下位什麼不要用Boot2Docker,因為啊Boot2Docker其實它也是在VirtualBox幫你裝個Linux,但是它裝的是Tiny Core Linux,小是很小啦,但比較不接近你真的測試環境,做一些設定的時候看網路上也有人卡卡的,所以直接裝個Ubuntu或CentOS會比較快
再來裝Vagrant
www.vagrantup.com
選自己適合的版本下一步就可以裝到好
Vagrant新版才有整合Docker指令喔,請不要裝舊版的
接著你只要到atlas選擇適合的Box,這個Box呢就像DockerHub一樣,都是別人做好的虛擬機印象檔,所以你只要指定名稱,Vagrant就會去Server上把印象檔抓下來並設定好一台虛擬機喔。
不過今天我主要只是要建立一台虛擬機並且在上面跑Docker,所以我要建個檔案Vagrantfile.proxy讓所有Docker就跑在這個Box之上
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# 這邊指定了我要atlas上面哪一個虛擬機印象檔
config.vm.box = "ubuntu/trusty64"
config.vm.provision "docker"
config.vm.provision "shell", inline:
"ps aux | grep 'sshd:' | awk '{print $2}' | xargs kill"
config.vm.provider :virtualbox do |vb|
# 這邊設定虛擬機名稱,不指定的話會用亂數
vb.name = "nestrends"
vb.gui = $vm_gui
vb.memory = $vm_memory
vb.cpus = $vm_cpus
end
# 這邊指定主機上對應到虛擬機port
config.vm.network :forwarded_port, guest: 9001, host: 9001
config.vm.network :forwarded_port, guest: 5432, host: 5432
config.vm.network :forwarded_port, guest: 9200, host: 9200
config.vm.network :forwarded_port, guest: 9300, host: 9300
# 這邊是將主機上的檔案複製到虛擬機內的指令
# config.vm.provision "file", source: "./oraclejava8/Dockerfile", destination: "Dockerfile"
# config.vm.provision "file", source: "./oraclejava8/ntauth-1.0.jar", destination: "ntauth-1.0.jar"
# 指定虛擬機SSH的帳號密碼
config.ssh.username = "vagrant"
config.ssh.password = "vagrant"
end
基本上若是沒有指定SSH帳密的話,虛擬機開啟後會在vagrant.vagrant\machines\default\virtualbox 產生一把私鑰private_key,但是這私鑰要轉換過putty才可用啊,有點麻煩就直接用帳號密碼指定了
接下來才是指定Docker的部分
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Specify Vagrant version and Vagrant API version
#Vagrant.require_version ">= 1.6.0"
VAGRANTFILE_API_VERSION = "2"
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker'
# 這邊設定你要建立虛擬機的資源
$vm_gui = false
$vm_memory = 2048
$vm_cpus = 2
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.synced_folder ".", "/vagrant", disabled: true
# 這是NoSQL的Docker
config.vm.define "elasticsearch" do |v|
v.vm.provider "docker" do |d|
d.name = "elasticsearch"
d.image = "elasticsearch"
d.ports = ["9200:9200","9300:9300"]
d.vagrant_vagrantfile = "./Vagrantfile.proxy"
end
end
# 這是資料庫的Docker env是原本這個image就提供可設定帳號密碼的方法
config.vm.define "postgres" do |v|
v.vm.provider "docker" do |d|
d.name = "postgres"
d.image = "postgres"
d.ports = ["5432:5432"]
d.env = {
POSTGRES_USER: "root",
POSTGRES_PASSWORD: "abcdEF123456"
}
d.vagrant_vagrantfile = "./Vagrantfile.proxy"
end
end
# 這邊是我要複製到虛擬機的Docker file,並且在虛擬機內讓虛擬機去build Dockerfile
config.vm.define "ntauth" do |v|
v.vm.provider "docker" do |d|
d.name = "ntauth"
d.build_dir = "./oraclejava8"
d.ports = ["9001:9001"]
d.vagrant_vagrantfile = "./Vagrantfile.proxy"
# 這邊做link為了讓java可以連到資料庫,jdbc連線就要改成db當主機名稱
d.link("postgres:db")
# build完成後將我之前複製進去的jar檔掛載到Docker內
d.volumes = ["/home/vagrant:/app"]
# 執行java指令
d.cmd = ["java","-jar","/app/ntauth-1.0.jar","--spring.profiles.active=dev","--datasource.url=jdbc:postgresql://db:5432/nt?charset=UTF8"]
end
end
end
設定檔寫好後
你可以一次全部啟動,但因為我們有設Link,所以你最好是加上--no-parallel按照順序來
vagrant up --provider=docker --no-parallel
或是一台一台來
vagrant up elasticsearch --provider=docker
vagrant up postgres --provider=docker
vagrant up ntauth --provider=docker
FROM ingensi/oracle-jdk
MAINTAINER wiselyman
資料結構
vagrant/
├ Vagrantfile
├ Vagrantfile.proxy
└ oraclejava8/
├ Dockerfile
└ ntauth-1.0.jar
指令是在vagrant這個資料夾下執行喔
最後附上Vagrant常用命令:
vagrant box add name:添加box
vagrant box list:列出當前所有的box
vagrant box remove name:列出某個box(名字就是自己給取的,比如上面的base)
vagrant box repackage name:對某個box重新封包
vagrant init [name]:初始化目前的目錄為工作目錄
vagrant up [name]:啟動虛擬機器
vagrant destroy [name]:刪除虛擬機器
vagrant suspend [name]:暫停某個box
vagrant reload [name]:重新載入
vagrant resume [name]:恢復虛擬機器
vagrant halt [name]:關閉虛擬機器
vagrant ssh:連接虛擬機器
vagrant package –output name:如果對虛擬機器的配置進行修改過後,如果想把當前環境打包,可使用這個命令
vagrant status:查看虛擬機器狀態
vagrant ssh-config