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:

  1. Vagrant.configure("2") do |config|
  2.     # Ide jön minden
  3. 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.

  1. Vagrant.configure("2") do |config|
  2.   config.vm.box = "fso/xenial64-desktop"
  3.   config.vm.box_version = "2017-11-01"
  4.   config.vm.box_check_update = false
  5.  
  6.  # és a többi
  7. 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:

  1.   config.vm.synced_folder ".", "/data/", disabled: true
  2.   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:

  1.   config.vm.provider "virtualbox" do |vb|
  2.     vb.gui = false
  3.     vb.memory = "1024"
  4.   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.

  1.    config.vm.provision "shell", inline: <<-SHELL  
  2.       # Ide jönnek a parancsok
  3.    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.

  1.     apt-get update
  2.     apt-get upgrade -y
  3.  
  4.     sudo apt-get install \
  5.         apt-transport-https \
  6.         ca-certificates \
  7.         curl \
  8.         software-properties-common
  9.     curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  10.     sudo add-apt-repository \
  11.        "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  12.       $(lsb_release -cs) \
  13.       stable"
  14.     apt-get update
  15.     apt-get install -y docker-ce=17.09.1~ce-0~ubuntu
  16.  
  17.     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.

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

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

  1. Vagrant.configure("2") do |config|
  2.   config.vm.box = "fso/xenial64-desktop"
  3.   config.vm.box_version = "2017-11-01"
  4.   config.vm.box_check_update = false
  5.  
  6.   config.vm.synced_folder ".", "/data/", disabled: true
  7.   config.ssh.insert_key = false
  8.  
  9.   config.vm.provider "virtualbox" do |vb|
  10.     vb.gui = false
  11.     vb.memory = "1024"
  12.   end
  13.  
  14.   config.vm.provision "shell", inline: <<-SHELL  
  15.     apt-get update
  16.     apt-get upgrade -y
  17.  
  18.     sudo apt-get install \
  19.         apt-transport-https \
  20.         ca-certificates \
  21.         curl \
  22.         software-properties-common
  23.     curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  24.     sudo add-apt-repository \
  25.        "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  26.       $(lsb_release -cs) \
  27.       stable"
  28.     apt-get update
  29.     apt-get install -y docker-ce=17.09.1~ce-0~ubuntu
  30.  
  31.     usermod -aG docker vagrant
  32.  
  33.     curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  34.     chmod +x /usr/local/bin/docker-compose
  35.   SHELL
  36.  
  37. 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:

  1. def virtualbox_version()
  2.     vboxmanage = Vagrant::Util::Which.which("VBoxManage") || Vagrant::Util::Which.which("VBoxManage.exe")
  3.     if vboxmanage == nil && Vagrant::Util::Platform.windows?
  4.         vboxmanage = ENV["VBOX_MSI_INSTALL_PATH"] || ENV["VBOX_INSTALL_PATH"]
  5.         vboxmanage = vboxmanage + "\\VBoxManage.exe"
  6.     end
  7.     if vboxmanage != nil
  8.         s = Vagrant::Util::Subprocess.execute(vboxmanage, '--version')
  9.         longVersion = s.stdout.strip!
  10.                 shortVersion = longVersion.split("r")[0]
  11.                 return shortVersion
  12.     else
  13.         return nil
  14.     end
  15. end
  16.  
  17. 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.

  1.   config.vm.provision "vbguestupdate", type: "shell", env: {"VBOX_VERSION" => VBOX_VERSION}, inline: <<-SHELL
  2.      echo 'if [ -n "${DISPLAY}" ]; then setxkbmap hu; fi;' >>/home/vagrant/.bashrc
  3.  
  4.      wget http://download.virtualbox.org/virtualbox/${VBOX_VERSION}/VBoxGuestAdditions_${VBOX_VERSION}.iso
  5.      mkdir -p /media/iso
  6.      mount -o loop VBoxGuestAdditions_${VBOX_VERSION}.iso /media/iso
  7.      CURRPWD=`pwd`
  8.      cd /media/iso
  9.      ./VBoxLinuxAdditions.run
  10.      cd ${CURRPWD}
  11.      umount /media/iso
  12.      unlink VBoxGuestAdditions_${VBOX_VERSION}.iso
  13.   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.

  1.   config.vm.synced_folder ".", "/data/", disabled: true
  2.  
  3.   config.vm.provider "virtualbox" do |vb|
  4.     vb.gui = true
  5.     vb.memory = "1024"
  6.   end

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

  1. def virtualbox_version()
  2.     vboxmanage = Vagrant::Util::Which.which("VBoxManage") || Vagrant::Util::Which.which("VBoxManage.exe")
  3.     if vboxmanage == nil && Vagrant::Util::Platform.windows?
  4.         vboxmanage = ENV["VBOX_MSI_INSTALL_PATH"] || ENV["VBOX_INSTALL_PATH"]
  5.         vboxmanage = vboxmanage + "\\VBoxManage.exe"
  6.     end
  7.     if vboxmanage != nil
  8.         s = Vagrant::Util::Subprocess.execute(vboxmanage, '--version')
  9.         longVersion = s.stdout.strip!
  10.                 shortVersion = longVersion.split("r")[0]
  11.                 return shortVersion
  12.     else
  13.         return nil
  14.     end
  15. end
  16.  
  17. VBOX_VERSION = virtualbox_version()
  18.  
  19. Vagrant.configure("2") do |config|
  20.  
  21.   config.vm.synced_folder ".", "/data/", disabled: true
  22.  
  23.   config.vm.provider "virtualbox" do |vb|
  24.     vb.gui = true
  25.     vb.memory = "1024"
  26.   end
  27.  
  28.   config.vm.provision "vbguestupdate", type: "shell", env: {"VBOX_VERSION" => VBOX_VERSION}, inline: <<-SHELL
  29.      echo 'if [ -n "${DISPLAY}" ]; then setxkbmap hu; fi;' >>/home/vagrant/.bashrc
  30.  
  31.      wget http://download.virtualbox.org/virtualbox/${VBOX_VERSION}/VBoxGuestAdditions_${VBOX_VERSION}.iso
  32.      mkdir -p /media/iso
  33.      mount -o loop VBoxGuestAdditions_${VBOX_VERSION}.iso /media/iso
  34.      CURRPWD=`pwd`
  35.      cd /media/iso
  36.      ./VBoxLinuxAdditions.run
  37.      cd ${CURRPWD}
  38.      umount /media/iso
  39.      unlink VBoxGuestAdditions_${VBOX_VERSION}.iso
  40.   SHELL
  41.  
  42.   config.vm.provision "reboot", type: "shell", inline: "reboot"
  43. 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:

  1. vagrant destroy -f
  2. vagrant up --provider vitualbox
  3. vagrant halt
  4. 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:

  1. vagrant init itsziget/docker-webdev --box-version 1.0.0
  2. 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

Új hozzászólás