Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

Pirmkārt, neliela teorija. Kas notika Divpadsmit faktoru lietotne?

VienkārÅ”iem vārdiem sakot, Å”is dokuments ir izstrādāts, lai vienkārÅ”otu SaaS lietojumprogrammu izstrādi, palÄ«dzot informēt izstrādātājus un DevOps inženierus par problēmām un praksēm, ar kurām visbiežāk nākas saskarties mÅ«sdienu lietojumprogrammu izstrādē.

Dokumentu veidojuŔi Heroku platformas izstrādātāji.

Divpadsmit faktoru lietotni var lietot lietojumprogrammām, kas rakstÄ«tas jebkurā programmÄ“Å”anas valodā un izmantojot jebkuru atbalsta pakalpojumu kombināciju (datu bāzes, ziņojumu rindas, keÅ”atmiņas utt.).

ÄŖsumā par faktoriem, uz kuriem Ŕī metodoloÄ£ija ir balstÄ«ta:

  1. Kodu bāze ā€“ Viena koda bāze, kas tiek izsekota versiju kontrolē ā€“ vairākas izvietoÅ”anas
  2. Atkarības - Skaidri deklarējiet un izolējiet atkarības
  3. Konfigurācija - Saglabājiet konfigurāciju izpildlaikā
  4. Atbalsta pakalpojumi ā€“ Apsveriet atbalsta pakalpojumus kā spraudņu resursus
  5. Veidojiet, atlaidiet, palaist ā€“ Stingri noŔķiriet montāžas un izpildes posmus
  6. Procesi ā€“ Palaidiet lietojumprogrammu kā vienu vai vairākus bezvalsts procesus
  7. Portu iesieÅ”ana ā€“ Eksporta pakalpojumi, izmantojot ostas iesieÅ”anu
  8. Paralēlisms - Mērogojiet savu lietojumprogrammu, izmantojot procesus
  9. VienreizlietojamÄ«ba - Maksimāli palieliniet uzticamÄ«bu ar ātru palaiÅ”anu un tÄ«ru izslēgÅ”anu
  10. Lietojumprogrammu izstrādes/darbÄ«bas paritāte ā€“ Saglabājiet savu izstrādes, iestudÄ“Å”anas un ražoÅ”anas vidi pēc iespējas lÄ«dzÄ«gāku
  11. Mežizstrāde - Skatiet žurnālu kā notikumu plūsmu
  12. Administrācijas uzdevumi ā€“ Veikt administrÄ“Å”anas/pārvaldÄ«bas uzdevumus, izmantojot ad hoc procesus

PlaŔāku informāciju par 12 faktoriem varat iegūt no tālāk norādītajiem resursiem.

Kas ir zili zaļā izvietoŔana?

Zili zaļā izvietoÅ”ana ir lietojumprogrammas piegādes metode ražoÅ”ana tādā veidā, lai gala klients neredzētu nekādas izmaiņas no viņa puses. Citiem vārdiem sakot, lietojumprogrammas izvietoÅ”ana ar nulli dÄ«kstāves.

Klasiskā BG izvietoÅ”anas shēma izskatās kā parādÄ«ta zemāk esoÅ”ajā attēlā.

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

  • Sākumā ir 2 fiziski serveri ar absolÅ«ti vienādu kodu, lietojumprogrammu, projektu un ir marÅ”rutētājs (balansētājs).
  • MarÅ”rutētājs sākotnēji visus pieprasÄ«jumus novirza uz vienu no serveriem (zaļŔ).
  • BrÄ«dÄ«, kad nepiecieÅ”ams vēlreiz izlaist, viss projekts tiek atjaunināts citā serverÄ« (zils), kas paÅ”laik neapstrādā nevienu pieprasÄ«jumu.
  • Kad kods ir ieslēgts zils serveris ir pilnÄ«bā atjaunināts, marÅ”rutētājam tiek dota komanda pārslēgties zaļŔ par zils serveris.
  • Tagad visi klienti redz koda rezultātu zils serveris.
  • Kādu laiku, zaļŔ serveris kalpo kā rezerves kopija neveiksmÄ«gas izvietoÅ”anas gadÄ«jumā zils serveri un kļūmes un kļūdu gadÄ«jumā marÅ”rutētājs pārslēdz lietotāja plÅ«smu atpakaļ uz zaļŔ serveris ar veco stabilo versiju, un jaunais kods tiek nosÅ«tÄ«ts pārskatÄ«Å”anai un pārbaudei.
  • Un procesa beigās tas tiek atjaunināts tādā paŔā veidā zaļŔ serveris. Un pēc tā atjaunināŔanas marÅ”rutētājs pārslēdz pieprasÄ«jumu plÅ«smu atpakaļ uz zaļŔ serveris.

Tas viss izskatās ļoti labi, un no pirmā acu uzmetiena ar to nevajadzētu būt nekādām problēmām.
Bet, tā kā mēs dzÄ«vojam mÅ«sdienu pasaulē, klasiskajā shēmā norādÄ«tā iespēja ar fizisko pārslēgÅ”anu mums nav piemērota. Pagaidām ierakstiet informāciju, mēs pie tās atgriezÄ«simies vēlāk.

Slikts un labs padoms

AtbildÄ«bas noraidÄ«Å”ana: Zemāk esoÅ”ie piemēri parāda manis izmantotās utilÄ«tas/metodoloÄ£ijas, jÅ«s varat izmantot pilnÄ«gi jebkuras alternatÄ«vas ar lÄ«dzÄ«gām funkcijām.

Lielākā daļa piemēru vienā vai otrā veidā krustosies ar tīmekļa izstrādi (tas ir pārsteigums), ar PHP un Docker.

Turpmākajās rindkopās ir sniegts vienkārÅ”s praktisks faktoru izmantoÅ”anas apraksts, izmantojot konkrētus piemērus; ja vēlaties iegÅ«t vairāk teorijas par Å”o tēmu, izmantojiet iepriekÅ” norādÄ«tās saites uz sākotnējo avotu.

1. Kodu bāze

Izmantojiet FTP un FileZilla, lai pa vienam augÅ”upielādētu failus serveros, neglabājiet kodu nekur citur kā tikai ražoÅ”anas serverÄ«.

Projektam vienmēr jābÅ«t vienai koda bāzei, tas ir, viss kods nāk no viena Git krātuve. Serveri (ražoÅ”ana, iestudÄ“Å”ana, test1, test2...) izmanto kodu no viena kopÄ«ga repozitorija filiālēm. Tādā veidā mēs panākam koda konsekvenci.

2. Atkarības

Lejupielādējiet visas mapēs esoŔās bibliotēkas tieÅ”i projekta saknē. Veiciet atjauninājumus, vienkārÅ”i pārsÅ«tot jauno kodu uz mapi ar paÅ”reizējo bibliotēkas versiju. Instalējiet visas nepiecieÅ”amās utilÄ«tas tieÅ”i resursdatora serverÄ«, kur darbojas vēl 20 pakalpojumi.

Projektam vienmēr jābūt skaidri saprotamam atkarību sarakstam (ar atkarībām es domāju arī vidi). Visām atkarībām jābūt skaidri definētām un izolētām.
Ņemsim par piemēru Komponists Šø dokers.

Komponists ā€” pakotņu pārvaldnieks, kas ļauj instalēt bibliotēkas PHP. Composer ļauj precÄ«zi vai brÄ«vi norādÄ«t versijas un tās skaidri definēt. ServerÄ« var bÅ«t 20 dažādi projekti, un katram no tiem bÅ«s personisks pakotņu un bibliotēku saraksts, kas nav atkarÄ«gs no otra.

dokers ā€” utilÄ«ta, kas ļauj definēt un izolēt vidi, kurā lietojumprogramma darbosies. AttiecÄ«gi, tāpat kā ar komponistu, bet pamatÄ«gāk, varam noteikt, ar ko aplikācija darbojas. Izvēlieties konkrētu PHP versiju, instalējiet tikai tās pakotnes, kas nepiecieÅ”amas, lai projekts darbotos, nepievienojot neko papildus. Un pats galvenais, neiejaucoties resursdatora un citu projektu pakotnēs un vidē. Tas ir, visi projekti serverÄ«, kas darbojas caur Docker, var izmantot pilnÄ«gi jebkuru pakotņu kopu un pilnÄ«gi atŔķirÄ«gu vidi.

3. Konfigurācija

Saglabājiet konfigurācijas kā konstantes tieŔi kodā. AtseviŔķas konstantes testa serverim, atseviŔķas ražoŔanai. Piesaistiet lietojumprogrammas darbību atkarībā no vides tieŔi projekta biznesa loģikā, izmantojot if else konstrukcijas.

Konfigurācijas - tas ir vienÄ«gais veids, kā projektu izvietoÅ”anai vajadzētu atŔķirties. Ideālā gadÄ«jumā konfigurācijas jānodod caur vides mainÄ«gajiem (env vars).

Tas ir, pat ja saglabājat vairākus konfigurācijas failus .config.prod .config.local un izvietoÅ”anas laikā pārdēvējat tos par .config (galveno konfigurāciju, no kuras lietojumprogramma nolasa datus), tā nebÅ«s pareizā pieeja, jo Å”ajā gadÄ«jumā informācija no konfigurācijām bÅ«s publiski pieejama visiem lietojumprogrammu izstrādātājiem, un dati no ražoÅ”anas servera tiks apdraudēti. Visas konfigurācijas ir jāsaglabā tieÅ”i izvietoÅ”anas sistēmā (CI/CD) un jāģenerē dažādām vidēm ar dažādām vērtÄ«bām, kas nepiecieÅ”amas konkrētai videi izvietoÅ”anas laikā.

4. TreŔās puses pakalpojumi

Esiet stingri saistÄ«ts ar vidi, izmantojiet dažādus savienojumus vieniem un tiem paÅ”iem pakalpojumiem noteiktās vidēs.

Faktiski Å”is punkts lielā mērā pārklājas ar punktu par konfigurācijām, jo ā€‹ā€‹bez Ŕī punkta nevar izveidot normālus konfigurācijas datus, un kopumā konfigurÄ“Å”anas iespēja samazināsies.

Visiem savienojumiem ar ārējiem pakalpojumiem, piemēram, rindu serveriem, datu bāzēm, keÅ”atmiņas pakalpojumiem, ir jābÅ«t vienādiem gan lokālajā vidē, gan treŔās puses/ražoÅ”anas vidē. Citiem vārdiem sakot, jebkurā laikā, mainot savienojuma virkni, es varu aizstāt zvanus uz bāzi #1 ar bāzi #2, nemainot lietojumprogrammas kodu. Vai arÄ«, skatoties uz priekÅ”u, piemēram, mērogojot pakalpojumu, jums nebÅ«s Ä«paÅ”i jānorāda savienojums papildu keÅ”atmiņas serverim.

5. Veidot, atbrīvot, izpildīt

ServerÄ« ir tikai koda galÄ«gā versija, bez iespējas atsaukt laidienu. Nav nepiecieÅ”ams aizpildÄ«t vietu diskā. Ikviens, kurÅ” domā, ka var izlaist kodu ražoÅ”anā ar kļūdu, ir slikts programmētājs!

Visiem izvietoŔanas posmiem jābūt atdalītiem vienam no otra.

Ir iespēja atkāpties. Izveidojiet izlaidumus ar vecām lietojumprogrammas kopijām (jau saliktas un gatavas cīņai), kas saglabātas ātrā piekļuvē, lai kļūdu gadÄ«jumā varētu atjaunot veco versiju. Tas ir, nosacÄ«ti ir mape izlaidumi un mapi strāvaun pēc veiksmÄ«gas mapes izvietoÅ”anas un montāžas strāva ir saistÄ«ta ar simbolisku saiti uz jauno versiju, kas atrodas iekÅ”pusē izlaidumi ar parasto izlaiduma numura nosaukumu.

Å eit mēs atceramies Blue-Green izvietoÅ”anu, kas ļauj ne tikai pārslēgties starp kodiem, bet arÄ« pārslēgties starp visiem resursiem un pat vidēm ar iespēju visu atsaukt.

6.Procesi

Saglabājiet lietojumprogrammas stāvokļa datus tieÅ”i paŔā lietojumprogrammā. Izmantojiet sesijas paÅ”as lietojumprogrammas RAM. Izmantojiet pēc iespējas vairāk koplietoÅ”anas starp treÅ”o puÅ”u pakalpojumiem. Paļaujieties uz to, ka lietojumprogrammai var bÅ«t tikai viens process un neļaujiet mērogot.

Kas attiecas uz sesijām, glabājiet datus tikai keÅ”atmiņā, kuru kontrolē treŔās puses pakalpojumi (memcached, redis), tāpēc pat tad, ja jums darbojas 20 lietojumprogrammu procesi, jebkurÅ” no tiem, piekļūstot keÅ”atmiņai, varēs turpināt darbu ar klientu tas pats stāvoklis, kurā lietotājs strādāja ar lietojumprogrammu citā procesā. Izmantojot Å”o pieeju, izrādās, ka neatkarÄ«gi no tā, cik treÅ”o puÅ”u pakalpojumu kopiju jÅ«s izmantojat, viss darbosies normāli un bez problēmām ar piekļuvi datiem.

7. Portu iesieŔana

Tikai tÄ«mekļa serverim jāzina, kā strādāt ar treÅ”o puÅ”u pakalpojumiem. Vai vēl labāk, instalējiet treŔās puses pakalpojumus tieÅ”i tÄ«mekļa serverÄ«. Piemēram, kā PHP modulis programmā Apache.
Visiem jūsu pakalpojumiem ir jābūt savstarpēji pieejamiem, izmantojot piekļuvi kādai adresei un portam (localgost:5432, localhost:3000, nginx:80, php-fpm:9000), tas ir, no nginx es varu piekļūt gan php- fpm, gan postgres, un no php-fpm līdz postgres un nginx, un faktiski no katra pakalpojuma es varu piekļūt citam pakalpojumam. Tādā veidā pakalpojuma dzīvotspēja nav saistīta ar cita pakalpojuma dzīvotspēju.

8. Paralēlisms

Strādājiet ar vienu procesu, pretējā gadījumā vairāki procesi nevarēs saprasties viens ar otru!

Atstājiet vietu mērogoÅ”anas palielināŔanai. Docker spiets tam ir lieliski piemērots.
Docker Swarm ir rīks, lai izveidotu un pārvaldītu konteineru kopas gan starp dažādām iekārtām, gan konteineru kopumu vienā un tajā paŔā maŔīnā.

Izmantojot spietu, varu noteikt, cik resursu pieŔķirÅ”u katram procesam un cik viena un tā paÅ”a servisa procesus palaidÄ«Å”u, un iekŔējais balansētājs, saņemot datus par doto portu, automātiski tos proksis uz procesiem. Tādējādi, redzot, ka servera slodze ir palielinājusies, varu pievienot vairāk procesu, tādējādi samazinot atseviŔķu procesu slodzi.

9. Vienreizlietojamība

Neizmantojiet rindas, lai strādātu ar procesiem un datiem. Viena procesa nogalināŔanai vajadzētu ietekmēt visu lietojumprogrammu. Ja viens serviss pazÅ«d, viss pazÅ«d.

Katrs process un pakalpojums var tikt izslēgts jebkurā laikā, un tam nevajadzētu ietekmēt citus pakalpojumus (protams, tas nenozÄ«mē, ka pakalpojums nebÅ«s pieejams citam pakalpojumam, bet arÄ« to, ka pēc Ŕī pakalpojuma netiks izslēgts cits pakalpojums). Visi procesi ir jāpārtrauc graciozi, lai, tos pārtraucot, netiktu sabojāti dati un sistēma darbotos pareizi nākamajā ieslēgÅ”anas reizē. Tas ir, pat avārijas pārtraukÅ”anas gadÄ«jumā dati nedrÄ«kst tikt bojāti (Å”eit ir piemērots transakciju mehānisms, vaicājumi datu bāzē darbojas tikai grupās un, ja vismaz viens vaicājums no grupas neizdodas vai tiek izpildÄ«ts ar kļūda, tad neviens cits vaicājums no grupas galu galā faktiski neizdodas).

10. Lietojumprogrammu izstrādes/darbības paritāte

Lietojumprogrammas ražoÅ”anai, iestudējumam un vietējai versijai ir jābÅ«t atŔķirÄ«gai. RažoÅ”anā mēs izmantojam Yii Lite ietvaru un lokāli Yii, lai ražoÅ”anā tas darbotos ātrāk!

PatiesÄ«bā visām izvietoÅ”anām un darbam ar kodu vajadzētu bÅ«t gandrÄ«z identiskā vidē (mēs nerunājam par fizisko aparatÅ«ru). Tāpat jebkuram izstrādes darbiniekam ir jābÅ«t iespējai ievietot kodu ražoÅ”anā, ja nepiecieÅ”ams, nevis kādai Ä«paÅ”i apmācÄ«tai devops nodaļai, kas, tikai pateicoties Ä«paÅ”ajam spēkam, var pacelt lietojumprogrammu ražoÅ”anā.

Docker mums palÄ«dz arÄ« Å”ajā jautājumā. Ja tiek ievēroti visi iepriekŔējie punkti, izmantojot docker, vides izvietoÅ”anas process gan ražoÅ”anā, gan vietējā maŔīnā tiks ievadÄ«ts lÄ«dz vienas vai divu komandu ievadÄ«Å”anai.

11. Baļķi

Mēs ierakstām žurnālus failos un datu bāzēs! Mēs netīrām failus un datu bāzes no žurnāliem. Nopirksim cieto disku ar 9000 Peta baitiem, un tas ir labi.

Visi žurnāli jāuzskata par notikumu plÅ«smu. Pati lietojumprogramma nedrÄ«kst bÅ«t iesaistÄ«ta žurnālu apstrādē. Žurnāli ir jāizvada vai nu uz stdout, vai jānosÅ«ta, izmantojot protokolu, piemēram, udp, lai darbs ar žurnāliem neradÄ«tu lietojumprogrammai problēmas. graylog ir labs Å”im. Graylog, kas saņem visus žurnālus caur udp (Å”is protokols neprasa gaidÄ«t atbildi par veiksmÄ«gu paketes saņemÅ”anu), nekādā veidā netraucē lietojumprogrammai un nodarbojas tikai ar žurnālu strukturÄ“Å”anu un apstrādi. Lietojumprogrammas loÄ£ika nemainās, lai strādātu ar Ŕādām pieejām.

12. Administrācijas uzdevumi

Lai atjauninātu datus, datu bāzes utt., izmantojiet API atseviŔķi izveidotu galapunktu, izpildot to 2 reizes pēc kārtas, viss tiks dublēts. Bet jÅ«s neesat stulbs, jÅ«s nenoklikŔķināsit divreiz, un mums nav vajadzÄ«ga migrācija.

Visi administrÄ“Å”anas uzdevumi ir jāveic tajā paŔā vidē, kurā ir viss kods, laidiena lÄ«menÄ«. Tas ir, ja mums ir jāmaina datu bāzes struktÅ«ra, tad mēs to nedarÄ«sim manuāli, mainot kolonnu nosaukumus un pievienojot jaunas, izmantojot dažus vizuālus datu bāzes pārvaldÄ«bas rÄ«kus. Tādām lietām veidojam atseviŔķus skriptus - migrācijas, kuras tiek izpildÄ«tas visur un visās vidēs vienādi ar kopÄ«gu un saprotamu rezultātu. Visiem pārējiem uzdevumiem, piemēram, projekta aizpildÄ«Å”anai ar datiem, jāizmanto lÄ«dzÄ«gas metodoloÄ£ijas.

IevieÅ”anas piemērs PHP, Laravel, Laradock, Docker-Compose

P.S. Visi piemēri tika veikti operētājsistēmā MacOS. Lielākā daļa no tām ir piemērotas arī Linux. Windows lietotāji, piedodiet, bet es ilgu laiku neesmu strādājis ar Windows.

Iedomāsimies situāciju, kad mūsu datorā nav instalēta neviena PHP versija un nekas nav instalēts.
Instalējiet jaunākās docker un docker-compose versijas. (to var atrast internetā)

docker -v && 
docker-compose -v

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

1. Ielieciet Laradoka

git clone https://github.com/Laradock/laradock.git && 
ls

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

Par Laradoku teikÅ”u, ka ļoti forÅ”a lieta, kurā ir daudz konteineru un palÄ«glietas. Bet es neieteiktu izmantot Laradock kā tādu bez modifikācijām ražoÅ”anā, jo tā ir dublējoÅ”a. Labāk ir izveidot savus konteinerus, pamatojoties uz piemēriem Laradokā, tas bÅ«s daudz optimizētāk, jo nevienam nav vajadzÄ«gs viss, kas tur ir vienlaikus.

2. Konfigurējiet Laradock, lai palaistu mūsu lietojumprogrammu.

cd laradock && 
cp env-example .env

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

2.1. Atveriet habr direktoriju (vecmapi, kurā tiek klonēts laradock) kādā redaktorā. (manā PHPStorm gadījumā)

Å ajā posmā mēs pieŔķiram projektam tikai nosaukumu.

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

2.2. Palaidiet darbvietas attēlu. (Jūsu gadījumā attēlu izveide prasīs kādu laiku)
Darbvieta ir Ä«paÅ”i sagatavots attēls darbam ar ietvaru izstrādātāja vārdā.

Mēs ieejam konteinerā, izmantojot

docker-compose up -d workspace && 
docker-compose exec workspace bash

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

2.3. Laravel instalēŔana

composer create-project --prefer-dist laravel/laravel application

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

2.4. Pēc instalÄ“Å”anas mēs pārbaudām, vai ir izveidots direktorijs ar projektu, un nogalinām komponÄ“Å”anu.

ls
exit
docker-compose down

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

2.5. Atgriezīsimies pie PHPStorm un .env failā iestatīsim pareizo ceļu uz mūsu laravel lietojumprogrammu.

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

3. Pievienojiet visu kodu Git.

Lai to izdarītu, Github (vai jebkur citur) izveidosim repozitoriju. Dosimies uz habr direktoriju terminālī un izpildīsim Ŕādu kodu.

echo "# habr-12factor" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin [email protected]:nzulfigarov/habr-12factor.git # Š·Š“ŠµŃŃŒ Š±ŃƒŠ“ŠµŃ‚ ссыŠ»ŠŗŠ° Š½Š° Š²Š°Ńˆ рŠµŠæŠ¾
git push -u origin master
git status

Pārbaudīsim, vai viss ir kārtībā.

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

ĒrtÄ«bas labad es iesaku izmantot kādu Git vizuālo saskarni, manā gadÄ«jumā tā ir GitKraken. (Å”eit ir novirzÄ«Å”anas saite)

4. Sāksim palaist!

Pirms palaiŔanas pārliecinieties, vai 80. un 443. portos nekas nekarājas.

docker-compose up -d nginx php-fpm

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

Tādējādi mÅ«su projekts sastāv no 3 atseviŔķiem pakalpojumiem:

  • nginx - tÄ«mekļa serveris
  • php-fpm - php pieprasÄ«jumu saņemÅ”anai no tÄ«mekļa servera
  • darbvieta - php izstrādātājiem

Šobrīd esam panākuŔi, ka esam izveidojuŔi aplikāciju, kas atbilst 4 punktiem no 12, proti:

1. Kodu bāze ā€” viss kods atrodas vienā repozitorijā (maza piezÄ«me: varētu bÅ«t pareizi pievienot docker iekŔā laravel projektu, bet tas nav svarÄ«gi).

2. Atkarības - Visas mūsu atkarības ir skaidri norādītas failā application/composer.json un katrā katra konteinera Docker failā.

3. Atbalsta pakalpojumi ā€” Katrs no pakalpojumiem (php-fom, nignx, workspace) dzÄ«vo savu dzÄ«vi un ir savienots no ārpuses un, strādājot ar vienu pakalpojumu, otrs netiks ietekmēts.

4. Procesi ā€” katrs pakalpojums ir viens process. Katrs no pakalpojumiem neuztur iekŔējo stāvokli.

5. Portu iesieŔana

docker ps

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

Kā redzam, katrs pakalpojums darbojas savā portā un ir pieejams visiem pārējiem pakalpojumiem.

6. Paralēlisms

Docker ļauj mums izveidot vairākus vienu un to paŔu pakalpojumu procesus ar automātisku slodzes līdzsvaroŔanu starp tiem.

Apturēsim konteinerus un izlaidīsim tos caur karogu -- mērogs

docker-compose down && 
docker-compose up -d --scale php-fpm=3 nginx php-fpm

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

Kā redzam, ir izveidotas php-fpm konteinera kopijas. Strādājot ar Å”o konteineru, mums nekas nav jāmaina. Mēs turpinām tai piekļūt arÄ« ostā 9000, un Docker regulē mÅ«su vietā slodzi starp konteineriem.

7. VienreizlietojamÄ«ba - katru konteineru var nogalināt, nekaitējot otram. Konteinera apturÄ“Å”ana vai restartÄ“Å”ana neietekmēs lietojumprogrammas darbÄ«bu turpmāko palaiÅ”anas laikā. Katru konteineru var arÄ« pacelt jebkurā laikā.

8. Lietojumprogrammu izstrādes/darbÄ«bas paritāte - visas mÅ«su vides ir vienādas. Palaižot sistēmu ražoÅ”anas serverÄ«, jums nekas nebÅ«s jāmaina savās komandās. Tādā paŔā veidā viss bÅ«s balstÄ«ts uz Docker.

9. Mežizstrāde ā€” visi žurnāli Å”ajos konteineros tiek straumēti un ir redzami Docker konsolē. (Å”ajā gadÄ«jumā ar citiem mājās gatavotiem konteineriem tas var nebÅ«t tā, ja jÅ«s par to nerÅ«pējaties)

 docker-compose logs -f

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

Bet ir tāda problēma, ka PHP un Nginx noklusējuma vērtÄ«bas arÄ« ieraksta žurnālus failā. Lai izpildÄ«tu 12 faktorus, tas ir nepiecieÅ”ams atspējot ierakstot žurnālus failā katra konteinera konfigurācijās atseviŔķi.

Docker nodroÅ”ina arÄ« iespēju nosÅ«tÄ«t žurnālus ne tikai uz stdout, bet arÄ« uz tādām lietām kā graylog, ko es minēju iepriekÅ”. Graylog iekÅ”ienē mēs varam darbināt žurnālus pēc saviem ieskatiem, un mÅ«su lietojumprogramma to nekādā veidā nepamanÄ«s.

10. Administrācijas uzdevumi ā€” visus administrÄ“Å”anas uzdevumus laravel risina, pateicoties amatnieka rÄ«kam, tieÅ”i tā, kā to vēlētos 12 faktoru aplikācijas veidotāji.

Kā piemēru es parādÄ«Å”u, kā tiek izpildÄ«tas dažas komandas.
Mēs ieejam konteinerā.

 
docker-compose exec workspace bash
php artisan list

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

Tagad mēs varam izmantot jebkuru komandu. (lÅ«dzu, ņemiet vērā, ka mēs nekonfigurējām datu bāzi un keÅ”atmiņu, tāpēc puse komandu netiks izpildÄ«tas pareizi, jo tās ir paredzētas darbam ar keÅ”atmiņu un datu bāzi).

Lietojumprogrammu izstrāde un zili zaļā izvietoÅ”ana, pamatojoties uz divpadsmitfaktoru lietotņu metodoloÄ£iju ar piemēriem php un docker

11. Konfigurācijas un 12. gads. Veidojiet, atlaidiet, palaist

Es gribēju Å”o daļu veltÄ«t Blue-Green Deployment, taču tā izrādÄ«jās pārāk plaÅ”a Å”im rakstam. Par to es uzrakstÄ«Å”u atseviŔķu rakstu.

ÄŖsumā, koncepcijas pamatā ir tādas CI/CD sistēmas kā Jenkins Šø Gitlab CI. Abos gadÄ«jumos varat iestatÄ«t vides mainÄ«gos, kas saistÄ«ti ar noteiktu vidi. AttiecÄ«gi Å”ajā situācijā c) punkts tiks izpildÄ«ts Konfigurācijas.

Un punkts par Veidojiet, atlaidiet, palaist tiek atrisināts ar iebūvētām funkcijām ar nosaukumu Cauruļvads.

Cauruļvads ļauj sadalÄ«t izvietoÅ”anas procesu daudzos posmos, izceļot montāžas, izlaiÅ”anas un izpildes posmus. ArÄ« programmā Pipeline varat izveidot dublējumus un jebko. Å is ir rÄ«ks ar neierobežotu potenciālu.

Pieteikuma kods atrodas plkst GitHub.
Neaizmirstiet inicializēt apakÅ”moduli, klonējot Å”o repozitoriju.

P.S. Visas Ŕīs pieejas var izmantot ar jebkuru citu utilÄ«tu un programmÄ“Å”anas valodu. Galvenais, lai bÅ«tÄ«ba neatŔķiras.

Avots: www.habr.com

Pievieno komentāru