A Docker telepítése Ubuntu 16.04-re Vagrant segítségével

Vagrant Logó

Különböző operációs rendszereken különböző módon telepíthető a Docker és némelyik esetben valójában egy virtuális gép indul el a háttérben, amire a Docker démon kerül, miközben a gazda operációs rendszeren van a kliens. A telepítésről a dokumentációban részletes leírás található, de fejlesztés közben a legegyszerűbb, amikor a saját desktop Linuxodon telepíted és megúszod a virtuális gépek okozta hálózati és a fájlszinkronizációs problémákat. Ha viszont Windowson futtatsz Linux konténert, elkerülhetetlen a virtuális gép. Megfelelő erőforrás esetén egy virtuális desktop Linux telepítése is megoldás lehet, de hogy egy másik hasznos szoftvert is bemutassak, ami ráadásul hasonlít a Dockerhez bizonyos szempontból, a Vagrantot fogom segítségül hívni, hogy leírjam a Docker telepítését. A gépet előre elkészítettem és elérhetővé tettem a Vagrant Cloud‑on. Az elkészítéséhez szükséges forráskódot pedig a GitHub-on. A cikkben ismertetem a Vagrant fontosabb tulajdonságait, hibalehetőségeket és a desktop Ubuntu 16.04-ben, Vagranttal telepített, Dockert tartalmazó gép telepítésének menetét.

Megjegyzés: Ubuntu 16.04 felhasználók a Vagrant telepítését és a virtuális gép használatát akár ki is hagyhatják.

Tartalomjegyzék

A cikkben használt szoftverek és verzióik

[Tartalom]

Bár valószínűleg eltérő verziókkal is követhető a cikk, arra az esetre, ha valakinek problémája akadna, alább felsorolom minden használt és tesztelt szoftver verzióját.

  • Gazda OS: Windows 7, Windows 10, Ubuntu 16.04
  • Vagrant 2.0.1
  • VirtualBox 5.2 (Win10, Ubuntu 16.04), 5.0 (Win7)
  • Docker 17.09.1
  • Docker Compose 1.18.0

Vagrant

Összehasonlítás a Dockerrel

[Tartalom]

A Vagrant egy, a Dockerhez nagyon hasonló eszköz, de inkább virtuális gépek indítására használatos. Hogy mi a hasonlóság?

  • Mindkét program alkalmas arra, hogy egy korábban, előre elkészített rendszerből elindíts egy virtuális környezetet, amiben akár egy vagy több szoftver is lehet.

  • A Vagrant és a Docker is ad lehetőséget lokális sablonok használatára és ingyenesen távoli szerverre feltöltésre is. A Vagranttal készített gépeket a Vagrant Cloud‑ra lehet feltölteni, a Docker image-eket pedig a Docker Hub-ra, de a Docker Cloud-on keresztül is létre lehet hozni a tárolóját.

  • Mindkét rendszerrel van lehetőség a sablonok verziószámmal ellátására és így egy konkrét verzió letöltésére, indítására.

  • A Dockerfile nevű fájl programok telepítését és a konténer egyéb paramétereit tartalmazza, mint például megosztott portok. A Vagrantfile-ba pedig a Vagranttal indított virtuális gép paraméterei kerülnek. Szintén tartalmazhat portátirányítást és telepítést.

  • A Docker és a Vagrant is telepíthető többféle operációs rendszerre.

Persze, azért különbségek is vannak

  • A Dockert Go nyelven írták, a Vagrant-ot pedig Ruby-ban.

  • A Dockerfile speciális formátumú, míg a Vagrantfile valójában egy egyszerű Ruby programkód. Az alapbeállításokhoz nem kell tudni Ruby-ban programozni, de a Vagrantfile-ban komolyabb programot is lehet írni igény szerint, ami még a gazda operációs rendszeren fog futni segítve ezzel a virtuális környezet elindítását.

  • A Docker alkalmazás konténerek kezelésére való, a Vagrant viszont különböző virtualizációs technológiák (provider) egységesített interfésze. Bár leginkább virtuális gépekre használják, Docker konténert is tudna indítani virtuális gép helyett. A különböző providerekhez viszont külön el kell készíteni a sablonokat, tehát nem lehet bármit bármilyen környezetben elindítani, csak ha elérhető hozzá a sablon.

  • A Dockerfile valójában egy sablon elkészítésének leírása, amiből elindítható a konténer. A Vagrantfile alapján viszont nem sablon készül, hanem a virtuális környezet, ami exportálható, majd az elkészült image feltölthető egy szerverre. (A sablon készítéséhez a Packer is használható.)

  • A Docker image-ek letöltésénél egy fix címkét kell megadni verzióként. Ez lehet verziószám, de tetszőleges elnevezés is, ami elérhető. Mivel egy image több címkét kaphat, többféleképpen lehet hivatkozni rá. A Vagrant image-eket valójában Vagrant Box-nak hívják és a szemantikus verziózásnak a Ruby nyelvnél használt változatát javasolják. Ettől el lehet térni, viszont a Vagrant Box verzióját ekkor nem lehet olyan szabályokkal megadni, hogy elkerülhető legyen a nem kívánt frissítés letöltése, de a hibajavítások például lejöjjenek. Egy boxhoz pedig csak egy verziószám rendelhető.

A Vagrant telepítése

[Tartalom]

A Vagrant telepíthető különböző operációs rendszerekre. Ez jelenleg Debian, Windows, Centos és Mac OS X. A vagrantup.com oldalon a Download linkre kattintva elérhető az aktuális lista és telepíthető a megfelelő verzió. Akár 32 bites, akár 64 bites rendszerekre. A Debian verzió természetesen nem kizárólag Debianra, hanem más Debian alapú OS-ekre is működik, mint például Ubuntu.

Windowson telepítés után szükséges lehet egy újraindítás. Ha valamiért nem kerülne be a Windows Path környezeti változóba a Vagrant útvonala, akkor arról gondoskodni kell. Alapértelmezett telepítési könyvtárral ez a "C:\HashiCorp\Vagrant\bin" mappát jelenti.

Virtuális gépek indítása

[Tartalom]

A Dockerrel ellentétben a Vagrant-nak már a gép indításához is szüksége van egy konfigurációs fájlra, a Vagrantfile-ra. Ezt viszont le tudja magának generálni a "vagrant init" utasítással.

vagrant init boxneve --box-version 1.0.0

A "--box-version" elhagyható. Akkor a legfrissebb verzió fog indulni elindításkor.

A "vagrant up" abban a mappában futtatandó, ahol a Vagrantfile van. Az utasítással egy, a már lokális tárolóban levő sablonból elindítható egy virtuális gép. Ha viszont nincs még letöltve és elérhető a Vagrant Cloud-on, akkor először letölti és hozzáadja a helyi tárolóhoz. Célszerű, bár nem kötelező megadni a választott providert, viszont egyes, később tárgyalt esetekben előfordulhat, hogy nem indul el enélkül a gép.

vagrant up --provider virtualbox

A "vagrant box add" utasítással lehet egy boxot a helyi tárolóhoz adni a gép elindítása nélkül. Ez akár a saját gépen levő box fájlt is hozzá tudja adni, de a Vagrant Cloud-ra feltöltöttet is. Ehhez persze le is kell töltenie onnan.

Ha megunod a gépet és törölnéd, akkor a "vagrant destroy" segít. De le is állítható a "vagrant halt"-tal.

Provisioner

[Tartalom]

A "Provider" fogalmat már említettem, ami például a Virtualbox lehet, vagy Hyper-V, de akár már Docker is. Vagyis, hogy milyen technológiával fog indulni a virtuális környezet. A Vagrantfile-ban viszont akár programokat is lehet telepíteni vagy tetszőleges utasításokat lefuttatni a vendég operációs rendszerben. Ezt a folyamatot hívjuk "Provisioning"-nek. Azokat, amik ilyen utasítások futtatását lehetővé teszik, "provisioner"-eknek nevezzük. A legegyszerűbb a "Shell" provisioner, ami vagy egy shell script felmásolásával vagy sorainak egy változóba töltésével, majd futtatásával teszi lehetővé akár programok telepítését a virtuális gépen vagy konfiguráció módosítását. De létezik Docker provisioner is, ami Ruby változókon keresztül segít a Docker utasítások kiadásában, illetve automatikusan telepíti is a legfrissebb Dockert a gépre. A legfrissebb persze nem mindig a legjobb.

Lehetséges problémák

VAGRANT_HOME és tárhely

[Tartalom]

Tudni kell, hogy lokális tárolóhoz hozzáadott vagrant boxok alapértelmezés szerint a felhasználó saját könyvtárában levő ".vagrant.d" mappába kerülnek, így arra is figyelni kell, hogy legyen elég hely a partíción. Ha nincs, akkor a VAGRANT_HOME környezeti változó megváltoztatásával átállítható tetszőleges partíció tetszőleges könyvtárára a boxok helye. Érdemes még a létrehozott virtuális gépek mappáját is ellenőrizni, hogy az induló gépek se telítsék be a partíciót. Virtualboxban ez egészen biztosan átállítható.

Megjegyzés: Pár éve még valamelyik verziónál problémát okozott, ha a VAGRANT_HOME könyvtár útvonala tartalmazott ékezetes karaktereket. Mivel a Windows a telepítéskor begépelt valódi névből generált mappanevet, a változó módosítása nélkül nem is működött a Vagrant sem.

Nem működik a "vagrant up" SSL problémára hivatkozva

[Tartalom]

Nálam ez még nem fordult elő, ezért nem fejtettem meg a konkrét problémát, de van, hogy a Vagrant Cloud HTTPS-sel kezdődő URL-je miatt nem sikerül a még le nem töltött box megadásával a virtuális gép indítása egyes rendszereken. A megoldás lehet, ha előre letöltöd a vagrant boxot az "insecure" opcióval, majd akkor már a helyi tárolóból elindul a virtuális gép, ugyanis a "vagrant up" a "docker run"-hoz hasonlóan nem csak elindítja a gépet, hanem le is próbálja tölteni a sablont.

vagrant box add boxneve -c --insecure

Nem működik a "vagrant up" memóriahibára hivatkozva Windows 10-ben

[Tartalom]

Sajnos gyakran nem ad értelmes hibaüzenetet a Vagrant és erre ez a hiba is bizonyíték, amikor a vagrant up parancs kiadására megpróbál elindulni a virtuális gép, de felugró ablakban egy memóriacímre hivatkozás hibaüzenete jelenik meg, közben viszont a Hyper-V virtualizáció engedélyezése okozza a gondot. Ha Virtualbox-ban szeretnél virtuális gépet indítani, a Hyper-V szolgáltatást ki kell kapcsolni a Windowsban.

Nem működik a "vagrant up" letiltott "VT-x"-re hivatkozva Windows 10-ben

[Tartalom]

Miután az előző pontban írt hiba megjelent, kipróbáltam egy másik vagrant box indítását és ekkor már kiírta, hogy valójában a "VT-x" -et hiányolja, amit engedélyezni kell a BIOS-ban. Ám az engedélyezve volt, de mint kiderült, a Hyper-V szépen kisajátította magának. Mint ebből is látható, ugyanaz a hiba más hibaüzenetet is eredményezhet más sablonnál. A lényeg, hogy a Hyper-V legyen kikapcsolva, hacsak nem éppen Hyper-V alapú sablont szeretnél felhasználni.

Megosztott könyvtárak problémája

[Tartalom]

Meg lehet osztani az indított virtuális géppel a gazda operációs rendszer mappáit, de alapértelmezetten a projekt könyvtárát automatikusan megpróbálja szinkronizálni a vendég rendszerrel. A szinkronizáció módja többféle lehet, amit az operációs rendszeren elérhető programokból próbál eldönteni, ám előfordult, hogy ez tévesen sikerült neki, így Windowson próbált meg rsync-kel szinkronizálni, ami viszont nem volt elérhető. Ilyen esetben manuálisan meg kell adni a Vagrantfile-ban a projekt könyvtár megosztásának módját is, vagy le kell tiltani, ha nincs rá szükség.

Windows és végtelenségig futó "vagrant up"

[Tartalom]

A "vagrant up --debug" parancs futtatásával látható, hogy a Vagrant a Powershellt is próbálja használni. Ez viszont lehet elavult. Míg például Windows 10-ben nincs probléma, addig egy régi Windows 7-ben régi Powershellel nem fut le a "vagrant up". Persze, miért is szólna, mi a problémája. A Powershell frissítésén kívül van azért még egy mód a parancs sikeres futtatására. Ha megadod manuálisan a provider-t, azaz, hogy Virtualbox-ban fog futni a gép, akkor sikeresen lefut az utasítás.

vagrant up --provider virtualbox boxneve

SSH kulcs problémája

[Tartalom]

A gép létrehozásakor a Vagrant megpróbál csatlakozni a vendég OS-hez SSH-val. Előfordulhat, hogy ez nem sikerül, mert hibás a gépben levő publikus kulcs. Van egy alapértelmezett kulcs, ami viszont megváltozhat, amikor elindítod a gépet. Nincs ezzel gond, amíg nem exportálod a gépet és próbálod feltölteni valahova és újra felhasználni. Ekkor ugyanis a már megváltozott kulcs miatt nem fog tudni a Vagrant bejelentkezni a gépre, hogy lefuttassa a szükséges utasításokat. Az új kulcs beillesztése letiltható a Vagrantfile config blokkjában az alábbi beállítással:

config.ssh.insert_key = false

A Docker telepítése

[Tartalom]

A Docker megfelelő konfigurációjában el lehet veszni és operációs rendszertől függően kicsit másképp is működik. Gondolok itt arra, hogy indul-e a háttérben virtuális gép vagy valóban natívan fut a gazda OS-en. Régóta vannak megoldások például Windows rendszeren is a Linux konténerek indítására (Boot2Docker, Docker For Windows), de ilyen esetben, ahogy korábbi fejezetekben említettem, van virtuális gép. A kérdés csak az, hogy Virtualbox-ban vagy mondjuk "Hyper-V"-ben indul-e el. Windows 10-ben Windows konténerek indításánál nem lenne szükség virtuális gépre. Én viszont Linux konténerekről fogok írni, viszont a Windowsosokról sem feledkeznék meg, ezért egy desktop Ubuntu 16.04 telepítését mutatom meg Vagrant segítségével, amibe a Dockert és a Docker Compose-t is telepítem. A Desktopra azért van szükség, hogy a virtuális gép saját böngészőjét használva ne legyen szükség portátirányításra vagy bármilyen hálózati konfigurációra a Vagrant-ban, ami ennek a fejezetnek nem témája.

Az egyszerűség kedvéért nem teljesen nulláról telepítem a desktop Ubuntut, hanem felhasználok egyet a Vagrant Cloud-ról. Az "fso/xenial64-desktop" box "2017-11-01"-es verzióját (látható, hogy itt nincs szemantikus verziószám). Ehhez szükségem lesz két Vagrantfile-ra. Igen, kettőre. Az egyikre azért, hogy abból elinduljon egy virtuális gép, amibe a szükséges szoftvereket már telepítettem, a másikra azért, hogy mellékeljem a letölthető sablonhoz. Így annak tartalma is lefut majd a "vagrant up" hatására. Ez azért szükséges, mert így a gazda operációs rendszertől függő utasítások futhatnak le.

Az első Vagrantfile a gép sablonjának létrehozásához való lesz. Itt minden a "config"
blokkban lesz:

Vagrant.configure("2") do |config|
    # Ide jön minden
end

A két függőleges vonal közötti "config" egy objektum lesz, aminek különböző tulajdonságain keresztül lehet konfigurálni a virtuális gépet. A legfontosabb, hogy milyen sablonból akarok dolgozni. Ezen kívül én azt is megadtam, hogy ne keressen frissítéseket a géphez.

Vagrant.configure("2") do |config|
  config.vm.box = "fso/xenial64-desktop"
  config.vm.box_version = "2017-11-01"
  config.vm.box_check_update = false

 # és a többi
end

Szeretném elkerülni, hogy gondom legyen az SSH kulccsal és a felcsatolható mappákkal. Ennél a lépésnél amúgy sem lenne értelme mappát megosztani, mivel most csak a sablon készül, de ezalatt azért el fog indulni a gép. A továbbiakban nem mutatom a teljes config blokkot, csak az új sorokat:

  config.vm.synced_folder ".", "/data/", disabled: true
  config.ssh.insert_key = false

Majd pedig beállítom, hogy nem kérem a Virtualbox ablakának megjelenítését és 1GB memóriát adok a gépnek, ami egyébként is az alapértelmezés. Ez már a "config" blokkhoz hasonló néhány sor lesz,
de még mindig azon belül kell írni és kizárólag virtualbox esetén működik:

  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.memory = "1024"
  end

Említettem a "Shell" provisionert. Most az következik, mégpedig annak is az inline változata. Vagyis egy változóba másolom mindazt, amit szeretnék lefuttatni a vendég OS-ben shell-ben.

   config.vm.provision "shell", inline: <<-SHELL  
      # Ide jönnek a parancsok
   SHELL

Itt a <<-SHELL a kezdő idézőjelet helyettesíti. A SHELL utána pedig annak lezárását. Így közte nyugodtan használhatok idézőjeleket is. A fenti kód természetesen továbbra is a "config"
blokk része. Az alábbiak viszont már a SHELL provisionerben lesznek megadva. A következő sorok gyakorlatilag a Docker Ubuntura vonatkozó telepítési útmutatójából van és a legfrissebb Docker verzió helyett pontosan azt telepíti, amit kiválasztok. Ez most a 17.09.1-es Community Edition verzió lesz. A telepítés előtt frissíti az operációs rendszert, utána pedig hozzáadja a "docker" csoporthoz a "vagrant" felhasználót, hogy "sudo" nélkül tudjon konténereket indítani.

    apt-get update
    apt-get upgrade -y

    sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) \
      stable"

    apt-get update
    apt-get install -y docker-ce=17.09.1~ce-0~ubuntu

    usermod -aG docker vagrant

Ezután még a Docker Compose-t is telepítem, aminek módját a Docker Compose 1.18.0 Release leírásából másoltam ki.

    curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose

Ezután a teljes Vagrantfile tartalma a következő:

Vagrant.configure("2") do |config|
  config.vm.box = "fso/xenial64-desktop"
  config.vm.box_version = "2017-11-01"
  config.vm.box_check_update = false

  config.vm.synced_folder ".", "/data/", disabled: true
  config.ssh.insert_key = false

  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.memory = "1024"
  end

  config.vm.provision "shell", inline: <<-SHELL  
    apt-get update
    apt-get upgrade -y

    sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"

    apt-get update
    apt-get install -y docker-ce=17.09.1~ce-0~ubuntu

    usermod -aG docker vagrant

    curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
  SHELL

end

Így most már a Dockerrel nem lesz gond, viszont szeretném, ha mindenkinek a megfelelő Virtualbox Guest Additions települne a virtuális gépben, valamint a magyar billentyűzetkiosztást is szeretném automatikusan beállítani úgy, hogy bármikor helyrehozhassam, ha esetleg elállítanám. Mivel egy desktop Linux készül, jó, ha magyar a billentyűzet. Tehát Ruby nyelven a Vagrantfile-ban lekérdezem a Virtualbox verzióját és letöltöm a megfelelő Gust Additionst. De honnan tudom, melyiket kell telepíteni? Ehhez kell egy Ruby függvényt írni, amit felhasználva rögtön a VBOX_VERSION változóba mentem a verziót. A következőképpen néz ki és még a "config" blokk elé fog kerülni:

def virtualbox_version()
    vboxmanage = Vagrant::Util::Which.which("VBoxManage") || Vagrant::Util::Which.which("VBoxManage.exe")
    if vboxmanage == nil && Vagrant::Util::Platform.windows?
        vboxmanage = ENV["VBOX_MSI_INSTALL_PATH"] || ENV["VBOX_INSTALL_PATH"]
        vboxmanage = vboxmanage + "\\VBoxManage.exe"
    end
    if vboxmanage != nil
        s = Vagrant::Util::Subprocess.execute(vboxmanage, '--version')
        longVersion = s.stdout.strip!
                shortVersion = longVersion.split("r")[0]
                return shortVersion
    else
        return nil
    end
end

VBOX_VERSION = virtualbox_version()

A VBOX_VERSION válozó egy újabb "shell" provisionernek lesz átadva, de adok neki nevet is, mert így utólag is le tudom futtatni, ha szükséges. Ha frissítem a Virtualbox-ot, akkor újra lefuttatva frissül a Guest Additions is.

  config.vm.provision "vbguestupdate", type: "shell", env: {"VBOX_VERSION" => VBOX_VERSION}, inline: <<-SHELL
     echo 'if [ -n "${DISPLAY}" ]; then setxkbmap hu; fi;' >>/home/vagrant/.bashrc

     wget http://download.virtualbox.org/virtualbox/${VBOX_VERSION}/VBoxGuestAdditions_${VBOX_VERSION}.iso
     mkdir -p /media/iso
     mount -o loop VBoxGuestAdditions_${VBOX_VERSION}.iso /media/iso
     CURRPWD=`pwd`
     cd /media/iso
     ./VBoxLinuxAdditions.run
     cd ${CURRPWD}
     umount /media/iso
     unlink VBoxGuestAdditions_${VBOX_VERSION}.iso
  SHELL

Mindezek után szeretném, ha újraindulna a gép. Ez lesz a legrövidebb "shell" provisioner, már idézőjelekkel a SHELL kulcsszó helyett.

config.vm.provision "reboot", type: "shell", inline: "reboot"

Ami még kimaradt, hogy ismét szeretném letiltani a projekt mappa megosztását, illetve most már bekapcsolnám a Virtualis gép ablakát, hogy teljes képernyőre téve dolgozhassak benne. Továbbra is 1GB memóriát határozok meg, de ezt felül lehet írni saját Vagrantfile-ban.

  config.vm.synced_folder ".", "/data/", disabled: true

  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
    vb.memory = "1024"
  end

A teljes "Vagrantfile.provision" fájl tehát így néz ki:

def virtualbox_version()
    vboxmanage = Vagrant::Util::Which.which("VBoxManage") || Vagrant::Util::Which.which("VBoxManage.exe")
    if vboxmanage == nil && Vagrant::Util::Platform.windows?
        vboxmanage = ENV["VBOX_MSI_INSTALL_PATH"] || ENV["VBOX_INSTALL_PATH"]
        vboxmanage = vboxmanage + "\\VBoxManage.exe"
    end
    if vboxmanage != nil
        s = Vagrant::Util::Subprocess.execute(vboxmanage, '--version')
        longVersion = s.stdout.strip!
                shortVersion = longVersion.split("r")[0]
                return shortVersion
    else
        return nil
    end
end

VBOX_VERSION = virtualbox_version()

Vagrant.configure("2") do |config|

  config.vm.synced_folder ".", "/data/", disabled: true

  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
    vb.memory = "1024"
  end

  config.vm.provision "vbguestupdate", type: "shell", env: {"VBOX_VERSION" => VBOX_VERSION}, inline: <<-SHELL
     echo 'if [ -n "${DISPLAY}" ]; then setxkbmap hu; fi;' >>/home/vagrant/.bashrc

     wget http://download.virtualbox.org/virtualbox/${VBOX_VERSION}/VBoxGuestAdditions_${VBOX_VERSION}.iso
     mkdir -p /media/iso
     mount -o loop VBoxGuestAdditions_${VBOX_VERSION}.iso /media/iso
     CURRPWD=`pwd`
     cd /media/iso
     ./VBoxLinuxAdditions.run
     cd ${CURRPWD}
     umount /media/iso
     unlink VBoxGuestAdditions_${VBOX_VERSION}.iso
  SHELL

  config.vm.provision "reboot", type: "shell", inline: "reboot"
end

Ehhez még egy Batch szkriptet készítettem, hogy létrehozza a gépet, exportálja és mellékelje a Vagrantfile.provision nevű fájlt is a csomaghoz, amit feltölthetek a Vagrant Cloud-ra. Hogy miért Batch? Mert Linuxon Bash-ben túl egyszerű lett volna... Illetve ott nem használok plusz virtuális gépet. A lényeg valójában a következő néhány sor, ami az localhost/docker-webdev névre hallgató boxot telepíti a lokális tárolóba:

vagrant destroy -f
vagrant up --provider vitualbox
vagrant halt
vagrant package --base VIRTUALIS_GEP_NEVE_VAGY_ID --output docker-webdev.box --vagrantfile Vagrant.provision

A VIRTUALiS_GEP_NEVE_VAGY_ID helyére az elindult virtuális gép nevét kellene írni, vagy az egyedi azonosítóját, amiből egyiket sem tudom előre. A szkript ennek meghatározásában is segít, mert a gép létrehozásakor bekerül a projektben a ".vagrant/machines/default/virtualbox/id" fájlba a gép azonosítója, amiből a szkript kiolvassa.

Előre elkészített virtuális gép letöltése és indítása

[Tartalom]

A fent leírtak akkor érdekesek, ha saját megoldást is szeretnél készíteni. Én viszont a cikkhez elkészítettem a gépet és feltöltöttem a Vagrant Cloud-ra, amit az alábbi utasítással el is indíthatsz:

vagrant init itsziget/docker-webdev --box-version 1.0.0
vagrant up --provider virtualbox

Induláskor a rendszer nem fog jelszót kérni, de ha sokáig inaktív vagy, zárolva lesz a képernyő. A név és a jelszó is "vagrant", ha vissza kellene jelentkezni.

Fontos, hogy várd meg, amíg rendben letöltődik a sablon és települ a Virtualbox Guest Additions is. Amint a parancssorban már nem látszik üzenet és visszakaptad a promptot, valamint újraindult a virtuális gép, használatba veheted a rendszert. Az újraindulás előtt megjelenik a grafikus felületen is egy üzenet, hogy telepítheted az új Guest Additionst. Erre ne kattints rá! Mindent el fog intézni a Vagrant magától.

Kategóriák: 
Megosztás/Mentés