2015-11-22 23:00:10

Nuosavo Larvel konteinerio gamyba - Dockerfile

Laikas išmokti susikurti pirmajį konteinerį. Kurį galėsite panaudoti Laravel5 projektų kūrimui.

Šioje pamokėlėje kursime konteinerį, kuris galės būti naudojamas kaip mobili mūsų programavimo darbo aplinka. Juo galima keistis su savo kolegomis, ar naudoti keliuose kompiuteriuose, kuriuose yra sudiegtas Docker, be papildomo konfigūravimo. Kitaip sakant, alternatyva Vagrant.

Sekančiose pamokėlėse apžvelgsime Docker Compose ir konteinerių panaudojimą CI procese, kuriant savo virtualią TEST aplinką.

Svarbu: Labai džiaugiuosi. Labai džiaugiuosi už Microsoft. Gal net labiau nei džiaugiausi tuomet kai gavau pirmą veikiantį Win 10 tech preview. Docker puikiai veikia Windows OS aplinkoje.

Susidūriau su dviem problemomis (skirtumais tarp sistemų): path'ų aprašymas ir portų mapinimas.

Jei neturite susdiegę Docker, siūlau prieš tai perskaityti mano paruoštas pamokėles - Docker diegimas ir Pirmasis docker paleidimas.

Taigi, kimbame į darbus.

Jei sekate tutorialą ir naudosite Windows ar Mac OS, visas komandas vykdykite Docker Quickstart terminale konsolėje, jei Linux, tiesiog shell'e.

Bazė

Pirmiausiai nukeliaujame iki savo projektų direktorijos. Mano atveju Unix sistemose darbinė direktorija yra /home/lukasm/projects, Windows c:\Users\lmike\Documents.

Visas direktorija galite kurti nebūtinai iš komandinės eilutės. Bet bus papraščiau ir naudingiau jei seksite pamokėlę.

Taigi, darbinėje direktorijoje suskuriame direktoriją docker. Tai bendrinė, šios pamokėlės direktorija, joje gulės visi su šia pamokėle susiję dokerio atvaizdai ir kiti failai. Jauskitės laisvai, jei norite ją užvadinti kitaip, tačiau daug papraščiau mokytis bus, jei ją paliksite tokią pat.

Taigi:

mkdir docker

ir joje sukuriame docker-laravel, t.y:

cd docker
mkdir docker-laravel

docker-laravel bus jūsų atvaizdo pavadinimas. Vėlgi, jei norite ar jaučiate tam pareigą, galite jį vadinti kitaip.

Joje sukuriame failą Dockerfile

 touch docker-laravel/Dockerfile

Toliau Dockerfile aprašysime Jūsų pirmo komponento diegimą ir paleidimą.

Žinoma, tai bus web serveris. Šiuo atveju, tai nginx.

Bet, pirmiausiai Dockerfile (jei tingite sekti viską detaliai, visas šios pamokėlės dalies Dockerfile yra čia) įrašome:

FROM debian:jessie 
MAINTAINER "Vardenis Pavardenis" <meilas@gmail.com>

Faila atsidaryti galima:

nano docker-laravel/Dockerfile

Tai yra bazinė Jūsų Docker image (atvaizdo) struktūra. Ji išlieka panaši visuose Docker atvaizduose. 

Taigi. Šio atvaizdo bazė bus Linux Debian leidimas pavadinimu Jessie. Kitaip sakant, prieš diegiant nginx Docker sudiegs Debian Linux'ą. Ši Linux "veislė" yra giminga Ubuntu, tiksliau Ubuntu yra kilęs iš Debian. Jis naudojamas daugelyje profesionalių web serverių mašinų, o jei jums tektų dirbti su Ubuntu, pagrindinės komandos praktiškai nesiskiria. Dėl šių priežaščių ir verta rinktis šią Linux distribuciją.

Papildome failą eilute:

# Install Nginx
RUN apt-get update -y && apt-get install -y nginx

             Ši eilutė (komanda), nurodo Dockeriui atlikti atitinkamus veiksmus:

  • Atnaujinti apt repositorijos duomenis

  • Pasinaudojant apt programėle, sudiegti nginx. -y opcija automatiškai atsako Y į klausimą kuris atsiras nginx diegimo metu.

 Ok išsitestuokime, kad įsitikinti, jog nenupjovėme į lankas. Konsolėje paleidžiame komandą, kuri subuildins mūsų atvaizdą:

docker build docker-laravel

Užtruks. Galime parūkyti, išgerti kavos, ar paskaityti techcrunch :)

Sending build context to Docker daemon 2.048 kB
Step 0 : FROM debian:jessie
 ---> a604b236bcde
Step 1 : MAINTAINER "Vardenis Pavardenis" <meilas@gmail.com>
 ---> Using cache
 ---> 04860aa88d92
Step 2 : RUN apt-get update -y && apt-get install -y nginx
 ---> Running in bb5c5ffb538b
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]
Ign http://httpredir.debian.org jessie InRelease
Get:2 http://httpredir.debian.org jessie-updates InRelease [135 kB]
Get:3 http://security.debian.org jessie/updates/main amd64 Packages [189 kB]
[... Tekstas, daug teskto, api tai ką veikia Linux'as .. ]
Successfully built fdc9efc03e4c

 Jei gauname atsakymą Sucessfully built, sakykime, šiam kartui, veikia pakankamai gerai.

Kaip jau supratote, atvaizdo buildinimas tai jo paruošimas naudojimui. Reikiamų komponentų parsiuntimas ir sudiegimas, konfigūracijos parengimas.

Na o sudiegus web serverį, prieš jį paleidžian, reikia pakonfigūruoti...

Todėl sukurkime direktoriją config.

mkdir -p docker-laravel/config

 Sukuriame būsimo Laraver host'o konfigūracinį failą:

touch docker-laravel/config/laravel

Užpildome eilutemis iš šio config, esančio gitHub'e.

Dabar Dockerfile turime nurodyti, jog konteinerio kūrimo metu šie konfig failai būtų įkelti į reikiamas vietas mūsų virtualiame "serveryje" - konteineryje.

Visas Dockerfile yra čia: gitHub'e. Papildykite trūkstamomis eilutėmis arba nukopijuokite viską :)

Komentarai yra pačiame faile.

Paleidžiame konteinerį pasinaudodami komanda:

docker build -t lukasm/laravel-sandbox:v0.0.1 docker-laravel

 

  • docker build  komanada su parametru -t subuildina Docker Image.
  • -t - nurodo, jog image'ui bus priskirtas TAG'as.
  • lukasm/laravel-sandbox - tago pavadinimas (gali buti tiesiog laravel-sandbox)
  • v0.0.1 - versijos tagas.
  • docker-laravel - kelias iki direktorijos kurioje guli Dockerfile. Jei esate toje pačioje direktorijoje, tieisog nurodykite "." (tašką:) ).


Kad įsitikinti, jog viskas įvyko sėkmingai parašome komadą :

docker images

Ši komanda išveda visus subuildintus (paruoštus paleidimui) images:

REPOSITORY               TAG             IMAGE ID         CREATED          VIRTUAL SIZE
lukasm/laravel-sandbox   v0.0.1           1328d104cbce     10 minutes ago 196.2 MB

Paleidžiame:

docker run -d lukasm/laravel-sandbox:v0.0.1

docker build komanda paleidžia konteinerį pagal jūsų sukurtą atvaizdą.

Peržiurėti veikiančius konteinerius galite su komanda:

docker ps

sustabdyti su:

docker stop 


Dabar reikės prijungti failinę sistemą, su failu, kurį atvaizduotų jūsu Docker veikiantis web serveris.

Sukuriame dir:

mkdir -p docker-laravel/laravel/public
touch docker-laravel/laravel/index.php
Pridedame kodą, kad įsitikintume, jog veikia PHP:
docker run -i -p 80:80 -v ~/projects/docker/docker-laravel/logs:/var/log/nginx -v ~/projects/docker/docker-laravel/laravel:/data/www lukasm/laravel-sandbox:v0.0.1

Tačiau Win sistemoje negalima nurodyti visą path, COPY/PASTE principu. Win path dalis turi būti escapinama // dvitaškis : taip pat pakeičiamas / . Win platformoje paleidimo komanda atrodytų taip:

docker run -i -p 80:80 -v //c/Users/lmike/Documents/docker/docker-laravel/logs:/var/log/nginx -v //c/Users/lmike/Documents/docker/docker-laravel/laravel:/data/www lukasm/laravel-sandbox:v0.0.1

Mac OS paleidžiant reikia nurodyti ir Docker Machine IP adresą:

docker run -i -p 192.168.99.100:81:80 -v /Users/lukasm/projects/docker/docker-laravel/logs:/var/log -v /Users/lukasm/projects/docker/docker-laravel/laravel:/data/www lukasm/laravel-sandbox:v0.0.1

Docker machine IP adresa galite gauti pasinaudja komanda:

docker-machine ip default 

default šiuo atveju yra jūsų docker machine pavadinimas. 


Kitas būdas, emuliuoti realiatyvius kelius iki failų yra:

docker run -i -p 80:80 -v /$(pwd)//docker-laravel/logs:/var/log -v /$(pwd)//docker-laravel/laravel:/data/www lukasm/laravel-sandbox:v0.0.1

$(pwd) išveda dabartinę naudojamą direktoriją, t.y. tą kurioje leidžiama komanda.

Dėmesio: toliau, mano aprašytos komandos buvo leistos WIN aplinkoje.

 

Atkreipkite dėmesį, jog dabar komandą leidžiame su opcija -i, kas reiškia "interactive". Visa konteinerio išvestis (output), bus spauzdinama į jūsų konsolės ekraną.

 

Paleidus konteinerį, turėtumėte gauti klaidą, panašią į:

nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (2: No such file or directory)

2015/12/08 13:47:37 [emerg] 1#0: open() "/var/log/nginx/access.log" failed (2: No such file or directory))

Taip nutiko todėl, kad failinėje sistemoje, nesukūrėme direktorijų log/nginx.

Sukuriame:

mkdir -p docker-laravel/logs/nginx

 

 

Dar kart paleidžiame konteinerį, dabar jau ne su -i o su -d (dettached, veikia background'e) opcija.

docker run -d -p 80:80 -v /$(pwd)//docker-laravel/logs:/var/log -v /$(pwd)//docker-laravel/laravel:/data/www lukasm/laravel-sandbox:v0.0.1

 

Dėmesio: jei leidžiant gausite klaidą, jog portas 80 yra užimtas (greičiausiai dirbant Linux), turite sustabdyti savo kompiuteryje veikiančius apache2 arba ngnix serverius. Jei toki turite. Kadangi domites web dev, tai esu isitikines, kad turite.

Gali būti problemų ir su skype, jis taip patnaudoja 80 portą kuris kertasi su web serverių naudojamu default portu. Taip visas internatas pastatytas ant 80 porto :D 


Pirmiausiai patikrinkime ar konteineris pasileido:

docker ps


Norėdami pasitikslinti, koks IP yra priskirtas Docker'io mašinai, kuri veikia mūsų kompiuteryje, rašome.

docker-machine ip default 

Mano atveju ip yra: 192.168.99.100 .

 
Todėl į savo mėgiamą Chrome browserį įrašiau:
http://192.168.99.100/

Na klaidos negavome, bet kas nutiko? Jūsų index.php buvo parsiųstas į jūsų kompiuterį, o ne paleistas ir jo programa nebuvo atvaizduota naršyklės lange...

Kadangi Nginx yra tik klijai tarp naršyklės ir programinio kodo, mums trūksta pačio svarbiauso: PHP.  

Todėl turėsime pataisyti Dockerfile ir subuildinti image iš naujo.

Šiuo atveju, kadangi ruošiame konteinerį savo DEV (programavimo aplinkai), viską sudėsime į vieną konteinerį. Tačiau dokerio koncepcija nurodo, kad kiekvienas procesas, ar komponentas turi būti atskirame image ir konteineryje. Kaip minėjau, šį atvejį panagrinėsime kitoje pamokoje. Ši kartą suplakime viską į vieną image ir konteinerį. Paprastumo ir patogumo dėlei.


Pilnas paketas

Taigi, sekantis būtinas reikalas yra veikiantis PHP.
Manau atspėjote, redaguosime Dockerfile'ą.

Paprastumo dėlei, nediegsime visu PHP extesionų, tik Laravel5 veikimui būtinus.

Atnaujintą Dockerfile galite rasti čia. Be PHP diegimo sudiegsimer ir supervisor.

Taip pat sudiegsime ir composer, būtinas įrankis dirbant su Laravel, ar kitais PHP framework'ais. 

supervisor naudojamas prižiūrėti kitus procesus. Juos paleidžia, perkrauna ar prikelia jei jie nugriūva. Jis reikalingas tam, kad Docker konteineryje, galėtume leisti kelis procesus vienu metu. Docker to neleidžia. Prisimenate, Docker koncepcija: "vienas procesas viename konteineryje". Kas nėra patogu kuriant mobilią DEV aplinką, daug patogiau turėti vieną Dockerfile, vienoje direktorijoje. Taigi naudojame, supervisor, hacką ;)

Šiuo atveju supervisor paleis nginx ir php, o apie tai kaip jam seksis "ganyti" šiuos procesus, viską surašys į log'ą.

Viskas kas nauja Dockerfile turi komentarus. Apie komandas naudojamas Dockerfile, parašysiu atskirą pamokėlę.

Taigi atnaujiname Dockerfile, kurį gauname iš GitHub'o.

Prisidedame trūkstamą supervisor konfigūracinį failą.

 

Subuildiname naują versiją:

docker build -t lukasm/laravel-sandbox:v0.0.2 docker-laravel

Kaip matote, pasikeitė versijos tag'as, iš v0.0.1 į v0.0.2 .


Ir eilinį kartą paleidžiame:

docker run -d -p 192.168.99.100:80:80 -v /$(pwd)//docker-laravel/logs:/var/log -v /$(pwd)//docker-laravel/laravel:/data/www lukasm/laravel-sandbox:v0.0.2

 

Dar kart į browserį įrašiau (mano "docker machine" IP):
http://192.168.99.100

Šaunu, gauname visą PHP konfigūracijos informaciją. Galime keliauti toliau.

 

Laravel5 dalis

Kad pasiruošti Laravel projekto programavimui, mums reikia įsidiegti patį Laravel.
Todėl pašaliname jau esančią Laravel direktoriją:

rm -rf docker-laravel/laravel/


Ir iš gitHub parsisiunčiame pradinį Laravel projektą:

cd docker-laravel
git clone https://github.com/laravel/laravel.git

 

Turėsime paruošti Laravel paleidimui. Todėl, pirmiausiai suteikiame rašymo teises į Laravel direktorijas, išoriniams procesams:

chmod -R 0777 laravel/bootstrap/cache
chmod -R 0777 laravel/storage

 

Pervadiname Laravel ENV faila, kad automatiniai diegimo scriptai galėtų į jį rašyti konfigūracijos reikšmes:

mv laravel/.env.example laravel/.env

 

Keliaujame į Laravel direktoriją:

cd laravel


Kur bandysime sudiegti visus dependencies su composer pagalba, todėl rašome:

composer install


Jei neturite globalaus composer, gauname klaidą :(
Jei klaidos negaunate, rekomenduoju paskaityti, neskipinant šios dalies.


Taip, nors ir matote is Dockerfile, kad composer yra sudiegtas, bet deja, jis yra tik mūsų konteineryje o failinė sistema yra išorėje. Kad galėtume atlikti operacijas su composer iš išrorės, pasinaudosime, viešu Docker konteineriu. Jis yra ptalpintas Docker hub'e. Parsisiunčiam:

docker pull composer/composer

 Ir kaip nurodo gamintojas paleidžiame:

docker run -i -v /$(pwd)//docker-laravel/laravel:/app composer/composer install


Leidžiame su opcija -i, kad matytume visą composer išvestį (output'ą).

Dabar reikalingas paskutinis žingsnis leisiantis mums pabaigti Laravel5 diegimą ir jį pasileisti. 

 Sukuriame Laravel secret raktą:

docker exec -it  php /data/www/artisan key:generate

 

Dar kart į browserį įrašiau: http://192.168.99.100

 

Ir, turiu veikiantį docker konteinerį, paruoštą Laravel5 programavimui ir paleidimui.

 

Jei gaunate baltą langą ar klaidą, pasitikrinkite log'us.

 


Keletas naudingų komandų kurių nenaudojome šiame turorial'e

Pašilinti Docker image galime:

docker rmi