{"id":69351,"date":"2020-02-18T14:44:06","date_gmt":"2020-02-18T11:44:06","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker"},"modified":"2020-03-03T16:15:00","modified_gmt":"2020-03-03T13:15:00","slug":"sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker","title":{"rendered":"CI\/CD l\u00e1ncolat l\u00e9trehoz\u00e1sa \u00e9s a Docker munkafolyamatok automatiz\u00e1l\u00e1sa","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Az els\u0151 weboldalaimat a 90-es \u00e9vek v\u00e9g\u00e9n \u00edrtam. Akkoriban nagyon egyszer\u0171 volt \u0151ket m\u0171k\u00f6d\u00e9sbe hozni. Volt egy Apache szerver valamilyen megosztott hosztingon, ahov\u00e1 FTP-n kereszt\u00fcl be lehetett l\u00e9pni, ha be\u00edrt\u00e1l a b\u00f6ng\u00e9sz\u0151 c\u00edmsor\u00e1ba valami ilyesmit <code>ftp:\/\/ftp.example.com<\/code>. Azt\u00e1n be kellett \u00edrni a felhaszn\u00e1l\u00f3nevet \u00e9s a jelsz\u00f3t, majd felt\u00f6lteni a f\u00e1jlokat a szerverre. M\u00e1s id\u0151k voltak, akkor minden sokkal egyszer\u0171bb volt, mint most.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/488668\/\"><img decoding=\"async\" alt=\"CI\/CD l\u00e1ncolat l\u00e9trehoz\u00e1sa \u00e9s a Docker munkafolyamatok automatiz\u00e1l\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/0861cdd82770ef4695ffac7a09777c52.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Az\u00f3ta, a k\u00e9t \u00e9vtized alatt, sok minden megv\u00e1ltozott. A weboldalak bonyolultabb\u00e1 v\u00e1ltak, a kiad\u00e1s el\u0151tt \u00f6ssze kell \u0151ket \u00e1ll\u00edtani. Egyetlen szerverb\u0151l sok szerver lett, amelyek terhel\u00e9seloszt\u00f3k m\u00f6g\u00f6tt m\u0171k\u00f6dnek, \u00e9s a verzi\u00f3kezel\u0151 rendszerek haszn\u00e1lata mindennaposs\u00e1 v\u00e1lt.<\/p>\n<p>A szem\u00e9lyes projektemhez k\u00fcl\u00f6nleges konfigur\u00e1ci\u00f3ra volt sz\u00fcks\u00e9gem. Tudtam, hogy sz\u00fcks\u00e9gem van arra a lehet\u0151s\u00e9gre, hogy a weboldalt a termel\u00e9si k\u00f6rnyezetben egyetlen l\u00e9p\u00e9ssel telep\u00edtsem: a k\u00f3dot a <code>master<\/code> GitHub \u00e1gba kell \u00edrnom. Emellett tudtam, hogy a kis webalkalmaz\u00e1som m\u0171k\u00f6d\u00e9s\u00e9nek biztos\u00edt\u00e1s\u00e1hoz nem szeretn\u00e9k \u00f3ri\u00e1si Kubernetes klaszter kezel\u00e9ssel foglalkozni, vagy Docker Swarm technol\u00f3gi\u00e1t haszn\u00e1lni, vagy egy szerverparkot fenntartani podokkal, \u00fcgyn\u00f6k\u00f6kkel \u00e9s mindenf\u00e9le egy\u00e9b bonyodalommal. A munk\u00e1m maxim\u00e1lis egyszer\u0171s\u00edt\u00e9se \u00e9rdek\u00e9ben meg kellett ismerkednem a CI\/CD-vel.<\/p>\n<p>Ha van egy kis projekted (ebben az esetben egy Node.js projektr\u0151l besz\u00e9l\u00fcnk) \u00e9s szeretn\u00e9d megtudni, hogyan automatiz\u00e1ld ennek a projektnek a telep\u00edt\u00e9s\u00e9t \u00fagy, hogy a t\u00e1rol\u00f3ban t\u00e1rolt f\u00e1jlok pontosan megegyezzenek azzal, ami a termel\u00e9sben fut, akkor azt hiszem, \u00e9rdekelhet ez a cikk.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>El\u0151felt\u00e9telek<\/h2>\n<p>\nA cikk olvas\u00f3j\u00e1t\u00f3l elv\u00e1rt alapvet\u0151 ismeretek a parancssor haszn\u00e1lat\u00e1ban \u00e9s Bash szkriptek \u00edr\u00e1s\u00e1ban. Ezen k\u00edv\u00fcl sz\u00fcks\u00e9ge lesz fi\u00f3kokra <noindex><a rel=\"nofollow\" href=\"https:\/\/travis-ci.org\/\">Travis CI<\/a><\/noindex> \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/\">Docker Hub<\/a><\/noindex>.<\/p>\n<h2>C\u00e9lok<\/h2>\n<p>\nNem mondan\u00e1m, hogy ezt a cikket mindenf\u00e9le k\u00e9ts\u00e9g n\u00e9lk\u00fcl \"\u00fatmutat\u00f3nak\" lehet nevezni. Ink\u00e1bb egy dokumentum, amelyben elmes\u00e9lem, amit megtudtam, \u00e9s le\u00edrom a sz\u00e1momra megfelel\u0151 tesztel\u00e9si \u00e9s k\u00f3dtelep\u00edt\u00e9si folyamatot, amelyet egy automatiz\u00e1lt l\u00e9p\u00e9sben hajtanak v\u00e9gre.<\/p>\n<p>\u00cdme, milyen lett v\u00e9g\u00fcl a munkafolyamatom.<\/p>\n<p>B\u00e1rmilyen \u00e1gba felt\u00f6lt\u00f6tt k\u00f3d eset\u00e9n, kiv\u00e9ve a <code>master<\/code>, a k\u00f6vetkez\u0151 m\u0171veletek t\u00f6rt\u00e9nnek:<\/p>\n<ul>\n<li>A projekt \u00e9p\u00edt\u00e9se a Travis CI-n indul.<\/li>\n<li>Minden modul\u00e1ris, integr\u00e1ci\u00f3s \u00e9s end-to-end teszt fut.<\/li>\n<\/ul>\n<p>\nCsak a k\u00f3d eset\u00e9ben, amely a <code>master<\/code>al\u00e1 tartozik, a k\u00f6vetkez\u0151 t\u00f6rt\u00e9nik:<\/p>\n<ul>\n<li>Mindez, amit fentebb eml\u00edtett\u00fcnk, plusz\u2026<\/li>\n<li>Docker k\u00e9p \u00e9p\u00edt\u00e9se a jelenlegi k\u00f3d, be\u00e1ll\u00edt\u00e1sok \u00e9s k\u00f6rnyezet alapj\u00e1n.<\/li>\n<li>A k\u00e9p elhelyez\u00e9se a Docker Hub-on.<\/li>\n<li>Kapcsol\u00f3d\u00e1s a produkci\u00f3s szerverhez.<\/li>\n<li>K\u00e9p let\u00f6lt\u00e9se a Docker Hub-r\u00f3l a szerverre.<\/li>\n<li>A jelenlegi kont\u00e9ner le\u00e1ll\u00edt\u00e1sa \u00e9s \u00faj ind\u00edt\u00e1sa, amely \u00faj k\u00e9pen alapul.<\/li>\n<\/ul>\n<p>\nHa teljesen ismeretlen vagy a Dockerrel, k\u00e9pekkel \u00e9s kont\u00e9nerekkel kapcsolatban \u2013 ne agg\u00f3dj. Mindezt elmondom neked.<\/p>\n<h2>Mi az a CI\/CD?<\/h2>\n<p>\nA CI\/CD r\u00f6vid\u00edt\u00e9s jelent\u00e9se: \u201efolyamatos integr\u00e1ci\u00f3\/folyamatos telep\u00edt\u00e9s\u201d.<\/p>\n<h3>\u258dFolyamatos integr\u00e1ci\u00f3<\/h3>\n<p>\nA folyamatos integr\u00e1ci\u00f3 egy olyan folyamat, amely sor\u00e1n a fejleszt\u0151k elk\u00f6telezik a projekt f\u0151 forr\u00e1sk\u00f3d t\u00e1rol\u00f3j\u00e1ba (\u00e1ltal\u00e1ban a <code>master<\/code>) a k\u00f3d min\u0151s\u00e9ge automatiz\u00e1lt tesztel\u00e9s r\u00e9v\u00e9n biztos\u00edtott.<\/p>\n<h3>\u258dFolyamatos telep\u00edt\u00e9s<\/h3>\n<p>\nA folyamatos telep\u00edt\u00e9s a k\u00f3d gyakori automatiz\u00e1lt telep\u00edt\u00e9se a produkci\u00f3ban. A CI\/CD r\u00f6vid\u00edt\u00e9s m\u00e1sodik r\u00e9sze n\u00e9ha \u201efolyamatos kisz\u00e1ll\u00edt\u00e1st\u201d (continuous delivery) is jelent. Ez l\u00e9nyeg\u00e9ben ugyanaz, mint a \u201efolyamatos telep\u00edt\u00e9s\u201d, de a \u201efolyamatos kisz\u00e1ll\u00edt\u00e1s\u201d sz\u00fcks\u00e9gess\u00e9 teszi a v\u00e1ltoz\u00e1sok manu\u00e1lis meger\u0151s\u00edt\u00e9s\u00e9t a projekt telep\u00edt\u00e9si folyamat\u00e1nak elind\u00edt\u00e1sa el\u0151tt.<\/p>\n<h2>Munka kezdetek<\/h2>\n<p>\nAz alkalmaz\u00e1s, amellyel mindezt elsaj\u00e1t\u00edtottam, a k\u00f6vetkez\u0151 neve: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/taniarascia\/takenote\">TakeNote<\/a><\/noindex>. Ez egy webes projekt, amelyen dolgozom, \u00e9s amely a jegyzetel\u00e9shez k\u00e9sz\u00fclt. El\u0151sz\u00f6r pr\u00f3b\u00e1ltam l\u00e9trehozni egy <noindex><a rel=\"nofollow\" href=\"https:\/\/jamstack.org\/\">JAMStack<\/a><\/noindex>-projektet, vagy csak frontend alkalmaz\u00e1st kiszolg\u00e1l\u00f3 n\u00e9lk\u00fcl, hogy kihaszn\u00e1lhassam a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.netlify.com\/\">Netlify<\/a><\/noindex>-t\u00f3l el\u00e9rhet\u0151 standard lehet\u0151s\u00e9geket a projektek hosztol\u00e1s\u00e1ra \u00e9s telep\u00edt\u00e9s\u00e9re. Ahogy az alkalmaz\u00e1s bonyolults\u00e1ga n\u00f6vekedett, sz\u00fcks\u00e9gess\u00e9 v\u00e1lt a szerveroldali r\u00e9sz l\u00e9trehoz\u00e1sa, ami azt jelentette, hogy saj\u00e1t strat\u00e9gi\u00e1t kellett kialak\u00edtanom az automatiz\u00e1lt integr\u00e1ci\u00f3ra \u00e9s telep\u00edt\u00e9sre.<\/p>\n<p>Az \u00e9n esetemben az alkalmaz\u00e1s egy Express szerver, amely a Node.js k\u00f6rnyezet\u00e9ben m\u0171k\u00f6dik, \u00e9s egy egylapos React alkalmaz\u00e1st szolg\u00e1l ki, valamint t\u00e1mogat egy biztons\u00e1gos szerveroldali API-t. Ez az architekt\u00fara egy strat\u00e9gi\u00e1t k\u00f6vet, amely a k\u00f6vetkez\u0151 helyen tal\u00e1lhat\u00f3: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.taniarascia.com\/full-stack-cookies-localstorage-react-express\/\">ebben<\/a><\/noindex> a teljes k\u00f6r\u0171 hiteles\u00edt\u00e9sr\u0151l sz\u00f3l\u00f3 \u00fatmutat\u00f3ban.<\/p>\n<p>Consult\u00e1ltam <noindex><a rel=\"nofollow\" href=\"http:\/\/qualitytesting.tech\/\">egy bar\u00e1tommal<\/a><\/noindex>, aki automatiz\u00e1l\u00e1si szak\u00e9rt\u0151, \u00e9s megk\u00e9rdeztem t\u0151le, hogy mit kell tenni ahhoz, hogy minden \u00fagy m\u0171k\u00f6dj\u00f6n, ahogy szeretn\u00e9m. \u0150 adott nekem egy \u00f6tletet arr\u00f3l, hogyan kell kin\u00e9znie az automatiz\u00e1lt munkafolyamatnak, amelyet a cikk \"C\u00e9lok\" szakasz\u00e1ban v\u00e1zoltam. Az, hogy ilyen c\u00e9lokat t\u0171ztem ki magam el\u00e9, azt jelentette, hogy meg kell tanulnom, hogyan haszn\u00e1lhatom a Dockert.<\/p>\n<h2>Docker<\/h2>\n<p>\nA Docker egy eszk\u00f6z, amely a kont\u00e9neriz\u00e1ci\u00f3s technol\u00f3gia r\u00e9v\u00e9n lehet\u0151v\u00e9 teszi az alkalmaz\u00e1sok egyszer\u0171 terjeszt\u00e9s\u00e9t, valamint azok telep\u00edt\u00e9s\u00e9t \u00e9s futtat\u00e1s\u00e1t ugyanabban a k\u00f6rnyezetben, m\u00e9g akkor is, ha mag\u00e1nak a Docker platformnak a m\u0171k\u00f6d\u00e9se k\u00fcl\u00f6nb\u00f6z\u0151 k\u00f6rnyezetekben zajlik. El\u0151sz\u00f6r teh\u00e1t sz\u00fcks\u00e9gem volt a Docker parancssori eszk\u00f6zeire (CLI). <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/install\/\">A Docker telep\u00edt\u00e9si<\/a><\/noindex> utas\u00edt\u00e1st nem lehet nagyon vil\u00e1gosnak \u00e9s \u00e9rthet\u0151nek nevezni, de megtudhat\u00f3 bel\u0151le, hogy az els\u0151 telep\u00edt\u00e9si l\u00e9p\u00e9shez le kell t\u00f6lteni a Docker Desktopot (Macra vagy Windowsra).<\/p>\n<p>A Docker Hub nagyj\u00e1b\u00f3l ugyanolyan, mint <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/\">GitHub<\/a><\/noindex> a git-t\u00e1rol\u00f3k, vagy nyilv\u00e1ntart\u00e1s <noindex><a rel=\"nofollow\" href=\"https:\/\/www.npmjs.com\/\">npm<\/a><\/noindex> JavaScript-csomagokhoz. Ez egy online t\u00e1rol\u00f3 a Docker k\u00e9pek sz\u00e1m\u00e1ra. Ehhez csatlakozik a Docker Desktop.<\/p>\n<p>Teh\u00e1t, hogy elkezdhesd a munk\u00e1t a Dockerrel, k\u00e9t dolgot kell tenned:<\/p>\n<ul>\n<li>Telep\u00edtse <noindex><a rel=\"nofollow\" href=\"https:\/\/www.docker.com\/get-started\">Docker Desktop<\/a><\/noindex>.<\/li>\n<li>Regisztr\u00e1lj a <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/\">Docker Hub<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nEzut\u00e1n ellen\u0151rizheted a Docker CLI m\u0171k\u00f6d\u00e9s\u00e9t a k\u00f6vetkez\u0151 parancs v\u00e9grehajt\u00e1s\u00e1val a Docker verzi\u00f3 ellen\u0151rz\u00e9s\u00e9re:<\/p>\n<pre><code class=\"plaintext\">docker -v<\/code><\/pre>\n<p>\nK\u00f6vetkez\u0151 l\u00e9p\u00e9sk\u00e9nt jelentkezz be a Docker Hubba, amikor megk\u00e9rdezik, add meg a felhaszn\u00e1l\u00f3nev\u00e9t \u00e9s a jelszav\u00e1t:<\/p>\n<pre><code class=\"plaintext\">docker login<\/code><\/pre>\n<p>\nA Docker haszn\u00e1lat\u00e1hoz meg kell \u00e9rtened a k\u00e9pek \u00e9s kont\u00e9nerek koncepci\u00f3j\u00e1t.<\/p>\n<h3>\u258dK\u00e9pek<\/h3>\n<p>\nA k\u00e9p egyfajta terv, amely tartalmazza a kont\u00e9ner \u00f6sszeszerel\u00e9s\u00e9hez sz\u00fcks\u00e9ges utas\u00edt\u00e1sokat. Ez egy v\u00e1ltozhatatlan pillanatk\u00e9p a f\u00e1jlrendszerr\u0151l \u00e9s az alkalmaz\u00e1s be\u00e1ll\u00edt\u00e1sair\u00f3l. A fejleszt\u0151k k\u00f6nnyed\u00e9n cser\u00e9lhetnek k\u00e9peket.<\/p>\n<pre><code class=\"plaintext\"># \u0412\u044b\u0432\u043e\u0434 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u043e\u0431\u0440\u0430\u0437\u0430\u0445\ndocker images<\/code><\/pre>\n<p>\nEz a parancs egy t\u00e1bl\u00e1zatot fog megjelen\u00edteni a k\u00f6vetkez\u0151 fejl\u00e9csel:<\/p>\n<pre><code class=\"plaintext\">T\u00c1ROL\u00d3 \u00a0 \u00a0 TAG     K\u00c9P AZONOS\u00cdT\u00d3 \u00a0 \u00a0 L\u00c9TREHOZVA     M\u00c9RET\n---<\/code><\/pre>\n<p>\nK\u00e9s\u0151bb n\u00e9h\u00e1ny parancs p\u00e9ld\u00e1t fogunk megvizsg\u00e1lni hasonl\u00f3 form\u00e1tumban - el\u0151sz\u00f6r j\u00f6n a parancs egy megjegyz\u00e9ssel, azt\u00e1n egy p\u00e9lda arra, hogy mit hozhat l\u00e9tre.<\/p>\n<h3>\u258dKont\u00e9nerek<\/h3>\n<p>\nA kont\u00e9ner egy v\u00e9grehajthat\u00f3 csomag, amely mindent tartalmaz, amire az alkalmaz\u00e1s futtat\u00e1s\u00e1hoz sz\u00fcks\u00e9g van. E megk\u00f6zel\u00edt\u00e9s eset\u00e9n az alkalmaz\u00e1s mindig azonos m\u00f3don m\u0171k\u00f6dik, f\u00fcggetlen\u00fcl az infrastrukt\u00far\u00e1t\u00f3l: izol\u00e1lt k\u00f6rnyezetben \u00e9s ugyanabban a k\u00f6rnyezetben. Arr\u00f3l van sz\u00f3, hogy ugyanazon k\u00e9p p\u00e9ld\u00e1nyai indulnak el k\u00fcl\u00f6nb\u00f6z\u0151 k\u00f6rnyezetekben.<\/p>\n<pre><code class=\"plaintext\"># \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\ndocker ps -a\nCONTAINER ID \u00a0 \u00a0 IMAGE     COMMAND \u00a0 \u00a0 CREATED     STATUS     PORTS \u00a0 \u00a0 NAMES\n---<\/code><\/pre>\n<p><\/p>\n<h3>\u258dC\u00edmk\u00e9k<\/h3>\n<p>\nA c\u00edmke a k\u00e9p egy adott verzi\u00f3j\u00e1ra val\u00f3 hivatkoz\u00e1s.<\/p>\n<h3>\u258dR\u00f6vid \u00fatmutat\u00f3 a Docker parancsokhoz<\/h3>\n<p>\nItt egy \u00e1ttekint\u00e9s n\u00e9h\u00e1ny gyakran haszn\u00e1lt Docker parancsr\u00f3l.<\/p>\n<p>A parancs<\/p>\n<p>K\u00f6rnyezet<\/p>\n<p>M\u0171velet<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/build\/\">docker build<\/a><\/noindex><\/p>\n<p>K\u00e9p<\/p>\n<p>K\u00e9p \u00e9p\u00edt\u00e9se Dockerfile-b\u00f3l<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/tag\/\">docker tag<\/a><\/noindex><\/p>\n<p>K\u00e9p<\/p>\n<p>K\u00e9p c\u00edmk\u00e9z\u00e9se<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/images\/\">docker images<\/a><\/noindex><\/p>\n<p>K\u00e9p<\/p>\n<p>K\u00e9pek list\u00e1j\u00e1nak megjelen\u00edt\u00e9se<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/run\/\">docker run<\/a><\/noindex><\/p>\n<p>Kont\u00e9ner<\/p>\n<p>Kont\u00e9ner ind\u00edt\u00e1sa a k\u00e9p alapj\u00e1n<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/push\/\">docker push<\/a><\/noindex><\/p>\n<p>K\u00e9p<\/p>\n<p>K\u00e9p k\u00fcld\u00e9se a t\u00e1rol\u00f3ba<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/about:blank\">docker pull<\/a><\/noindex><\/p>\n<p>K\u00e9p<\/p>\n<p>K\u00e9p let\u00f6lt\u00e9se a t\u00e1rol\u00f3b\u00f3l<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/ps\/\">docker ps<\/a><\/noindex><\/p>\n<p>Kont\u00e9ner<\/p>\n<p>Kont\u00e9nerek list\u00e1j\u00e1nak megjelen\u00edt\u00e9se<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/system_prune\/\">docker system prune<\/a><\/noindex><\/p>\n<p>K\u00e9p\/Kont\u00e9ner<\/p>\n<p>Nem haszn\u00e1lt kont\u00e9nerek \u00e9s k\u00e9pek elt\u00e1vol\u00edt\u00e1sa<\/p>\n<h3>\u258dDockerfile<\/h3>\n<p>\nTudom, hogyan ind\u00edtsam el helyben az alkalmaz\u00e1st \u00e9lesben. Van egy Webpack-konfigur\u00e1ci\u00f3m, amely a k\u00e9sz React-alkalmaz\u00e1s \u00e9p\u00edt\u00e9s\u00e9re szolg\u00e1l. Ezen k\u00edv\u00fcl van egy parancsom, amely egy Node.js alap\u00fa szervert ind\u00edt el a <code>5000<\/code>porton. \u00cdgy n\u00e9z ki:<\/p>\n<pre><code class=\"plaintext\">npm i \u00a0 \u00a0 \u00a0 \u00a0 # f\u00fcgg\u0151s\u00e9gek telep\u00edt\u00e9se\nnpm run build # React-alkalmaz\u00e1s \u00e9p\u00edt\u00e9se\nnpm run start # Node-szerver ind\u00edt\u00e1sa<\/code><\/pre>\n<p>\nMeg kell jegyezni, hogy nincs p\u00e9ldaprogramom ehhez az anyaghoz. De itt, k\u00eds\u00e9rletez\u00e9shez, b\u00e1rmilyen egyszer\u0171 Node-alkalmaz\u00e1s megfelel.<\/p>\n<p>Ahhoz, hogy a kont\u00e9nert haszn\u00e1lhassa, utas\u00edt\u00e1sokat kell adnia a Dockernak. Ez a <code>Dockerfile<\/code>, a projekt gy\u00f6k\u00e9rk\u00f6nyvt\u00e1r\u00e1ban tal\u00e1lhat\u00f3 f\u00e1jl seg\u00edts\u00e9g\u00e9vel t\u00f6rt\u00e9nik. Ez a f\u00e1jl eleinte el\u00e9g \u00e9rthetetlennek t\u0171nik.<\/p>\n<p>De amit tartalmaz, az csup\u00e1n k\u00fcl\u00f6nf\u00e9le parancsokkal le\u00edrja, hogy mi hasonl\u00edt a munkak\u00f6rnyezet be\u00e1ll\u00edt\u00e1s\u00e1ra. \u00cdme n\u00e9h\u00e1ny ilyen parancs:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#from\">FROM<\/a><\/noindex> \u2014 Ez a parancs ind\u00edtja el a f\u00e1jlt. Itt van megadva az alap k\u00e9p, amely alapj\u00e1n a kont\u00e9ner \u00e9p\u00fcl.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#copy\">COPY<\/a><\/noindex> \u2014 F\u00e1jlok m\u00e1sol\u00e1sa a helyi forr\u00e1sb\u00f3l a kont\u00e9nerbe.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#workdir\">WORKDIR<\/a><\/noindex> \u2014 Munkak\u00f6nyvt\u00e1r be\u00e1ll\u00edt\u00e1sa a k\u00f6vetkez\u0151 parancsokhoz.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#run\">RUN<\/a><\/noindex> \u2014 Parancsok futtat\u00e1sa.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#expose\">EXPOSE<\/a><\/noindex> \u2014 Port be\u00e1ll\u00edt\u00e1sa.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#entrypoint\">ENTRYPOINT<\/a><\/noindex> \u2014 A v\u00e9grehajtand\u00f3 parancs megad\u00e1sa.<\/li>\n<\/ul>\n<p>\n<code>Dockerfile<\/code> valahogy \u00edgy n\u00e9zhet ki:<\/p>\n<pre><code class=\"plaintext\"># \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437\nFROM node:12-alpine\n\n# \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e app\/\nCOPY . app\/\n\n# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c app\/ \u0432 \u0440\u043e\u043b\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\nWORKDIR app\/\n\n# \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 npm ci \u043f\u043e\u0445\u043e\u0436\u0430 npm i, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a)\nRUN npm ci --only-production\n\n# \u0421\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 React-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0430\nRUN npm run build\n\n# \u041f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0440\u0442\nEXPOSE 5000\n\n# \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Node-\u0441\u0435\u0440\u0432\u0435\u0440\nENTRYPOINT npm run start<\/code><\/pre>\n<p>\nA v\u00e1lasztott alapk\u00e9pt\u0151l f\u00fcgg\u0151en lehet, hogy tov\u00e1bbi f\u00fcgg\u0151s\u00e9geket kell telep\u00edtenie. Az a helyzet, hogy egyes alapk\u00e9pek (p\u00e9ld\u00e1ul a Node Alpine Linux) \u00fagy k\u00e9sz\u00fcltek, hogy a lehet\u0151 legkompaktabbak legyenek. Ennek eredm\u00e9nyek\u00e9nt hi\u00e1nyozhatnak bel\u0151l\u00fck bizonyos programok, amelyekre sz\u00e1m\u00edt.<\/p>\n<h3>\u258dA kont\u00e9ner \u00f6ssze\u00e1ll\u00edt\u00e1sa, c\u00edmk\u00e9z\u00e9se \u00e9s ind\u00edt\u00e1sa<\/h3>\n<p>\nA kont\u00e9ner helyi \u00f6ssze\u00e1ll\u00edt\u00e1sa \u00e9s ind\u00edt\u00e1sa \u2014 ez azut\u00e1n t\u00f6rt\u00e9nik, hogy van egy <code>Dockerfile<\/code>, a feladatok meglehet\u0151sen egyszer\u0171ek. Miel\u0151tt az elk\u00e9sz\u00fclt k\u00e9pet felt\u00f6lten\u00e9 a Docker Hub-ra, helyben le kell tesztelni.<\/p>\n<h3>\u258d\u00d6ssze\u00e1ll\u00edt\u00e1s<\/h3>\n<p>\nEl\u0151sz\u00f6r is \u00f6ssze kell \u00e1ll\u00edtani a <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/build\/\">image<\/a><\/noindex>, megadva a nev\u00e9t, \u00e9s opcion\u00e1lisan a c\u00edmk\u00e9t (ha nem ad meg c\u00edmk\u00e9t, a rendszer automatikusan hozz\u00e1rendel egyet a k\u00e9phez <code>latest<\/code>).<\/p>\n<pre><code class=\"plaintext\"># \u0421\u0431\u043e\u0440\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u0430\ndocker build -t &lt;image&gt;:&lt;tag&gt; .<\/code><\/pre>\n<p>\nE parancs v\u00e9grehajt\u00e1sa ut\u00e1n figyelemmel k\u00eds\u00e9rheti, ahogyan a Docker \u00f6ssze\u00e1ll\u00edtja a k\u00e9pet.<\/p>\n<pre><code class=\"plaintext\">A build k\u00f6rnyezet elk\u00fcld\u00e9se a Docker d\u00e9monnak \u00a0 2.88MB\n1\/9 l\u00e9p\u00e9s: NODE-b\u00f3l:12-alpine\n\u00a0---&gt; ...\u00e9p\u00edt\u00e9si l\u00e9p\u00e9sek v\u00e9grehajt\u00e1sa...\nSikeresen l\u00e9trehozva 123456789123\nSikeresen c\u00edmk\u00e9zve &lt;k\u00e9p&gt;:&lt;c\u00edmke&gt;<\/code><\/pre>\n<p>\nAz \u00f6ssze\u00e1ll\u00edt\u00e1s n\u00e9h\u00e1ny percet ig\u00e9nybe vehet \u2014 minden a rendelkez\u00e9sre \u00e1ll\u00f3 f\u00fcgg\u0151s\u00e9gekt\u0151l f\u00fcgg. Az \u00f6ssze\u00e1ll\u00edt\u00e1s befejez\u00e9se ut\u00e1n kiadhatja a parancsot <code>docker images<\/code> \u00e9s megtekintheti az \u00faj k\u00e9p\u00e9nek le\u00edr\u00e1s\u00e1t.<\/p>\n<pre><code class=\"plaintext\">T\u00c1RHELY\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 TAG\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 K\u00c9PID\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 L\u00c9TREHOZVA\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 M\u00c9RET\n&lt;k\u00e9p&gt; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 legfrissebb \u00a0 \u00a0 \u00a0 123456789123\u00a0 \u00a0 \u00a0 \u00a0 K\u00f6r\u00fclbel\u00fcl egy perce \u00a0  x.xxGB<\/code><\/pre>\n<p><\/p>\n<h3>\u258dInd\u00edt\u00e1s<\/h3>\n<p>\nA k\u00e9p l\u00e9trej\u00f6tt. Ez azt jelenti, hogy kont\u00e9nert ind\u00edthatunk rajta. Mivel szeretn\u00e9m, hogy hozz\u00e1f\u00e9rhessek a kont\u00e9nerben fut\u00f3 alkalmaz\u00e1shoz a c\u00edmr\u0151l <code>localhost:5000<\/code>, a parancs bal oldal\u00e1n be\u00e1ll\u00edtottam a <code>5000:5000<\/code> . A jobb oldalon a kont\u00e9ner portja tal\u00e1lhat\u00f3. <code>5000<\/code>Most, hogy a kont\u00e9ner l\u00e9trej\u00f6tt \u00e9s elindult, kiadhatja a parancsot<\/p>\n<pre><code class=\"plaintext\"># \u0417\u0430\u043f\u0443\u0441\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430 5000 \u0438 \u043f\u043e\u0440\u0442\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 5000\ndocker run -p 5000:5000 &lt;image&gt;:&lt;tag&gt;<\/code><\/pre>\n<p>\nhogy megtekintse az adott kont\u00e9ner adatait (vagy haszn\u00e1lhatja a parancsot <code>docker ps<\/code> docker ps -a <code>, amely az \u00f6sszes kont\u00e9ner adatait megjelen\u00edti, nemcsak az akt\u00edvakat).<\/code>KONT\u00c9NER AZONOS\u00cdT\u00d3\u00a0 \u00a0 \u00a0 \u00a0 K\u00c9P\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 PARANCS\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 L\u00c9TREHOZVA\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00c1LLAPOT\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 PORTOK\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 N\u00c9V<\/p>\n<pre><code class=\"plaintext\">TART\u00c1LY AZONOS\u00cdT\u00d3\u00a0 \u00a0 \u00a0 \u00a0 K\u00c9P               PARANCS\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 L\u00c9TREHOZVA\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00c1LLAPOT                  \u00a0 \u00a0 PORTOK                    NEVEK\n987654321234\u00a0 \u00a0 \u00a0 \u00a0              \"\/bin\/sh -c 'npm run\u2026\" \u00a0 6 m\u00e1sodperce        Futtat\u00e1s 6 m\u00e1sodperce            \u00a0 \u00a0 0.0.0.0:5000-&gt;5000\/tcp   stoic_darwin<\/code><\/pre>\n<p>\nMost, ha az al\u00e1bbi c\u00edmre navig\u00e1lunk <code>localhost:5000<\/code> \u2014 l\u00e1thatjuk a fut\u00f3 alkalmaz\u00e1s oldal\u00e1t, amely pontosan \u00fagy n\u00e9z ki, mint a produkt\u00edv k\u00f6rnyezetben fut\u00f3 alkalmaz\u00e1s oldala.<\/p>\n<h3>\u258dC\u00edmke hozz\u00e1rendel\u00e9se \u00e9s k\u00f6zz\u00e9t\u00e9tel<\/h3>\n<p>\nAhhoz, hogy a l\u00e9trehozott k\u00e9peket haszn\u00e1lni tudjuk a produkci\u00f3s szerveren, biztos\u00edtanunk kell, hogy lehet\u0151s\u00e9g\u00fcnk legyen ezt a k\u00e9pet felt\u00f6lteni a Docker Hub-ra. Ez azt jelenti, hogy el\u0151sz\u00f6r egy rep\u00f3t kell l\u00e9trehoznunk a Docker Hub-on a projekthez. Ezt k\u00f6vet\u0151en rendelkez\u00e9s\u00fcnkre \u00e1ll egy hely, ahov\u00e1 el lehet k\u00fcldeni a k\u00e9pet. A k\u00e9pet \u00fagy kell elnevezni, hogy a neve a Docker Hub-on a felhaszn\u00e1l\u00f3nev\u00fcnkkel kezd\u0151dj\u00f6n. Ezt k\u00f6veti a rep\u00f3 neve. A n\u00e9v v\u00e9g\u00e9n b\u00e1rmilyen c\u00edmke elhelyezhet\u0151. Az al\u00e1bbiakban egy p\u00e9lda l\u00e1that\u00f3 a k\u00e9pek elnevez\u00e9s\u00e9re ezen a s\u00e9ma alapj\u00e1n.<\/p>\n<p>Most \u00f6sszerakhatjuk a k\u00e9pet, \u00faj nevet adva neki, \u00e9s v\u00e9grehajthatjuk a parancsot <code>docker push<\/code> a Docker Hub rep\u00f3ba val\u00f3 felt\u00f6lt\u00e9shez.<\/p>\n<pre><code class=\"plaintext\">docker build -t \/: .\ndocker tag \/: \/:latest\ndocker push \/:\n\n# A gyakorlatban ez \u00edgy n\u00e9zhet ki p\u00e9ld\u00e1ul:\ndocker build -t user\/app:v1.0.0 .\ndocker tag user\/app:v1.0.0 user\/app:latest\ndocker push user\/app:v1.0.0<\/code><\/pre>\n<p>\nHa minden rendben zajlik, a k\u00e9p el\u00e9rhet\u0151 lesz a Docker Hub-on, \u00e9s k\u00f6nnyen let\u00f6lthetj\u00fck a szerverre, vagy \u00e1tadhatjuk m\u00e1s fejleszt\u0151knek.<\/p>\n<h2>K\u00f6vetkez\u0151 l\u00e9p\u00e9sek<\/h2>\n<p>\nEddig megbizonyosodtunk arr\u00f3l, hogy a Docker kont\u00e9nerben l\u00e9v\u0151 alkalmaz\u00e1s helyben m\u0171k\u00f6dik. Felt\u00f6lt\u00f6tt\u00fck a kont\u00e9nert a Docker Hub-ra. Ez azt jelenti, hogy m\u00e1r el\u00e9g j\u00f3l haladtunk a c\u00e9l fel\u00e9. Most m\u00e9g k\u00e9t k\u00e9rd\u00e9st kell megoldanunk:<\/p>\n<ul>\n<li>A CI-eszk\u00f6z be\u00e1ll\u00edt\u00e1sa a k\u00f3d tesztel\u00e9s\u00e9re \u00e9s telep\u00edt\u00e9s\u00e9re.<\/li>\n<li>A produkci\u00f3s szerver be\u00e1ll\u00edt\u00e1sa \u00fagy, hogy k\u00e9pes legyen let\u00f6lteni \u00e9s futtatni a k\u00f3dunkat.<\/li>\n<\/ul>\n<p>\nAz eset\u00fcnkben a CI\/CD megold\u00e1sk\u00e9nt a <noindex><a rel=\"nofollow\" href=\"https:\/\/travis-ci.org\/\">Travis CI<\/a><\/noindex>haszn\u00e1latos. A szerver pedig a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.digitalocean.com\/\">DigitalOcean.<\/a><\/noindex>.<\/p>\n<p>Fontos megjegyezni, hogy itt m\u00e1s szolg\u00e1ltat\u00e1sok kombin\u00e1ci\u00f3j\u00e1t is ig\u00e9nybe lehet venni. P\u00e9ld\u00e1ul a Travis CI helyett haszn\u00e1lhat\u00f3 a CircleCI vagy a Github Actions. A DigitalOcean helyett pedig az AWS vagy a Linode.<\/p>\n<p>D\u00f6nt\u00f6tt\u00fcnk a Travis CI mellett, \u00e9s ebben a szolg\u00e1ltat\u00e1sban m\u00e1r van n\u00e9h\u00e1ny be\u00e1ll\u00edt\u00e1som. Ez\u00e9rt most r\u00f6viden elmondom, hogyan k\u00e9sz\u00edts\u00fck el\u0151 a m\u0171k\u00f6d\u00e9shez.<\/p>\n<h2>Travis CI<\/h2>\n<p>\nA Travis CI \u2014 egy eszk\u00f6z a k\u00f3d tesztel\u00e9s\u00e9re \u00e9s telep\u00edt\u00e9s\u00e9re. Nem szeretn\u00e9k a Travis CI be\u00e1ll\u00edt\u00e1s\u00e1nak r\u00e9szleteibe belemenni, mivel minden projekt egyedi, \u00e9s ez nem hozna sok hasznot. De elmondom az alapokat, amelyek lehet\u0151v\u00e9 teszik, hogy elkezdje a munk\u00e1t, ha \u00fagy d\u00f6nt, hogy haszn\u00e1lja a Travis CI-t. Ak\u00e1r a Travis CI-t, a CircleCI-t, a Jenkinst vagy valami m\u00e1st v\u00e1laszt, hasonl\u00f3 be\u00e1ll\u00edt\u00e1si m\u00f3dszerek fognak \u00e9rv\u00e9nyes\u00fclni.<\/p>\n<p>Ahhoz, hogy elkezdhesse a Travis CI haszn\u00e1lat\u00e1t, l\u00e1togasson el a <noindex><a rel=\"nofollow\" href=\"https:\/\/travis-ci.org\/\">projekt weboldal\u00e1ra<\/a><\/noindex> \u00e9s hozzon l\u00e9tre egy fi\u00f3kot. Ezut\u00e1n integr\u00e1lja a Travis CI-t a GitHub-fi\u00f3kj\u00e1val. A rendszer be\u00e1ll\u00edt\u00e1sa sor\u00e1n meg kell adnia a rep\u00f3t, amellyel automatiz\u00e1lni k\u00edv\u00e1nja a munk\u00e1t, \u00e9s enged\u00e9lyeznie kell hozz\u00e1f\u00e9r\u00e9st ehhez. (\u00c9n a GitHub-ot haszn\u00e1lom, de biztos vagyok benne, hogy a Travis CI integr\u00e1lhat\u00f3 a BitBucket-tel, a GitLab-bal \u00e9s m\u00e1s hasonl\u00f3 szolg\u00e1ltat\u00e1sokkal is.)<\/p>\n<p>Minden alkalommal, amikor a Travis CI munk\u00e1hoz l\u00e1t, egy szerver indul el, amely v\u00e9grehajtja a konfigur\u00e1ci\u00f3s f\u00e1jlban megadott parancsokat, bele\u00e9rtve a megfelel\u0151 repozit\u00f3rium \u00e1gak telep\u00edt\u00e9s\u00e9t.<\/p>\n<h3>\u258dA feladat \u00e9letciklusa<\/h3>\n<p>\nA Travis CI konfigur\u00e1ci\u00f3s f\u00e1jlja, amelyet <code>.travis.yml<\/code> -nak h\u00edvnak, \u00e9s a projekt gy\u00f6k\u00e9rk\u00f6nyvt\u00e1r\u00e1ban tal\u00e1lhat\u00f3, az esem\u00e9nyek fogalm\u00e1t t\u00e1mogatja, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.travis-ci.com\/user\/job-lifecycle\/\">amelyek a feladat \u00e9letciklusa alatt t\u00f6rt\u00e9nnek. \u00cdme ezek az esem\u00e9nyek, az el\u0151fordul\u00e1suk sorrendj\u00e9ben:<\/a><\/noindex> apt addons<\/p>\n<ul>\n<li><code>cache components<\/code><\/li>\n<li><code>before_install<\/code><\/li>\n<li><code>before_script<\/code><\/li>\n<li><code>install<\/code><\/li>\n<li><code>before_cache<\/code><\/li>\n<li><code>script<\/code><\/li>\n<li><code>after_success vagy after_failure<\/code><\/li>\n<li><code>before_deploy<\/code><\/li>\n<li><code>deploy<\/code><\/li>\n<li><code>after_deploy<\/code><\/li>\n<li><code>after_script<\/code><\/li>\n<li><code>\u258dTesztel\u00e9s<\/code><\/li>\n<\/ul>\n<p><\/p>\n<h3>A konfigur\u00e1ci\u00f3s f\u00e1jlban egy helyi Travis CI szervert fogok be\u00e1ll\u00edtani. A nyelvnek a Node 12 verzi\u00f3j\u00e1t v\u00e1lasztottam, \u00e9s megadtam a rendszernek, hogy telep\u00edtse a Docker haszn\u00e1lat\u00e1hoz sz\u00fcks\u00e9ges f\u00fcgg\u0151s\u00e9geket.<\/h3>\n<p>\nMinden, ami a<\/p>\n<p>-ban van, v\u00e9grehajt\u00f3dik minden pull request sor\u00e1n az \u00f6sszes repozit\u00f3rium \u00e1gra, hacsak m\u00e1sk\u00e9nt nem rendelkeznek. Ez egy hasznos funkci\u00f3, mivel azt jelenti, hogy tesztelhetj\u00fck az \u00f6sszes k\u00f3dot, ami a repozit\u00f3riumba \u00e9rkezik. Ez lehet\u0151v\u00e9 teszi, hogy tudjuk, k\u00e9szen \u00e1ll-e a k\u00f3d az \u00e1gba \u00edr\u00e1sra, <code>.travis.yml<\/code>-ben, \u00e9s hogy nem fogja-e megszak\u00edtani a projekt \u00f6ssze\u00e1ll\u00edt\u00e1si folyamat\u00e1t. Ebben a glob\u00e1lis konfigur\u00e1ci\u00f3ban minden be\u00e1ll\u00edtok helyben, elind\u00edtom a Webpack fejleszt\u0151i szervert a h\u00e1tt\u00e9rben (ez a munkafolyamatom saj\u00e1toss\u00e1ga), \u00e9s futtatom a teszteket. <code>master<\/code>Ha szeretn\u00e9, hogy a repozit\u00f3rium\u00e1ban megjelenjenek a tesztlefedetts\u00e9ggel kapcsolatos jelv\u00e9nyek,<\/p>\n<p>Ha azt szeretn\u00e9, hogy a t\u00e1rol\u00f3j\u00e1ban tesztel\u00e9si k\u00f3dlefedetts\u00e9gi inform\u00e1ci\u00f3kat megjelen\u00edt\u0151 ikonok jelenjenek meg, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.taniarascia.com\/display-build-status-and-test-coverage\/\">itt<\/a><\/noindex> A Jest, Travis CI \u00e9s Coveralls haszn\u00e1lat\u00e1r\u00f3l egy r\u00f6vid \u00fatmutat\u00f3t tal\u00e1lhat.<\/p>\n<p>Teh\u00e1t itt van a f\u00e1jl tartalma <code>.travis.yml<\/code>:<\/p>\n<pre><code class=\"plaintext\"># \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044f\u0437\u044b\u043a\nlanguage: node_js\n\n# \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e Node.js\nnode_js:\n\u00a0\u00a0- '12'\n\nservices:\n\u00a0\u00a0# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 Docker\n\u00a0\u00a0- docker\n\ninstall:\n\u00a0\u00a0# \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\n\u00a0\u00a0- npm ci\n\nbefore_script:\n\u00a0\u00a0# \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\n\u00a0\u00a0- npm run dev &amp;\n\nscript:\n\u00a0\u00a0# \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b\n\u00a0\u00a0- npm run test<\/code><\/pre>\n<p>\nItt v\u00e9gz\u0151dnek azok a l\u00e9p\u00e9sek, amelyeket minden \u00e1gon \u00e9s pull k\u00e9r\u00e9sen v\u00e9grehajtunk.<\/p>\n<h3>\u258dTelep\u00edt\u00e9s<\/h3>\n<p>\nFelt\u00e9telezve, hogy minden automatiz\u00e1lt teszt sikeresen befejez\u0151d\u00f6tt, lehet\u0151s\u00e9g szerint telep\u00edthetj\u00fck a k\u00f3dot a produkci\u00f3s szerverre. Mivel ezt csak az \u00e1gb\u00f3l sz\u00e1rmaz\u00f3 k\u00f3dra szeretn\u00e9nk v\u00e9grehajtani, <code>master<\/code>, megadjuk a megfelel\u0151 utas\u00edt\u00e1sokat a telep\u00edt\u00e9si be\u00e1ll\u00edt\u00e1sokban. Miel\u0151tt megpr\u00f3b\u00e1ln\u00e1 haszn\u00e1lni a projektj\u00e9hez a k\u00f6vetkez\u0151 k\u00f3dr\u00e9szt, szeretn\u00e9k figyelmeztetni arra, hogy val\u00f3s telep\u00edt\u00e9si szkriptre van sz\u00fcks\u00e9ge.<\/p>\n<pre><code class=\"plaintext\">deploy:\n  # Docker kont\u00e9ner \u00f6ssze\u00e1ll\u00edt\u00e1sa \u00e9s k\u00fcld\u00e9s a Docker Hub-ra\n  provider: script\n  script: bash deploy.sh\n  on:\n    branch: master<\/code><\/pre>\n<p>\nA telep\u00edt\u00e9si szkript k\u00e9t feladatot l\u00e1t el:<\/p>\n<ul>\n<li>A k\u00e9p \u00f6ssze\u00e1ll\u00edt\u00e1sa, c\u00edmk\u00e9z\u00e9se \u00e9s a Docker Hub-ra val\u00f3 k\u00fcld\u00e9se CI eszk\u00f6z\u00f6k, eset\u00fcnkben a Travis CI seg\u00edts\u00e9g\u00e9vel.<\/li>\n<li>A k\u00e9p bet\u00f6lt\u00e9se a szerverre, a r\u00e9gi kont\u00e9ner le\u00e1ll\u00edt\u00e1sa \u00e9s az \u00faj ind\u00edt\u00e1sa (eset\u00fcnkben a szerver a DigitalOcean platformon m\u0171k\u00f6dik).<\/li>\n<\/ul>\n<p>\nEl\u0151sz\u00f6r is be kell \u00e1ll\u00edtani az automatikus folyamatot a k\u00e9p \u00f6ssze\u00e1ll\u00edt\u00e1s\u00e1hoz, c\u00edmk\u00e9z\u00e9s\u00e9hez \u00e9s Docker Hub-ra val\u00f3 k\u00fcld\u00e9s\u00e9hez. Mindez nagyon hasonl\u00f3 ahhoz, amit m\u00e1r manu\u00e1lisan csin\u00e1ltunk, kiv\u00e9ve, hogy itt sz\u00fcks\u00e9g van egy strat\u00e9gi\u00e1ra a k\u00e9pek egyedi c\u00edmk\u00e9inek hozz\u00e1rendel\u00e9s\u00e9re \u00e9s a bejelentkez\u00e9s automatiz\u00e1l\u00e1s\u00e1ra. Volt n\u00e9h\u00e1ny neh\u00e9zs\u00e9gem a telep\u00edt\u00e9si szkript egyes r\u00e9szleteivel, mint p\u00e9ld\u00e1ul a c\u00edmk\u00e9z\u00e9si strat\u00e9gia, a bejelentkez\u00e9s, az SSH kulcsok k\u00f3dol\u00e1sa \u00e9s az SSH kapcsolat l\u00e9trehoz\u00e1sa. De szerencs\u00e9re a bar\u00e1tom nagyon j\u00f3l \u00e9rti a bash-t, mint sok m\u00e1s dologhoz is. Seg\u00edtett nekem meg\u00edrni ezt a szkriptet.<\/p>\n<p>Teh\u00e1t a szkript els\u0151 r\u00e9sze a k\u00e9p Docker Hub-ra k\u00fcld\u00e9se. Ezt viszonylag egyszer\u0171en meg lehet val\u00f3s\u00edtani. Az \u00e1ltalam haszn\u00e1lt c\u00edmk\u00e9z\u00e9si s\u00e9ma a git hash \u00e9s a git c\u00edmke kombin\u00e1l\u00e1s\u00e1t felt\u00e9telezi, ha l\u00e9tezik. Ez biztos\u00edtja az egyedi c\u00edmke l\u00e9trehoz\u00e1s\u00e1t \u00e9s megk\u00f6nny\u00edti a kapcsol\u00f3d\u00f3 \u00e9p\u00edt\u00e9s azonos\u00edt\u00e1s\u00e1t. <code>DOCKER_USERNAME<\/code> \u00e9s <code>DOCKER_PASSWORD<\/code> \u2014 ezek k\u00f6rnyezeti v\u00e1ltoz\u00f3k, amelyeket a Travis CI fel\u00fclet\u00e9n be lehet \u00e1ll\u00edtani. A Travis CI automatikusan kezeli a titkos adatokat, biztos\u00edtva, hogy ne ker\u00fclhessenek illet\u00e9ktelen kezekbe.<\/p>\n<p>Ez teh\u00e1t a szkript els\u0151 r\u00e9sze <code>deploy.sh<\/code>.<\/p>\n<pre><code class=\"plaintext\">#!\/bin\/sh\nset -e # \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043e\u0448\u0438\u0431\u043e\u043a\n\nIMAGE=&quot;&lt;username&gt;\/&lt;repository&gt;&quot; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # \u041e\u0431\u0440\u0430\u0437 Docker\nGIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-\u0445\u044d\u0448 \u0438 \u0442\u0435\u0433\u0438\n\n# \u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u0430\ndocker build -t ${IMAGE}:${GIT_VERSION} .\ndocker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest\n\n# \u0412\u0445\u043e\u0434 \u0432 Docker Hub \u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u0430\necho &quot;${DOCKER_PASSWORD}&quot; | docker login -u &quot;${DOCKER_USERNAME}&quot; --password-stdin\ndocker push ${IMAGE}:${GIT_VERSION}<\/code><\/pre>\n<p>\nA m\u00e1sodik r\u00e9sz script teljesen att\u00f3l f\u00fcgg, hogy milyen hosztot haszn\u00e1l, \u00e9s hogyan van megszervezve a hozz\u00e1f\u00e9r\u00e9s. Az \u00e9n esetemben, mivel a Digital Ocean-t haszn\u00e1lom, a szerverhez a k\u00f6vetkez\u0151 parancsokat haszn\u00e1ljuk <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/digitalocean\/doctl\">doctl<\/a><\/noindex>. Az AWS-nal az <code>aws<\/code>eszk\u00f6zt fogjuk haszn\u00e1lni, \u00e9s \u00edgy tov\u00e1bb.<\/p>\n<p>A szerver be\u00e1ll\u00edt\u00e1sa nem volt k\u00fcl\u00f6n\u00f6sebben neh\u00e9z. Be\u00e1ll\u00edtottam egy dropletet, amely egy alapk\u00e9pre \u00e9p\u00fcl. Meg kell jegyeznem, hogy az \u00e1ltalam v\u00e1lasztott rendszer egyszeri k\u00e9zi Docker telep\u00edt\u00e9st \u00e9s egyszeri k\u00e9zi Docker elind\u00edt\u00e1st ig\u00e9nyel. A Docker telep\u00edt\u00e9s\u00e9hez az Ubuntu 18.04-et haszn\u00e1ltam, \u00edgy ha \u00f6n is Ubuntu-t haszn\u00e1l, ugyanazt k\u00f6nnyen megteheti, csak k\u00f6vesse <noindex><a rel=\"nofollow\" href=\"https:\/\/phoenixnap.com\/kb\/how-to-install-docker-on-ubuntu-18-04\">ez\u00e9rt<\/a><\/noindex> az egyszer\u0171 \u00fatmutat\u00f3t.<\/p>\n<p>Nem fogok konkr\u00e9t parancsokr\u00f3l besz\u00e9lni a szolg\u00e1ltat\u00e1shoz, mivel ez a szempont k\u00fcl\u00f6nb\u00f6z\u0151 esetekben jelent\u0151sen elt\u00e9rhet. Csak egy \u00e1ltal\u00e1nos l\u00e9p\u00e9s tervet fogok bemutatni, amelyet SSH kapcsolaton kereszt\u00fcl kell v\u00e9grehajtani a szerveren, ahol a projektet telep\u00edteni fogj\u00e1k:<\/p>\n<ul>\n<li>Meg kell tal\u00e1lni a jelenleg fut\u00f3 t\u00e1rol\u00f3t, \u00e9s le kell \u00e1ll\u00edtani.<\/li>\n<li>Ezut\u00e1n a h\u00e1tt\u00e9rben \u00faj t\u00e1rol\u00f3t kell ind\u00edtani.<\/li>\n<li>Be kell \u00e1ll\u00edtania a szerver helyi portj\u00e1t a k\u00f6vetkez\u0151 \u00e9rt\u00e9kre <code>80<\/code> \u2014 ez lehet\u0151v\u00e9 teszi, hogy a weboldalt az al\u00e1bbi m\u00f3don \u00e9rje el: <code>example.com<\/code>, port megad\u00e1sa n\u00e9lk\u00fcl, nem pedig olyan c\u00edmk\u00e9nt, mint <code>example.com:5000<\/code>.<\/li>\n<li>V\u00e9g\u00fcl el kell t\u00e1vol\u00edtania az \u00f6sszes r\u00e9gi t\u00e1rol\u00f3t \u00e9s k\u00e9pet.<\/li>\n<\/ul>\n<p>\nEz a script folytat\u00e1sa.<\/p>\n<pre><code class=\"plaintext\"># \u041d\u0430\u0439\u0442\u0438 ID \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\nCONTAINER_ID=$(docker ps | grep takenote | cut -d&quot; &quot; -f1)\n\n# \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439, \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443\ndocker stop ${CONTAINER_ID}\ndocker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}\ndocker system prune -a -f<\/code><\/pre>\n<p><\/p>\n<h2>N\u00e9h\u00e1ny dolog, amire \u00e9rdemes figyelni<\/h2>\n<p>\nLehets\u00e9ges, hogy amikor SSH-n kereszt\u00fcl csatlakozik a szerverhez a Travis CI-b\u0151l, figyelmeztet\u00e9st fog l\u00e1tni, amely megakad\u00e1lyozza a telep\u00edt\u00e9st, mert a rendszer a felhaszn\u00e1l\u00f3i interakci\u00f3ra v\u00e1r.<\/p>\n<pre><code class=\"plaintext\">A host '&lt;hostname&gt; (&lt;IP address&gt;)' hiteless\u00e9ge nem \u00e1llap\u00edthat\u00f3 meg.\nAz RSA kulcs ujjlenyomata: &lt;key fingerprint&gt;.\nBiztos benne, hogy folytatni akarja a kapcsol\u00f3d\u00e1st (igen\/nem)?<\/code><\/pre>\n<p>\nFelfedeztem, hogy a kulcsot base64 form\u00e1tumra is k\u00f3dolhatjuk, hogy olyan form\u00e1ban t\u00e1rolhassuk, amellyel k\u00e9nyelmesen \u00e9s biztons\u00e1gosan dolgozhatunk. A telep\u00edt\u00e9si szakaszban a nyilv\u00e1nos kulcsot dek\u00f3dolni lehet \u00e9s egy f\u00e1jlba r\u00f6gz\u00edteni <code>known_hosts<\/code> hogy megszabaduljon a fent eml\u00edtett hib\u00e1t\u00f3l.<\/p>\n<pre><code class=\"plaintext\">echo &lt;public key&gt; | base64 # ki\u00edrja &lt;public key, base64 form\u00e1tumban&gt;<\/code><\/pre>\n<p>\nA gyakorlatban ez a parancs \u00edgy n\u00e9zhet ki:<\/p>\n<pre><code class=\"plaintext\">echo \"123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom\/BWDSU\nGPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3\nPbv7kOdJ\/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK\/7XA\nt3FaoJoAsncM1Q9x5+3V0Ww68\/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw\/Pb0rwert\/En\nmZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z\/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx\nNrRFi9wrf+M7Q== you@example.com\" | base64<\/code><\/pre>\n<p>\n\u00cdme, hogyan n\u00e9z ki az, amit gener\u00e1l \u2014 egy base64 k\u00f3dol\u00e1s\u00fa sor:<\/p>\n<pre><code class=\"plaintext\">MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==<\/code><\/pre>\n<p>\nItt van a kor\u00e1bban eml\u00edtett parancs:<\/p>\n<pre><code class=\"plaintext\">install:\n\u00a0\u00a0- echo  | base64 -d &gt;&gt; $HOME\/.ssh\/known_hosts<\/code><\/pre>\n<p>\nUgyanezt a megk\u00f6zel\u00edt\u00e9st a priv\u00e1t kulccsal is alkalmazhatjuk a kapcsolat l\u00e9trehoz\u00e1sakor, mivel a szerverhez val\u00f3 hozz\u00e1f\u00e9r\u00e9shez sz\u00fcks\u00e9ge lehet a priv\u00e1t kulcsra. A kulcs haszn\u00e1lata sor\u00e1n csak annyit kell biztos\u00edtania, hogy biztons\u00e1gosan t\u00e1rold a Travis CI k\u00f6rnyezeti v\u00e1ltoz\u00f3j\u00e1ban, \u00e9s hogy sehol ne legyen ki\u00edrva.<\/p>\n<p>Egy m\u00e1sik dolog, amire figyelni \u00e9rdemes, hogy lehet, hogy az eg\u00e9sz deploy scriptet egyetlen sorban kell futtatni, p\u00e9ld\u00e1ul \u2014 a k\u00f6vetkez\u0151 haszn\u00e1lat\u00e1val: <code>doctl<\/code>Ez n\u00e9mi extra er\u0151fesz\u00edt\u00e9st ig\u00e9nyelhet.<\/p>\n<pre><code class=\"plaintext\">doctl compute ssh  --ssh-command \"minden parancs itt lesz &amp;&amp; itt\"<\/code><\/pre>\n<p><\/p>\n<h2>TLS\/SSL \u00e9s terhel\u00e9seloszt\u00e1s<\/h2>\n<p>\nMiut\u00e1n mindent megtettem, amir\u0151l eddig besz\u00e9ltem, az utols\u00f3 probl\u00e9ma, amivel szembes\u00fcltem, az volt, hogy a szervernek nem volt SSL-je. Mivel Node.js szervert haszn\u00e1lok, hogy m\u0171k\u00f6dj\u00f6n a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-secure-a-containerized-node-js-application-with-nginx-let-s-encrypt-and-docker-compose\">ford\u00edtott proxy Nginx \u00e9s a Let\u2019s Encrypt, el\u00e9g sokat kell bark\u00e1csolni.<\/a><\/noindex> Nginx ford\u00edtott proxy \u00e9s a Let\u2019s Encrypt, sokat kell vacakolni.<\/p>\n<p>Nem akartam manu\u00e1lisan be\u00e1ll\u00edtani az SSL-t, ez\u00e9rt egyszer\u0171en l\u00e9trehoztam egy terhel\u00e9seloszt\u00f3t, \u00e9s feljegyeztem az adatokat a DNS-ben. P\u00e9ld\u00e1ul a DigitalOcean eset\u00e9ben egy automatikusan friss\u00fcl\u0151 \u00f6nal\u00e1\u00edrt tan\u00fas\u00edtv\u00e1ny l\u00e9trehoz\u00e1sa a terhel\u00e9seloszt\u00f3n egyszer\u0171, ingyenes \u00e9s gyors folyamat. Ennek az elj\u00e1r\u00e1snak van egy tov\u00e1bbi el\u0151nye is, hogy ha sz\u00fcks\u00e9ges, nagyon egyszer\u0171en be\u00e1ll\u00edthat\u00f3 az SSL t\u00f6bb, a terhel\u00e9seloszt\u00f3 m\u00f6g\u00f6tt fut\u00f3 szerveren. Ez lehet\u0151v\u00e9 teszi, hogy maguk a szerverek egy\u00e1ltal\u00e1n ne \u201et\u00f6r\u0151djenek\u201d az SSL-lel, de a portot a megszokott m\u00f3don haszn\u00e1lj\u00e1k. <code>80<\/code>\u00cdgy az SSL be\u00e1ll\u00edt\u00e1sa a terhel\u00e9seloszt\u00f3n sokkal egyszer\u0171bb \u00e9s k\u00e9nyelmesebb, mint az alternat\u00edv SSL-be\u00e1ll\u00edt\u00e1si m\u00f3dszerek.<\/p>\n<p>Most minden olyan portot bez\u00e1rhatunk a szerveren, amely bej\u00f6v\u0151 kapcsolatokra fogad \u2014 kiv\u00e9ve a portot, <code>80<\/code>, amelyet a terhel\u00e9seloszt\u00f3val val\u00f3 kapcsolatra haszn\u00e1lunk, \u00e9s a <code>22<\/code> SSH sz\u00e1m\u00e1ra fenntartott portot. Ennek eredm\u00e9nyek\u00e9nt a szerver k\u00f6zvetlen el\u00e9r\u00e9s\u00e9re tett k\u00eds\u00e9rletek ezen k\u00e9t port kiv\u00e9tel\u00e9vel minden esetben meghi\u00fasulnak.<\/p>\n<h2>\u00d6sszegz\u00e9s<\/h2>\n<p>\nMiut\u00e1n elv\u00e9geztem mindazt, amir\u0151l ebben a cikkben besz\u00e9ltem, m\u00e1r nem ijedtem meg sem a Docker platformt\u00f3l, sem az automatiz\u00e1lt CI\/CD l\u00e1ncok koncepci\u00f3j\u00e1t\u00f3l. Be tudtam \u00e1ll\u00edtani egy folyamatos integr\u00e1ci\u00f3s l\u00e1ncot, amely sor\u00e1n a k\u00f3d tesztel\u00e9se t\u00f6rt\u00e9nik, miel\u0151tt \u00e9lesbe ker\u00fcl, \u00e9s automatikus k\u00f3dtelep\u00edt\u00e9s t\u00f6rt\u00e9nik a szerveren. Mindez m\u00e9g viszonylag \u00faj sz\u00e1momra, \u00e9s biztos vagyok benne, hogy l\u00e9teznek m\u00f3dok az automatiz\u00e1lt munkafolyamatom jav\u00edt\u00e1s\u00e1ra \u00e9s hat\u00e9konyabb\u00e1 t\u00e9tel\u00e9re. Ez\u00e9rt ha van javaslatod ez \u00fcgyben, k\u00e9rlek, <noindex><a rel=\"nofollow\" href=\"mailto:hello@taniarascia.com\">tudasd velem. Rem\u00e9lem, hogy ez a cikk seg\u00edtett nektek a dolgaikban. Szeretn\u00e9m hinni, hogy miut\u00e1n elolvast\u00e1tok, annyit tanultatok, mint \u00e9n, mik\u00f6zben minden olyan dologgal foglalkoztam, amir\u0151l besz\u00e9ltem benne.<\/a><\/noindex> A mi<\/p>\n<p><b>P.S.<\/b> rendszer\u00fcnkben van egy <noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/ru-rub\/marketplace#order\">marketplace-\u00fcnkben<\/a><\/noindex> , amely egy kattint\u00e1ssal telep\u00edthet\u0151. Ellen\u0151rizheti a kont\u00e9nerek m\u0171k\u00f6d\u00e9s\u00e9t a <noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/ru-rub\/marketplace\/docker#advantages\">Docker<\/a><\/noindex>. Minden \u00faj \u00fcgyf\u00e9l sz\u00e1m\u00e1ra ingyenesen biztos\u00edtunk 3 napos tesztel\u00e9si lehet\u0151s\u00e9get. <noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/\">VPS<\/a><\/noindex>Tisztelt olvas\u00f3ink!<\/p>\n<p><b>Haszn\u00e1lj\u00e1tok a CI\/CD technol\u00f3gi\u00e1kat a projektjeitekben?<\/b> RabbitMQ. 1. r\u00e9sz. Bevezet\u00e9s. Erlang, AMQP<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/ru-rub\/#order\"><img decoding=\"async\" alt=\"CI\/CD l\u00e1ncolat l\u00e9trehoz\u00e1sa \u00e9s a Docker munkafolyamatok automatiz\u00e1l\u00e1sa\" src=\"\/wp-content\/uploads\/2020\/02\/3fbfa90ea56a3d9b6b89ba945eb94570.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/488668\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u043c\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0430\u0439\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 90-\u0445. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u0411\u044b\u043b Apache-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u0431\u0449\u0435\u043c \u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0435, \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043e\u0439\u0442\u0438 \u043f\u043e FTP, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0435\u0447\u0442\u043e \u0432\u0440\u043e\u0434\u0435 ftp:\/\/ftp.example.com. \u041f\u043e\u0442\u043e\u043c \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u043c\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440. \u0414\u0440\u0443\u0433\u0438\u0435 \u0431\u044b\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u0432\u0441\u0451 \u0442\u043e\u0433\u0434\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":69352,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-69351","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=\"\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u043c\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0430\u0439\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 90-\u0445. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e.\" \/>\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\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker\" \/>\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\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 CI\/CD-\u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Docker | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u043c\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0430\u0439\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 90-\u0445. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker\" \/>\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=\"2020-02-18T11:44:06+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:15:00+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\udd47A CI\/CD l\u00e1nc l\u00e9trehoz\u00e1sa \u00e9s a Docker automatiz\u00e1l\u00e1sa | ProHoster","description":"\ud83e\udd47CI\/CD l\u00e1nc l\u00e9trehoz\u00e1sa \u00e9s a Docker automatikus haszn\u00e1lata | ProHoster","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker","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\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 CI\/CD-\u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Docker | ProHoster","og:description":"\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u043c\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0430\u0439\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 90-\u0445. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/sozdanie-ci-cd-czepochki-i-avtomatizacziya-raboty-s-docker","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":"2020-02-18T11:44:06+00:00","article:modified_time":"2020-03-03T13:15:00+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"69351","title":null,"description":null,"keywords":null,"keyphrases":{"focus":[],"additional":[]},"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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:24:45","updated":"2026-08-11 12:50: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\/69351","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=69351"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/69351\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/69352"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=69351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=69351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=69351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}