{"id":32526,"date":"2019-10-31T21:47:32","date_gmt":"2019-10-31T18:47:32","guid":{"rendered":"https:\/\/prohoster.info\/blog\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci\/"},"modified":"2019-10-31T21:47:32","modified_gmt":"2019-10-31T18:47:32","slug":"protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci","title":{"rendered":"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Javaslom, hogy ismerkedjen meg Alexander Sigachev, az Inventos &#171;A Docker + Gitlab CI-val v\u00e9gzett fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata&#187; c\u00edm\u0171 el\u0151ad\u00e1s\u00e1nak \u00e1ttekint\u00e9s\u00e9vel.<\/strong><\/p>\n<p><\/p>\n<p>Akik most kezdik bevezetni a Docker + Gitlab CI alap\u00fa fejleszt\u00e9si \u00e9s tesztel\u00e9si folyamatot, gyakran tesznek fel alapvet\u0151 k\u00e9rd\u00e9seket. Hol kezdjem? Hogyan szervezzem meg? Hogyan teszteljek?<\/p>\n<p><\/p>\n<p>Ez az el\u0151ad\u00e1s az\u00e9rt j\u00f3, mert struktur\u00e1ltan besz\u00e9l a Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val v\u00e9gzett fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamat\u00e1r\u00f3l. Az el\u0151ad\u00e1s 2017-b\u0151l sz\u00e1rmazik. \u00dagy gondolom, hogy ebb\u0151l az el\u0151ad\u00e1sb\u00f3l meg lehet szerezni az alapokat, a metodol\u00f3gi\u00e1t, az \u00f6tletet \u00e9s a tapasztalatokat. <\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"lJsqRwULRVA\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/lJsqRwULRVA\/hqdefault.jpg\" alt=\"Vide\u00f3 lej\u00e1tsz\u00e1sa\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Akiket \u00e9rdekel, azokat k\u00e9rem, hogy tartsanak velem. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<p>A nevem Alekszandr Szigacsov. Az Inventos c\u00e9gn\u00e9l dolgozom. Elmondom a Dockerral kapcsolatos tapasztalataimat \u00e9s arr\u00f3l, hogy hogyan kezdj\u00fck el fokozatosan bevezetni a projektekben.<\/p>\n<p><\/p>\n<p>Az el\u0151ad\u00e1s t\u00e9m\u00e1ja: A fejleszt\u00e9si folyamat Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/e30c4757e4bda1bcc3e20b16e8e2709e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez a m\u00e1sodik el\u0151ad\u00e1som a Docker t\u00e9m\u00e1j\u00e1ban. Az els\u0151 el\u0151ad\u00e1s idej\u00e9n a Docker-t csak a fejleszt\u0151k g\u00e9pein haszn\u00e1ltuk k\u00fcl\u00f6nb\u00f6z\u0151 fejleszt\u00e9si f\u00e1zisokban. K\u00f6r\u00fclbel\u00fcl 2-3 ember haszn\u00e1lta a Dockert. Fokozatosan tapasztalatot gy\u0171jt\u00f6tt\u00fcnk \u00e9s kicsit el\u0151r\u00e9bb jutottunk. Link az els\u0151 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/gled\/docker-development-70411088\">el\u0151ad\u00e1sunkra<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Mir\u0151l lesz sz\u00f3 ebben az el\u0151ad\u00e1sban? Megosztjuk a tapasztalatainkat arr\u00f3l, milyen neh\u00e9zs\u00e9geket tapasztaltunk, \u00e9s hogyan oldottuk meg a probl\u00e9m\u00e1kat. Nem minden esetben volt sz\u00e9p, de lehet\u0151v\u00e9 tette a tov\u00e1bbl\u00e9p\u00e9st.<\/p>\n<p><\/p>\n<p>A mott\u00f3nk: dockeriz\u00e1lj mindent, amihez csak hozz\u00e1f\u00e9r\u00fcnk.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/25ae4f97f1c502384abfe697bac502b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Milyen probl\u00e9m\u00e1kat oldunk meg?<\/p>\n<p><\/p>\n<p>Amikor a c\u00e9gn\u00e9l t\u00f6bb csapat van, a programoz\u00f3 megosztott er\u0151forr\u00e1s. Vannak f\u00e1zisok, amikor a programoz\u00f3t kiszak\u00edtj\u00e1k egy projektb\u0151l \u00e9s \u00e1tadj\u00e1k egy m\u00e1sik projekthez egy ideig.<\/p>\n<p><\/p>\n<p>Ahhoz, hogy a programoz\u00f3 gyorsan belem\u00e9lyedhessen, sz\u00fcks\u00e9ge van a projekt forr\u00e1sk\u00f3dj\u00e1nak let\u00f6lt\u00e9s\u00e9re \u00e9s annyira gyorsan el kell ind\u00edtania egy k\u00f6rnyezetet, amely lehet\u0151v\u00e9 teszi a feladatok megold\u00e1s\u00e1t.<\/p>\n<p><\/p>\n<p>\u00c1ltal\u00e1ban, ha null\u00e1r\u00f3l indulunk, a projektben kev\u00e9s dokument\u00e1ci\u00f3 \u00e1ll rendelkez\u00e9sre. Az inform\u00e1ci\u00f3, hogy hogyan kell be\u00e1ll\u00edtani, csak a r\u00e9gi munkat\u00e1rsak tud\u00e1s\u00e1hoz tartozik. A munkat\u00e1rsak \u00f6n\u00e1ll\u00f3an \u00e1ll\u00edtj\u00e1k be a munkak\u00f6rnyezet\u00fcket egy-k\u00e9t nap alatt. Ennek felgyors\u00edt\u00e1s\u00e1ra a Dockert alkalmaztuk.<\/p>\n<p><\/p>\n<p>A k\u00f6vetkez\u0151 ok a fejleszt\u00e9si be\u00e1ll\u00edt\u00e1sok szabv\u00e1nyos\u00edt\u00e1sa. Tapasztalataim szerint a fejleszt\u0151k mindig kezdem\u00e9nyeznek. Minden \u00f6t\u00f6dik esetben egy egyedi domain ker\u00fcl bevezet\u00e9sre, p\u00e9ld\u00e1ul vasya.dev. Mellette \u00fcl a szomsz\u00e9d Petya, akinek petya.dev a domainje. \u0150k egy weboldalt vagy a rendszer valamelyik komponens\u00e9t fejlesztik, ezt a domainnevet haszn\u00e1lva.<\/p>\n<p><\/p>\n<p>Amikor a rendszer n\u00f6vekszik, \u00e9s ezek a domainnevek elkezdenek beker\u00fclni a konfigur\u00e1ci\u00f3kba, akkor konfliktus l\u00e9p fel a fejleszt\u00e9si k\u00f6rnyezetek k\u00f6z\u00f6tt, \u00e9s a weboldal \u00fatvonala \u00e1t\u00edr\u00f3dik.<\/p>\n<p><\/p>\n<p>Ugyanez t\u00f6rt\u00e9nik az adatb\u00e1zis-be\u00e1ll\u00edt\u00e1sokkal is. Valaki nem t\u00f6r\u0151dik a biztons\u00e1ggal, \u00e9s \u00fcres root jelsz\u00f3val dolgozik. Van, akinek a MySQL telep\u00edt\u00e9sekor jelsz\u00f3t k\u00f6vetelt, \u00e9s a jelsz\u00f3 egy volt: 123. Gyakran el\u0151fordul, hogy az adatb\u00e1zis konfigur\u00e1ci\u00f3ja folyamatosan v\u00e1ltozott a fejleszt\u0151i commitok f\u00fcggv\u00e9ny\u00e9ben. Valaki jav\u00edtotta, valaki nem jav\u00edtotta a konfigur\u00e1ci\u00f3t. Volt, hogy kicsit elt\u00e1vol\u00edtottunk egy teszt konfigur\u00e1ci\u00f3t, <code>.gitignore<\/code> \u00e9s minden fejleszt\u0151nek telep\u00edtenie kellett az adatb\u00e1zist. Ez bonyol\u00edtotta a folyamat kezdet\u00e9t. Ezen k\u00edv\u00fcl eml\u00e9kezni kell az adatb\u00e1zisra is. Az adatb\u00e1zist inicializ\u00e1lni kell, jelsz\u00f3t kell megadni, felhaszn\u00e1l\u00f3t kell l\u00e9trehozni, t\u00e1bl\u00e1t kell l\u00e9trehozni \u00e9s \u00edgy tov\u00e1bb.<\/p>\n<p><\/p>\n<p>Egy m\u00e1sik probl\u00e9ma a k\u00fcl\u00f6nb\u00f6z\u0151 k\u00f6nyvt\u00e1rverzi\u00f3k. Gyakran el\u0151fordul, hogy a fejleszt\u0151 k\u00fcl\u00f6nb\u00f6z\u0151 projekteken dolgozik. Van egy Legacy projekt, amelyet \u00f6t \u00e9vvel ezel\u0151tt kezdt\u00fcnk (2017-t\u0151l \u2013 a szerk. megj.). Az indul\u00e1skor a MySQL 5.5-tel indultunk. Vannak modern projektek is, ahol m\u00e1r pr\u00f3b\u00e1lunk bevezetni modernebb MySQL verzi\u00f3kat, p\u00e9ld\u00e1ul 5.7 vagy \u00fajabbakat (2017-ben \u2013 a szerk. megj.).<\/p>\n<p><\/p>\n<p>Aki a MySQL-lal dolgozik, tudja, hogy ezek a k\u00f6nyvt\u00e1rak f\u00fcgg\u0151s\u00e9geket vonnak maguk ut\u00e1n. Meglehet\u0151sen probl\u00e9m\u00e1s egy\u00fctt futtatni 2 adatb\u00e1zist. Legal\u00e1bbis r\u00e9gi klienseket neh\u00e9zkes csatlakoztatni egy \u00faj adatb\u00e1zishoz. Ez viszont t\u00f6bb probl\u00e9m\u00e1t okoz.<\/p>\n<p><\/p>\n<p>A k\u00f6vetkez\u0151 probl\u00e9ma az, hogy amikor a fejleszt\u0151 a helyi g\u00e9p\u00e9n dolgozik, helyi er\u0151forr\u00e1sokat, helyi f\u00e1jlokat \u00e9s helyi RAM-ot haszn\u00e1l. Minden interakci\u00f3 a feladatok megold\u00e1sa sor\u00e1n azzal a felt\u00e9telez\u00e9ssel t\u00f6rt\u00e9nik, hogy ez egy g\u00e9pen m\u0171k\u00f6dik. P\u00e9ld\u00e1ul, ha a Production k\u00f6rnyezet\u00fcnkben 3 backend szerver\u00fcnk van, \u00e9s a fejleszt\u0151 a f\u00e1jlokat a gy\u00f6k\u00e9rk\u00f6nyvt\u00e1rba menti, ahonnan az nginx a f\u00e1jlokat v\u00e1laszokhoz veszi. Amikor az ilyen k\u00f3d beker\u00fcl a Productionba, kider\u00fcl, hogy a f\u00e1jl csak az egyik 3 szerveren tal\u00e1lhat\u00f3.<\/p>\n<p><\/p>\n<p>Jelenleg a mikroszolg\u00e1ltat\u00e1sok ir\u00e1nyzata fejl\u0151dik. Amikor a nagy alkalmaz\u00e1sainkat kisebb, egym\u00e1ssal k\u00f6lcs\u00f6nhat\u00e1sban \u00e1ll\u00f3 komponensekre bontjuk. Ez lehet\u0151v\u00e9 teszi, hogy a konkr\u00e9t feladathoz v\u00e1lasszunk technol\u00f3gi\u00e1kat. Ezzel lehet\u0151s\u00e9g ny\u00edlik a munka \u00e9s a felel\u0151ss\u00e9g megoszt\u00e1s\u00e1ra a fejleszt\u0151k k\u00f6z\u00f6tt.<\/p>\n<p><\/p>\n<p>A frontend fejleszt\u0151, aki JS-ben fejleszt, gyakorlatilag nem befoly\u00e1solja a backend-et. A backend fejleszt\u0151 ezzel szemben Ruby on Rails-t fejleszt, \u00e9s nem zavarja a frontend-et. Az interakci\u00f3 API-n kereszt\u00fcl t\u00f6rt\u00e9nik.<\/p>\n<p><\/p>\n<p>B\u00f3nusk\u00e9nt a Docker seg\u00edts\u00e9g\u00e9vel siker\u00fclt hasznos\u00edtani az er\u0151forr\u00e1sokat a Staging k\u00f6rnyezetben. Minden projekt a saj\u00e1t specifik\u00e1ci\u00f3ja miatt k\u00fcl\u00f6n be\u00e1ll\u00edt\u00e1sokat ig\u00e9nyelt. Fizikailag ki kellett k\u00fcl\u00f6n\u00edteni vagy ak\u00e1r egy virtu\u00e1lis szervert l\u00e9trehozni \u00e9s k\u00fcl\u00f6n be\u00e1ll\u00edtani, vagy megosztani egy v\u00e1ltoz\u00f3 k\u00f6rnyezetet, \u00edgy a projektek a k\u00f6nyvt\u00e1rak verzi\u00f3j\u00e1t\u00f3l f\u00fcgg\u0151en befoly\u00e1solhatt\u00e1k egym\u00e1st.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/fa5c99f90faef84a356d4791fd915830.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eszk\u00f6z\u00f6k. Mit haszn\u00e1lunk? <\/p>\n<p><\/p>\n<ul>\n<li>Mag\u00e1t a Dockert. A Dockerfile a megfelel\u0151 alkalmaz\u00e1s f\u00fcgg\u0151s\u00e9geit \u00edrja le. <\/li>\n<li>A Docker-compose egy \u00f6sszek\u00f6t\u0151, amely t\u00f6bb Docker alkalmaz\u00e1sunkat egyes\u00edti.<\/li>\n<li>A GitLab-ot a forr\u00e1sk\u00f3d t\u00e1rol\u00e1s\u00e1ra haszn\u00e1ljuk.<\/li>\n<li>A GitLab-CI-t a rendszerintegr\u00e1ci\u00f3ra haszn\u00e1ljuk.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/b6041827a6ba928e0d33add6b79c581c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A besz\u00e1mol\u00f3 k\u00e9t r\u00e9szb\u0151l \u00e1ll.<\/p>\n<p><\/p>\n<p>Az els\u0151 r\u00e9sz arr\u00f3l fog sz\u00f3lni, hogyan ind\u00edtottuk el a Dockert a fejleszt\u0151k g\u00e9pein.<\/p>\n<p><\/p>\n<p>A m\u00e1sodik r\u00e9sz arr\u00f3l fog sz\u00f3lni, hogyan l\u00e9p\u00fcnk kapcsolatba a GitLabbal, hogyan futtatjuk a teszteket \u00e9s hogyan telep\u00edtj\u00fck a Stagingre.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/45746d3323d35e0d18f066c8bfcb2214.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A Docker egy olyan technol\u00f3gia, amely lehet\u0151v\u00e9 teszi (declarat\u00edv megk\u00f6zel\u00edt\u00e9st haszn\u00e1lva) a sz\u00fcks\u00e9ges komponensek le\u00edr\u00e1s\u00e1t. Ez egy p\u00e9lda Dockerfile-ra. Itt bejelentj\u00fck, hogy az hivatalos Ruby:2.3.0 Docker k\u00e9p \u00f6r\u00f6kl\u0151d\u00e9se alatt \u00e1llunk. Ez tartalmazza a 2.3-as verzi\u00f3j\u00fa Ruby-t. Telep\u00edtj\u00fck a sz\u00fcks\u00e9ges build k\u00f6nyvt\u00e1rakat \u00e9s a NodeJS-t. Le\u00edrjuk, hogy l\u00e9trehozunk egy k\u00f6nyvt\u00e1rat. <code>\/app<\/code>. A munkak\u00f6nyvt\u00e1rnak az app k\u00f6nyvt\u00e1r\u00e1t jel\u00f6lj\u00fck ki. Ebbe a k\u00f6nyvt\u00e1rba helyezz\u00fck el a sz\u00fcks\u00e9ges minim\u00e1lis Gemfile-t \u00e9s Gemfile.lock-ot. Ezut\u00e1n v\u00e9grehajtjuk a projektek \u00f6ssze\u00e1ll\u00edt\u00e1s\u00e1t, amelyek telep\u00edtik ezt a f\u00fcgg\u0151s\u00e9gk\u00e9pz\u0151 k\u00e9pet. Megadjuk, hogy a kont\u00e9ner k\u00e9szen \u00e1ll a 3000-es k\u00fcls\u0151 porton val\u00f3 hallgat\u00e1sra. Az utols\u00f3 parancs az, amely k\u00f6zvetlen\u00fcl elind\u00edtja az alkalmaz\u00e1sunkat. Ha v\u00e9grehajtjuk a projekt ind\u00edt\u00e1si parancs\u00e1t, az alkalmaz\u00e1s megpr\u00f3b\u00e1l elindulni, \u00e9s v\u00e9grehajtja a megadott parancsot.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/ba503c305ae90f49b39f4ae2cbda1668.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez egy minim\u00e1lis p\u00e9lda a docker-compose f\u00e1jlra. Ebben az esetben bemutatjuk, hogy mi t\u00f6rt\u00e9nik k\u00e9t kont\u00e9ner k\u00f6z\u00f6tti kapcsolat sor\u00e1n. Ez k\u00f6zvetlen\u00fcl a datab\u00e1zis szolg\u00e1ltat\u00e1s \u00e9s a web szolg\u00e1ltat\u00e1s k\u00f6z\u00f6tt van. Webalkalmaz\u00e1saink t\u00f6bbs\u00e9g\u00e9ben sz\u00fcks\u00e9g van egy backend-re az adatok t\u00e1rol\u00e1s\u00e1hoz, p\u00e9ld\u00e1ul egy adatb\u00e1zisra. Mivel MySQL-t haszn\u00e1lunk, ez\u00e9rt a p\u00e9lda MySQL-ra vonatkozik \u2013 de semmi sem akad\u00e1lyozza meg, hogy m\u00e1s adatb\u00e1zist haszn\u00e1ljunk (PostgreSQL, Redis).<\/p>\n<p><\/p>\n<p>Az 5.7.14-es MySQL k\u00e9pet v\u00e1ltoztat\u00e1s n\u00e9lk\u00fcl vessz\u00fck az hivatalos forr\u00e1sb\u00f3l a Docker hub-on. A webalkalmaz\u00e1sunk\u00e9rt felel\u0151s k\u00e9pet a jelenlegi k\u00f6nyvt\u00e1rb\u00f3l \u00e1ll\u00edtjuk \u00f6ssze. Az els\u0151 ind\u00edt\u00e1s sor\u00e1n ez a k\u00e9p \u00f6ssze\u00e1ll\u00edtja sz\u00e1munkra a k\u00e9pet. Ezt k\u00f6vet\u0151en pedig futtatja a parancsot, amelyet itt hajtunk v\u00e9gre. Ha visszamegy\u00fcnk, l\u00e1thatjuk, hogy a Puma \u00e1ltal defini\u00e1lt ind\u00edt\u00f3 parancs volt. A Puma egy Ruby nyelven \u00edrt szolg\u00e1ltat\u00e1s. A m\u00e1sodik esetben fel\u00fcl\u00edrjuk. Ez a parancs tetsz\u0151leges lehet a sz\u00fcks\u00e9gleteink vagy feladataink f\u00fcggv\u00e9ny\u00e9ben.<\/p>\n<p><\/p>\n<p>Ezen k\u00edv\u00fcl le\u00edrjuk, hogy \u00e1t kell ir\u00e1ny\u00edtani a portot a fejleszt\u0151i g\u00e9p\u00fcnk\u00f6n 3000-r\u0151l a kont\u00e9ner 3000-es portj\u00e1ra. Ezt automatikusan v\u00e9gzi az iptables \u00e9s a Docker \u00e1ltal be\u00e9p\u00edtett mechanizmus. <\/p>\n<p><\/p>\n<p>A fejleszt\u0151 ugyan\u00fagy, mint kor\u00e1bban, b\u00e1rmely el\u00e9rhet\u0151 IP-c\u00edmre hivatkozhat, p\u00e9ld\u00e1ul a 127.0.0.1 helyi c\u00edm\u00e9re vagy a g\u00e9p k\u00fcls\u0151 IP-c\u00edm\u00e9re.<\/p>\n<p><\/p>\n<p>Az utols\u00f3 sor azt jelzi, hogy a web kont\u00e9ner f\u00fcgg a db kont\u00e9nert\u0151l. Amikor elind\u00edtjuk a web kont\u00e9nert, a docker-compose el\u0151sz\u00f6r elind\u00edtja az adatb\u00e1zist. Az adatb\u00e1zis ind\u00edt\u00e1sa ut\u00e1n (val\u00f3j\u00e1ban \u2013 a kont\u00e9ner ind\u00edt\u00e1sa ut\u00e1n! Az adatb\u00e1zissal val\u00f3 k\u00e9szenl\u00e9tet ez nem garant\u00e1lja) fogja elind\u00edtani az alkalmaz\u00e1sunkat, a backend\u00fcnket.<\/p>\n<p><\/p>\n<p>Ez lehet\u0151v\u00e9 teszi a hib\u00e1k elker\u00fcl\u00e9s\u00e9t, amikor az adatb\u00e1zis nincs elind\u00edtva, \u00e9s er\u0151forr\u00e1sokat takar\u00edt meg, amikor le\u00e1ll\u00edtjuk az adatb\u00e1zis kont\u00e9nert, ezzel felszabad\u00edtva az er\u0151forr\u00e1sokat m\u00e1s projektek sz\u00e1m\u00e1ra. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/4acbcf5de89b98db055e8abc419202de.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Milyen el\u0151ny\u00f6kkel j\u00e1r a Dockeriz\u00e1lt adatb\u00e1zisok haszn\u00e1lata a projektben? Minden fejleszt\u0151n\u00e9l r\u00f6gz\u00edtj\u00fck a MySQL verzi\u00f3t. Ez seg\u00edt elker\u00fclni bizonyos hib\u00e1kat, amelyek felmer\u00fclhetnek, ha elt\u00e9rnek a verzi\u00f3k, amikor a szintaxis, konfigur\u00e1ci\u00f3 vagy alap\u00e9rtelmezett be\u00e1ll\u00edt\u00e1sok megv\u00e1ltoznak. \u00cdgy k\u00f6z\u00f6s hostname-t, login-t \u00e9s jelsz\u00f3t tudunk megadni az adatb\u00e1zis sz\u00e1m\u00e1ra. Elt\u00e1volodunk a kor\u00e1bbi config f\u00e1jlok kaboszt\u00e1r\u00f3l \u00e9s n\u00e9v\u00fctk\u00f6z\u00e9seir\u0151l. <\/p>\n<p><\/p>\n<p>Lehet\u0151s\u00e9g\u00fcnk van egy optimaliz\u00e1lt konfigur\u00e1ci\u00f3t haszn\u00e1lni a fejleszt\u0151i k\u00f6rnyezethez, amely elt\u00e9r az alap\u00e9rtelmezett\u0151l. A MySQL alap\u00e9rtelmez\u00e9s szerint gyenge g\u00e9pekre van optimaliz\u00e1lva, \u00edgy a teljes\u00edtm\u00e9nye dobozb\u00f3l kiemelve nagyon alacsony.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/417d77a06b18e2df9b71440c0f2a1653.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A Docker lehet\u0151v\u00e9 teszi a sz\u00fcks\u00e9ges verzi\u00f3j\u00fa Python, Ruby, NodeJS \u00e9s PHP \u00e9rtelmez\u0151k haszn\u00e1lat\u00e1t. Megszabadulunk a verzi\u00f3kezel\u0151k haszn\u00e1lat\u00e1nak sz\u00fcks\u00e9gess\u00e9g\u00e9t\u0151l. Kor\u00e1bban RPM csomagot haszn\u00e1ltunk Ruby eset\u00e9ben, amely lehet\u0151v\u00e9 tette a verzi\u00f3k projekt szerinti v\u00e1ltoztat\u00e1s\u00e1t. Emellett a Docker kont\u00e9ner seg\u00edt a k\u00f3d z\u00f6kken\u0151mentes migr\u00e1l\u00e1s\u00e1ban \u00e9s verzi\u00f3z\u00e1s\u00e1ban egy\u00fctt a f\u00fcgg\u0151s\u00e9gekkel. Nincs probl\u00e9m\u00e1nk a verzi\u00f3k \u00e9s az \u00e9rtelmez\u0151 meg\u00e9rt\u00e9s\u00e9vel sem. A verzi\u00f3 friss\u00edt\u00e9s\u00e9hez le kell \u00e1ll\u00edtani a r\u00e9gi kont\u00e9nert \u00e9s \u00faj kont\u00e9nert kell fel\u00e1ll\u00edtani. Ha valami rosszul s\u00fcl el, vissza tudjuk \u00e1ll\u00edtani a r\u00e9gi kont\u00e9nert.<\/p>\n<p><\/p>\n<p>A kont\u00e9nerek a k\u00e9p l\u00e9trehoz\u00e1sa ut\u00e1n a fejleszt\u0151i \u00e9s a produkci\u00f3s k\u00f6rnyezetben is megegyeznek. Ez k\u00fcl\u00f6n\u00f6sen fontos a nagy telep\u00edt\u00e9sek eset\u00e9n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/185a1bfe257f7e3e0eecdc6e0e0d330f.jpg\" style=\"display:block;margin: 0 auto;\" \/> A frontendhez JavaScriptet \u00e9s NodeJS-t haszn\u00e1lunk.<\/p>\n<p><\/p>\n<p>Jelenleg az utols\u00f3 projekt\u00fcnk ReacJS-en alapul. A fejleszt\u0151 minden kont\u00e9nert elind\u00edtott \u00e9s hot-reload haszn\u00e1lat\u00e1val dolgozott.<\/p>\n<p><\/p>\n<p>Ezut\u00e1n elindul a JavaScript \u00f6sszeszerel\u00e9s\u00e9nek feladata, \u00e9s az elk\u00e9sz\u00fclt statikus k\u00f3d nginx-en kereszt\u00fcl ker\u00fcl \u00e1tadva, \u00edgy sp\u00f3rolunk az er\u0151forr\u00e1sokkal.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/4c2e28319d56d7fc81845b4133a1bfe6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Itt bemutattam leg\u00fajabb projekt\u00fcnk v\u00e1zlat\u00e1t.<\/p>\n<p><\/p>\n<p>Milyen feladatokat oldottunk meg? Sz\u00fcks\u00e9g\u00fcnk volt egy rendszer ki\u00e9p\u00edt\u00e9s\u00e9re, amely mobil eszk\u00f6z\u00f6kkel kommunik\u00e1l. Ezek az eszk\u00f6z\u00f6k adatokat kapnak. Az egyik lehet\u0151s\u00e9g \u00e9rtes\u00edt\u00e9sek k\u00fcld\u00e9se ezekre az eszk\u00f6z\u00f6kre. <\/p>\n<p><\/p>\n<p>Mit tett\u00fcnk ez\u00e9rt?<\/p>\n<p><\/p>\n<p>Az alkalmaz\u00e1st a k\u00f6vetkez\u0151 komponensekre osztottuk: adminisztr\u00e1tori r\u00e9sz JavaScript-en, backend, amely Ruby on Rails-en kereszt\u00fcl REST interf\u00e9szen m\u0171k\u00f6dik. A backend kommunik\u00e1l az adatb\u00e1zissal. Az eredm\u00e9ny, amelyet gener\u00e1lunk, visszaker\u00fcl az \u00fcgyf\u00e9lhez. Az admin fel\u00fclet a backend-del \u00e9s az adatb\u00e1zissal REST interf\u00e9szen kereszt\u00fcl kommunik\u00e1l.<\/p>\n<p><\/p>\n<p>Emellett sz\u00fcks\u00e9g\u00fcnk volt Push \u00e9rtes\u00edt\u00e9sek k\u00fcld\u00e9s\u00e9re is. Kor\u00e1bban egy projekt\u00fcnk volt, amelyben megval\u00f3s\u00edtottuk a mechanizmust, amely felel\u0151s az \u00e9rtes\u00edt\u00e9sek k\u00e9zbes\u00edt\u00e9s\u00e9\u00e9rt mobilplatformokra. <\/p>\n<p><\/p>\n<p>Kifejlesztett\u00fcnk egy s\u00e9m\u00e1t: a b\u00f6ng\u00e9sz\u0151 oper\u00e1tora interakci\u00f3ba l\u00e9p az admin fel\u00fclettel, az admin fel\u00fclet pedig kommunik\u00e1l a h\u00e1tt\u00e9rszolg\u00e1ltat\u00e1ssal, amely feladatk\u00e9nt kapja, hogy Push \u00e9rtes\u00edt\u00e9seket kell k\u00fcldenie.<\/p>\n<p><\/p>\n<p>A Push \u00e9rtes\u00edt\u00e9sek egy m\u00e1sik komponenssel l\u00e9pnek interakci\u00f3ba, amely NodeJS alap\u00fa.<\/p>\n<p><\/p>\n<p>Sorok \u00e9p\u00fclnek fel, majd ez k\u00f6veti a saj\u00e1t mechanizmus\u00e1n az \u00e9rtes\u00edt\u00e9sek k\u00fcld\u00e9s\u00e9t.<\/p>\n<p><\/p>\n<p>Itt k\u00e9t adatb\u00e1zis van \u00e1br\u00e1zolva. Jelenleg a Docker seg\u00edts\u00e9g\u00e9vel k\u00e9t f\u00fcggetlen adatb\u00e1zist haszn\u00e1lunk, amelyek nincsenek \u00f6sszekapcsolva. Annyiban, hogy k\u00f6z\u00f6s virtu\u00e1lis h\u00e1l\u00f3zattal rendelkeznek, m\u00edg a fizikai adatok a fejleszt\u0151 g\u00e9p\u00e9nek k\u00fcl\u00f6nb\u00f6z\u0151 k\u00f6nyvt\u00e1raiban tal\u00e1lhat\u00f3k.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/dfde59db7e6886d2d851dcf884049318.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ugyanez, de sz\u00e1mokban. Itt fontos a k\u00f3d \u00fajrahaszn\u00e1lata.<\/p>\n<p><\/p>\n<p>Ha kor\u00e1bban a k\u00f3d \u00fajrahaszn\u00e1lat\u00e1r\u00f3l besz\u00e9lt\u00fcnk k\u00f6nyvt\u00e1rakk\u00e9nt, akkor ebben a p\u00e9ld\u00e1ban a Push \u00e9rtes\u00edt\u00e9sek\u00e9rt felel\u0151s szolg\u00e1ltat\u00e1sunk teljes szerverk\u00e9nt \u00fajrahaszn\u00e1lhat\u00f3. API-t biztos\u00edt. Ezzel m\u00e1r a mi \u00faj fejleszt\u00e9s\u00fcnk l\u00e9p interakci\u00f3ba.<\/p>\n<p><\/p>\n<p>Akkoriban a NodeJS 4-es verzi\u00f3j\u00e1t haszn\u00e1ltuk. Jelenleg (2017-ben \u2014 szerk. megj.) az \u00faj fejleszt\u00e9sekben a NodeJS 7-es verzi\u00f3j\u00e1t alkalmazzuk. Nincs probl\u00e9ma a leg\u00fajabb komponensekben \u00faj k\u00f6nyvt\u00e1rverzi\u00f3k haszn\u00e1lat\u00e1val. <\/p>\n<p><\/p>\n<p>Sz\u00fcks\u00e9g eset\u00e9n elv\u00e9gezhet\u0151 a refaktor\u00e1l\u00e1s, \u00e9s a Push \u00e9rtes\u00edt\u00e9sek szolg\u00e1ltat\u00e1s\u00e1nak NodeJS verzi\u00f3ja friss\u00edthet\u0151. <\/p>\n<p><\/p>\n<p>Ha meg tudjuk \u0151rizni az API kompatibilit\u00e1s\u00e1t, akkor azt m\u00e1s projektekn\u00e9l, amelyeket kor\u00e1bban haszn\u00e1ltunk, helyettes\u00edthetn\u00e9nk.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/5c58c65be078a5a1b9fc17ee2e7b4ad4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mi sz\u00fcks\u00e9ges a Docker hozz\u00e1ad\u00e1s\u00e1hoz? Hozz\u00e1adunk egy Dockerfile-t a rep\u00f3nkhoz, amely le\u00edrja a sz\u00fcks\u00e9ges f\u00fcgg\u0151s\u00e9geket. Ebben a p\u00e9ld\u00e1ban a komponenseket logika alapj\u00e1n bontottuk le. Ez egy minim\u00e1lis csomag a backend fejleszt\u0151knek.<\/p>\n<p><\/p>\n<p>\u00daj projekt ind\u00edt\u00e1sakor Dockerfile-t k\u00e9sz\u00edt\u00fcnk, amelyben le\u00edrjuk a sz\u00fcks\u00e9ges \u00f6kosziszt\u00e9m\u00e1t (Python, Ruby, NodeJS). A docker-compose-ban le\u00edrjuk a sz\u00fcks\u00e9ges f\u00fcgg\u0151s\u00e9get \u2014 az adatb\u00e1zist. Megadjuk, hogy egy ilyen-olyan verzi\u00f3j\u00fa adatb\u00e1zisra van sz\u00fcks\u00e9g, az adatok ott meg ott t\u00e1rolva.<\/p>\n<p><\/p>\n<p>Statikus tartalom szolg\u00e1ltat\u00e1s\u00e1hoz k\u00fcl\u00f6n harmadik kont\u00e9nert haszn\u00e1lunk nginx-sel. Lehet\u0151s\u00e9g van k\u00e9pek felt\u00f6lt\u00e9s\u00e9re. A backend a k\u00e9peket egy el\u0151re elk\u00e9sz\u00edtett k\u00f6tetbe helyezi, ami szint\u00e9n csatlakoztatva van az nginx kont\u00e9nerhez, amely a statikus tartalmat szolg\u00e1ltatja.<\/p>\n<p><\/p>\n<p>A nginx \u00e9s mysql konfigur\u00e1ci\u00f3k t\u00e1rol\u00e1s\u00e1hoz l\u00e9trehoztunk egy Docker mapp\u00e1t, ahol a sz\u00fcks\u00e9ges konfigur\u00e1ci\u00f3kat t\u00e1roljuk. Amikor a fejleszt\u0151 git clone parancsot futtat a t\u00e1rol\u00f3b\u00f3l, egy m\u00e1r k\u00e9szen \u00e1ll\u00f3 projektet kap a helyi fejleszt\u00e9shez. \u00cdgy nem mer\u00fcl fel k\u00e9rd\u00e9s, hogy melyik portot vagy milyen be\u00e1ll\u00edt\u00e1sokat kell alkalmazni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/e7a6b308a75cacf8ce60687a9e6081dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ezut\u00e1n van n\u00e9h\u00e1ny \u00f6sszetev\u0151nk: admin, inform-API, push-\u00e9rtes\u00edt\u00e9sek.<\/p>\n<p><\/p>\n<p>Ahhoz, hogy mindezt elind\u00edtsuk, l\u00e9trehoztunk egy m\u00e1sik t\u00e1rol\u00f3t, amelyet dockerized-app-nak nevezt\u00fcnk el. Jelenleg t\u00f6bb t\u00e1rol\u00f3t haszn\u00e1lunk minden egyes \u00f6sszetev\u0151 sz\u00e1m\u00e1ra. Ezek logikailag elt\u00e9rnek \u2014 a GitLab-ban mappak\u00e9nt jelennek meg, m\u00edg a fejleszt\u0151 g\u00e9p\u00e9n a konkr\u00e9t projekthez tartoz\u00f3 mappa. Egy szinttel lejjebb tal\u00e1lhat\u00f3ak azok az \u00f6sszetev\u0151k, amelyek \u00f6ssze fognak kapcsol\u00f3dni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/f4e2c45c8ec20fca0bac74b3a3892543.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez a dockerized-app tartalm\u00e1nak p\u00e9ld\u00e1ja. Ide is kivett\u00fck a Docker mapp\u00e1t, amely tartalmazza a konfigur\u00e1ci\u00f3kat, amelyek sz\u00fcks\u00e9gesek az \u00f6sszes komponens k\u00f6z\u00f6tti interakci\u00f3hoz. Van egy README.md f\u00e1jl is, amely r\u00f6viden le\u00edrja, hogyan lehet elind\u00edtani a projektet.<\/p>\n<p><\/p>\n<p>Itt k\u00e9t docker-compose f\u00e1jlt alkalmaztunk. Ezt az\u00e9rt tett\u00fck, hogy lehet\u0151s\u00e9g\u00fcnk legyen l\u00e9pcs\u0151zetesen ind\u00edtani. Amikor a fejleszt\u0151 a maggal dolgozik, nincs sz\u00fcks\u00e9ge push-\u00e9rtes\u00edt\u00e9sekre, ez\u00e9rt egyszer\u0171en csak a docker-compose f\u00e1jlt ind\u00edtja el, ezzel er\u0151forr\u00e1st sp\u00f3rolva.<\/p>\n<p><\/p>\n<p>Ha sz\u00fcks\u00e9g van push-\u00e9rtes\u00edt\u00e9sek integr\u00e1ci\u00f3j\u00e1ra, akkor elindul a docker-compose.yaml \u00e9s a docker-compose-push.yaml.<\/p>\n<p><\/p>\n<p>Mivel a docker-compose.yaml \u00e9s a docker-compose-push.yaml mapp\u00e1ban helyezkedik el, \u00edgy automatikusan l\u00e9trej\u00f6n egy egys\u00e9ges virtu\u00e1lis h\u00e1l\u00f3zat.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/535019c82c72c1602176fbaf4aa5640f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Az \u00f6sszetev\u0151k le\u00edr\u00e1sa. Ez egy kiterjedtebb f\u00e1jl, amely az \u00f6sszetev\u0151k \u00f6ssze\u00e1ll\u00edt\u00e1s\u00e1\u00e9rt felel\u0151s. Mi a figyelemre m\u00e9lt\u00f3 itt? Bevezetj\u00fck a terhel\u00e9seloszt\u00f3 komponenst.<\/p>\n<p><\/p>\n<p>Ez egy k\u00e9sz Docker-k\u00e9p, amely tartalmazza az nginx-t \u00e9s azt az alkalmaz\u00e1st, amely a Docker socketen hallgat. Dinamikusan, a kont\u00e9nerek be- \u00e9s kikapcsol\u00e1s\u00e1val regener\u00e1lja az nginx konfigur\u00e1ci\u00f3t. Az \u00f6sszetev\u0151kkel val\u00f3 kommunik\u00e1ci\u00f3t harmadik szint\u0171 domainnevek alapj\u00e1n val\u00f3s\u00edtjuk meg.<\/p>\n<p><\/p>\n<p>Fejleszt\u00e9si k\u00f6rnyezetben a .dev domaineket haszn\u00e1ljuk \u2014 api.informer.dev. A .dev domain alatti alkalmaz\u00e1sok el\u00e9rhet\u0151k a fejleszt\u0151 helyi g\u00e9p\u00e9n.<\/p>\n<p><\/p>\n<p>Ezut\u00e1n \u00e1tadjuk a konfigur\u00e1ci\u00f3kat minden projekthez, \u00e9s az \u00f6sszes projekt egyszerre ker\u00fcl ind\u00edt\u00e1sra.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/bc1e11e6f1fd1c837d2c8087d04145c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ha grafikus \u00e1br\u00e1zol\u00e1sban gondolkodunk, az \u00fcgyf\u00e9l a b\u00f6ng\u00e9sz\u0151nk vagy valamilyen eszk\u00f6z, amivel a balancer fel\u00e9 ir\u00e1ny\u00edtjuk a k\u00e9r\u00e9seinket.<\/p>\n<p><\/p>\n<p>A balancer a domain n\u00e9v alapj\u00e1n hat\u00e1rozza meg, melyik kont\u00e9nerhez kell fordulni.<\/p>\n<p><\/p>\n<p>Ez lehet az nginx, amely a JS admin fel\u00fcletet adja. Ez lehet az nginx, amely az API-t adja, vagy ak\u00e1r statikus f\u00e1jlokat, amelyeket az nginx k\u00e9pform\u00e1tumban ad \u00e1t.<\/p>\n<p><\/p>\n<p>A diagramon l\u00e1that\u00f3, hogy a kont\u00e9nerek egy virtu\u00e1lis h\u00e1l\u00f3zatba vannak \u00f6sszekapcsolva, \u00e9s egy proxy m\u00f6g\u00f6tt rejt\u0151znek.<\/p>\n<p><\/p>\n<p>A fejleszt\u0151i g\u00e9pen k\u00f6zvetlen\u00fcl el\u00e9rhetj\u00fck a kont\u00e9nert az IP c\u00edm ismeret\u00e9ben, de ezt alapvet\u0151en nem alkalmazzuk. K\u00f6zvetlen kapcsolat sz\u00fcks\u00e9gess\u00e9ge gyakorlatilag nem mer\u00fcl fel.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/2908c31fd9d3c79f6189bdbeeb6d028f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Milyen p\u00e9ld\u00e1t n\u00e9zzek meg, hogy dockeriz\u00e1lhassam az alkalmaz\u00e1somat? V\u00e9lem\u00e9nyem szerint egy j\u00f3 p\u00e9lda a MySQL hivatalos docker k\u00e9pe.<\/p>\n<p><\/p>\n<p>Ez el\u00e9gg\u00e9 bonyolult. Sok verzi\u00f3ja van. De a funkcionalit\u00e1sa lehet\u0151v\u00e9 teszi sok ig\u00e9ny kiel\u00e9g\u00edt\u00e9s\u00e9t, amely felmer\u00fclhet a tov\u00e1bbi fejleszt\u00e9s sor\u00e1n. Ha id\u0151t sz\u00e1nsz arra, hogy meg\u00e9rtsd, hogyan m\u0171k\u00f6dik minden, akkor szerintem a saj\u00e1t bevezet\u00e9sben nem lesznek probl\u00e9m\u00e1id.<\/p>\n<p><\/p>\n<p>A hub.docker.com oldalon \u00e1ltal\u00e1ban tal\u00e1lhat\u00f3k linkek a github.com-ra, ahol a nyers adatokat tal\u00e1lod, amelyekb\u0151l saj\u00e1t magad gy\u0171jtheted \u00f6ssze a k\u00e9pet.<\/p>\n<p><\/p>\n<p>A tov\u00e1bbiakban ebben a t\u00e1rol\u00f3ban tal\u00e1lhat\u00f3 a docker-endpoint.sh szkript, amely a kezdeti inicializ\u00e1ci\u00f3\u00e9rt \u00e9s az alkalmaz\u00e1s elind\u00edt\u00e1s\u00e1nak tov\u00e1bbi feldolgoz\u00e1s\u00e1\u00e9rt felel\u0151s.<\/p>\n<p><\/p>\n<p>Ebben a p\u00e9ld\u00e1ban a k\u00f6rnyezeti v\u00e1ltoz\u00f3k seg\u00edts\u00e9g\u00e9vel t\u00f6rt\u00e9n\u0151 konfigur\u00e1l\u00e1s lehet\u0151s\u00e9ge is megtal\u00e1lhat\u00f3. Az egyedi kont\u00e9ner ind\u00edt\u00e1sakor vagy a docker-compose seg\u00edts\u00e9g\u00e9vel meghat\u00e1rozhatjuk, hogy \u00fcres jelsz\u00f3t akarunk be\u00e1ll\u00edtani a dockerhez a root felhaszn\u00e1l\u00f3n\u00e1l a MySQL-n\u00e1l, vagy b\u00e1rmilyen m\u00e1sik jelsz\u00f3t, amit szeretn\u00e9nk.<\/p>\n<p><\/p>\n<p>Van lehet\u0151s\u00e9g v\u00e9letlenszer\u0171 jelsz\u00f3 l\u00e9trehoz\u00e1s\u00e1ra. Megmondjuk, hogy felhaszn\u00e1l\u00f3ra van sz\u00fcks\u00e9g, sz\u00fcks\u00e9ges be\u00e1ll\u00edtani a felhaszn\u00e1l\u00f3 jelszav\u00e1t, \u00e9s sz\u00fcks\u00e9ges adatb\u00e1zist l\u00e9trehozni.<\/p>\n<p><\/p>\n<p>A projektjeinkben kiss\u00e9 egys\u00e9ges\u00edtett\u00fck a Dockerfile-t, amely az inicializ\u00e1l\u00e1s\u00e9rt felel\u0151s. Itt a saj\u00e1t ig\u00e9nyeinkhez igaz\u00edtottuk, hogy egyszer\u0171en a felhaszn\u00e1l\u00f3i jogok kiterjeszt\u00e9s\u00e9t v\u00e9gezz\u00fck el, amit az alkalmaz\u00e1s haszn\u00e1l. Ez lehet\u0151v\u00e9 tette, hogy egyszer\u0171en hozzunk l\u00e9tre adatb\u00e1zist az alkalmaz\u00e1s konzolj\u00e1b\u00f3l. A Ruby alkalmaz\u00e1sokban van parancs az adatb\u00e1zisok l\u00e9trehoz\u00e1s\u00e1ra, m\u00f3dos\u00edt\u00e1s\u00e1ra \u00e9s t\u00f6rl\u00e9s\u00e9re.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/4a9b56e21819d28dd39753134d23fee4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez a p\u00e9lda arra, hogyan n\u00e9z ki egy konkr\u00e9t verzi\u00f3 MySQL a github.com-on. A Dockerfile megnyithat\u00f3, \u00e9s megn\u00e9zhet\u0151, hogyan t\u00f6rt\u00e9nik a telep\u00edt\u00e9s.<\/p>\n<p><\/p>\n<p>A docker-endpoint.sh script is responsible for the entry point. Some preparatory actions are required during the initial setup, and all these actions are precisely included in the initialization script.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/4153fa46526f3d802931dd1db48b08cd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Let's move on to the second part.<\/p>\n<p><\/p>\n<p>For storing the source codes, we have transitioned to gitlab. It's a powerful system that has a visual interface.<\/p>\n<p><\/p>\n<p>One of the components of Gitlab is Gitlab CI. It allows you to describe the sequence of commands that will be used to organize the code delivery system or run automated tests.<\/p>\n<p><\/p>\n<p>Report on Gitlab CI 2 <noindex><a rel=\"nofollow\" href=\"https:\/\/goo.gl\/uohKjI\">https:\/\/goo.gl\/uohKjI<\/a><\/noindex> \u2014 a report from the Ruby Russia club \u2014 it's quite detailed and may interest you.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/5d26d20500f34eeb9768e6c3d91bbefa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Now we will look at what is required to activate Gitlab CI. To launch Gitlab CI, we simply need to place a .gitlab-ci.yml file in the root of the project.<\/p>\n<p><\/p>\n<p>Here we describe what we want to execute in a sequence of states, such as tests and deployment.<\/p>\n<p><\/p>\n<p>We run scripts that directly call the docker-compose build of our application. This is an example of the backend.<\/p>\n<p><\/p>\n<p>Next, we indicate that it's necessary to run the migrations to change the database and execute the tests.<\/p>\n<p><\/p>\n<p>If the scripts execute correctly and do not return an error code, then the system moves on to the second stage of deployment.<\/p>\n<p><\/p>\n<p>The deployment stage is currently implemented for staging. We haven't organized a zero-downtime restart.<\/p>\n<p><\/p>\n<p>We forcibly shut down all containers and then bring all containers back up, rebuilt from the first stage during testing.<\/p>\n<p><\/p>\n<p>We run the migrations for the current variable environment that were written by the developers.<\/p>\n<p><\/p>\n<p>There is a note that this should only be applied to the master branch.<\/p>\n<p><\/p>\n<p>Changes in other branches do not execute.<\/p>\n<p><\/p>\n<p>There is an opportunity to organize rollouts by branches.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/8a5b880bd9a0d4bab0b276568e2ba413.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To organize this further, we need to install Gitlab Runner.<\/p>\n<p><\/p>\n<p>This utility is written in Golang. It is a single file as commonly practiced in the Golang world, requiring no dependencies.<\/p>\n<p><\/p>\n<p>When starting, we register the Gitlab Runner.<\/p>\n<p><\/p>\n<p>We obtain a key in the Gitlab web interface.<\/p>\n<p><\/p>\n<p>Then we call the initialization command in the command line.<\/p>\n<p><\/p>\n<p>We configure the Gitlab Runner in dialog mode (Shell, Docker, VirtualBox, SSH).<\/p>\n<p><\/p>\n<p>The code on Gitlab Runner will execute on each commit depending on the setup of .gitlab-ci.yml.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/37c8ac7499f0cfba2eb07a84083e44e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hogyan n\u00e9z ki a Gitlab webes fel\u00fclet\u00e9n. Miut\u00e1n csatlakoztattuk a Gitlab CI-t, megjelenik egy jelz\u0151, amely megmutatja, hogy a jelenlegi \u00e1llapotban hol tart a build.<\/p>\n<p><\/p>\n<p>Azt l\u00e1tjuk, hogy 4 perce t\u00f6rt\u00e9nt egy commit, amely \u00e1tesett minden teszten, \u00e9s nem okozott probl\u00e9m\u00e1t.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/33ac79c45f0651a5f8bde75092c4ac44.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>R\u00e9szletesebben megn\u00e9zhetj\u00fck a build \u00e1llapotokat. Itt l\u00e1tjuk, hogy m\u00e1r k\u00e9t \u00e1llapot l\u00e9pett \u00e9letbe. A tesztel\u00e9si \u00e1llapot \u00e9s a staging k\u00f6rnyezetbe val\u00f3 deploy \u00e1llapot.<\/p>\n<p><\/p>\n<p>Ha r\u00e1kattintunk egy konkr\u00e9t buildre, ott l\u00e1tni fogjuk a parancsok konzol kimenet\u00e9t, amelyek a .gitlab-ci.yml szerint futottak.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/d26dd28708c7fc8a409af4be4d48f502.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cdgy n\u00e9z ki a term\u00e9k\u00fcnk t\u00f6rt\u00e9nete. L\u00e1tjuk, hogy voltak sikeres pr\u00f3b\u00e1lkoz\u00e1sok. Amikor a tesztek nem siker\u00fclnek, a k\u00f6vetkez\u0151 l\u00e9p\u00e9sre nem l\u00e9p tov\u00e1bb, \u00e9s a k\u00f3d a staging-en nem friss\u00fcl.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/ee7bd81dc283c7af0c194779d4230780.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Milyen feladatokat oldottunk meg a staging k\u00f6rnyezetben, amikor bevezett\u00fck a dockert? A rendszer\u00fcnk komponensekb\u0151l \u00e1ll, \u00e9s sz\u00fcks\u00e9g\u00fcnk volt arra, hogy csak azokat a komponenseket ind\u00edtsuk \u00fajra, amelyeket friss\u00edtettek a rep\u00f3ban, nem pedig az eg\u00e9sz rendszert.<\/p>\n<p><\/p>\n<p>Ehhez sz\u00e9t kellett v\u00e1logatnunk mindent k\u00fcl\u00f6n mapp\u00e1kba.<\/p>\n<p><\/p>\n<p>Miut\u00e1n ezt megcsin\u00e1ltuk, probl\u00e9m\u00e1t okozott, hogy a Docker-compose minden mapp\u00e1hoz saj\u00e1t h\u00e1l\u00f3zati teret hoz l\u00e9tre, \u00edgy nem l\u00e1tj\u00e1k a szomsz\u00e9dos komponenseket.<\/p>\n<p><\/p>\n<p>Ennek megker\u00fcl\u00e9s\u00e9re manu\u00e1lisan l\u00e9trehoztunk egy h\u00e1l\u00f3zatot a Dockerben. A Docker-compose-ban be\u00edrtuk, hogy ehhez a projekthez ezt a h\u00e1l\u00f3zatot haszn\u00e1lja.<\/p>\n<p><\/p>\n<p>\u00cdgy minden komponens, amely ezzel a h\u00e1l\u00f3zattal indul, l\u00e1tja a rendszer m\u00e1s r\u00e9szein tal\u00e1lhat\u00f3 komponenseket.<\/p>\n<p><\/p>\n<p>A k\u00f6vetkez\u0151 probl\u00e9ma a staging t\u00f6bb projektre val\u00f3 feloszt\u00e1sa.<\/p>\n<p><\/p>\n<p>Mivel ez j\u00f3l n\u00e9z ki \u00e9s maxim\u00e1lisan k\u00f6zel \u00e1ll a production-h\u00f6z, c\u00e9lszer\u0171 a 80-as vagy 443-as portot haszn\u00e1lni, amelyet a WEB-en vil\u00e1gszerte haszn\u00e1lnak.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/f863cf1833271bf132455a70ad7d2706.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hogyan oldottuk meg ezt? Egy Gitlab Runner-t rendelt\u00fcnk a nagyobb projektekhez.<\/p>\n<p><\/p>\n<p>A Gitlab lehet\u0151v\u00e9 teszi, hogy t\u00f6bb elosztott Gitlab Runner-t ind\u00edtsunk, amelyek egyszer\u0171en felv\u00e1ltva, kaotikus sorrendben veszik fel a feladatokat \u00e9s futtatj\u00e1k \u0151ket.<\/p>\n<p><\/p>\n<p>Hogy elker\u00fclj\u00fck a k\u00e1oszt, korl\u00e1toztuk a projektjeink csoportj\u00e1t egy Gitlab Runner-re, amely a mi mennyis\u00e9g\u00fcnkkel gond n\u00e9lk\u00fcl megbirk\u00f3zik.<\/p>\n<p><\/p>\n<p>K\u00fcl\u00f6n szkriptbe szervezt\u00fck az nginx-proxyt, \u00e9s abban meghat\u00e1roztuk a projektek h\u00e1l\u00f3zatait. <\/p>\n<p><\/p>\n<p>A projekt\u00fcnknek egy h\u00e1l\u00f3zata van, m\u00edg a terhel\u00e9seloszt\u00f3nak t\u00f6bb h\u00e1l\u00f3zata van a projektek nevei szerint. Ez domainnevek alapj\u00e1n tov\u00e1bb tudja proxyzni.<\/p>\n<p><\/p>\n<p>A domain query comes in on port 80 and is routed to a group of containers that serve this domain.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/25c769f029b272a17fd06bbe60cf0ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>What other problems were there? The default is that all containers run as the root user. This root is not the same as the root of the system host.<\/p>\n<p><\/p>\n<p>However, if you log into the container, it will be root, and the file we create in this container gets root permissions.<\/p>\n<p><\/p>\n<p>If a developer logged into the container and executed commands that generate files, then exited the container, they will have a file in their working directory that they cannot access.<\/p>\n<p><\/p>\n<p>How can this be resolved? We can add users who will be in the container.<\/p>\n<p><\/p>\n<p>What problems arose when we added the user?<\/p>\n<p><\/p>\n<p>When creating a user, we often have mismatched group IDs (UID) and user IDs (GID).<\/p>\n<p><\/p>\n<p>To resolve this issue, we use users with ID 1000 in the container.<\/p>\n<p><\/p>\n<p>In our case, this coincided with the fact that practically all developers use Ubuntu OS. And on Ubuntu OS, the first user has ID 1000.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/d4911374e4953fdcd807c387efeafec3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>What are our plans?<\/p>\n<p><\/p>\n<p>Re-read the Docker documentation. The project is actively evolving, and the documentation is changing. Information obtained two to three months ago is gradually becoming outdated. <\/p>\n<p><\/p>\n<p>Some of the problems we addressed may already be solved by standard means.<\/p>\n<p><\/p>\n<p>We really want to move forward and get directly to orchestration.<\/p>\n<p><\/p>\n<p>One example is the built-in Docker mechanism called Docker Swarm, which is available out of the box. We want to launch something in production based on Docker Swarm technology.<\/p>\n<p><\/p>\n<p>Container generation complicates working with logs. Currently, the logs are isolated. They are scattered across containers. One of the tasks is to provide easy access to logs through a web interface.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A fejleszt\u00e9s \u00e9s tesztel\u00e9s folyamata Docker \u00e9s Gitlab CI haszn\u00e1lat\u00e1val\" src=\"\/wp-content\/uploads\/2019\/04\/cff8c72dd8af7de1fa0227601bd1d69c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449742\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u0433\u0430\u0447\u0435\u0432\u0430 \u0438\u0437 Inventos &#171;\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker + Gitlab CI&#187; \u0422\u0435, \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0431\u0430\u0437\u0435 Docker + Gitlab CI \u0447\u0430\u0441\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u0421 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u0442\u044c? \u041a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c? \u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c? \u042d\u0442\u043e\u0442 \u0434\u043e\u043a\u043b\u0430\u0434 \u0445\u043e\u0440\u043e\u0448 \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24326,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32526","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u0433\u0430\u0447\u0435\u0432\u0430 \u0438\u0437 Inventos &quot;\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker + Gitlab CI&quot; \u0422\u0435, \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker \u0438 Gitlab CI | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u0433\u0430\u0447\u0435\u0432\u0430 \u0438\u0437 Inventos &quot;\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker + Gitlab CI&quot; \u0422\u0435, \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:47:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:47:32+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Development and Testing Process with Docker and Gitlab CI | ProHoster","description":"I suggest looking at the transcript of Alexander Sigachev's report from Inventos \"Development and Testing Process with Docker + Gitlab CI\" for those who are just starting to implement the development process.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker \u0438 Gitlab CI | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u0433\u0430\u0447\u0435\u0432\u0430 \u0438\u0437 Inventos &quot;\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Docker + Gitlab CI&quot; \u0422\u0435, \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/protsess-razrabotki-i-testirovaniya-s-docker-i-gitlab-ci","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:47:32+00:00","article:modified_time":"2019-10-31T18:47:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32526","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 11:18:24","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:57:22","updated":"2026-01-21 11:18:24","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/32526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=32526"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/32526\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/24326"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=32526"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=32526"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=32526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}