about 2 years ago

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.proxy
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的部分

Vagrantfile
# -*- 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
Dockerfile
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

參考
docker中文文档-windows安装docker

← Run code at Spring Boot startup Spring Boot Yaml 使用方式 →
 
comments powered by Disqus