Kuidas jaotada olemasolev rakendus Dockeriga konteineritesse

Hong Kong, autor Marci Marc

Olen lõpuks õppinud, kuidas kasutada Dockerit, kui on juba teadlik sellest, mis see on ja mis see on, ilma et seda kunagi kasutataks. See on esimene postitus, milles olen proovinud Dockerit kasutada ja tõenäoliselt on see see, millele ma viitan, kui ma uut projekti alustan (Java või Kotlinile ikkagi).

See on lühike postitus, mis võtab olemasoleva projekti (ühest minu teisest postitusest) ja muudab seda nii, et see saaks konteinerites ringi joosta. Projekt on Spring Boot rakendus koos MongoDB andmebaasi ja ActiveMQ sõnumite järjekorraga. Kõik need komponendid on põhisööt konteineritesse viimiseks.

Selles postituses kirjeldatud toimingute lõpuleviimine eemaldab vajaduse MongoDB ja ActiveMQ kohaliku installi järele. Installige lihtsalt Docker ja teil on hea minna. See iseenesest on minu raamatutes juba võit.

Siin on lingid koodile ja vastavale blogipostitusele. Postitus sisaldab kogu teavet koodi kohta.

Viimane kommentaar: selle postituse sisu puhul eeldan, et olete Dockeri juba installinud. Kui te seda ei tee, on Docker teid juba kaetud. Siit leiate toetatud platvormid, mis pakuvad täiendavaid linke selle kohta, kuidas teie konkreetsesse masinasse Docker installida. Abiks võib olla ka Dockeri pakutav orientatsiooni- ja seadistusleht.

Kevadise rakenduse teisendamine

Esiteks, rakendus Spring Boot.

See on projekti ainus osa, mis sisaldab meie koodi. Ülejäänud on kellegi teise hoidlast alla laaditud pildid. Selle rakenduse liigutamiseks konteineris käivitamiseks peame looma Docker-faili, mis täpsustab pildi sisu:

See võtab openjdk-i aluspildi: 8-jdk-alpine. See on hea lähtepunkt rakendusele. See lisab rakenduskoodist ehitatud Jar (nimetades seda rakenduseks.jar) ja paljastab porti konteinerite vaheliseks suhtluseks. Viimane rida määratleb käsu, mis täideti pildi konteineris käitamisel. Just sellega algab kevadine taotlus.

Kujutise loomiseks Dockerfile'ist käivitage järgmine käsk (eeldusel, et olete juba rakenduse koodi ehitanud):

doki ehitamise -t vedru-alglaadimise-jms-õpetus.

Nüüd on pilt nimega spring-boot-jms-tutorial (-t võimaldab meil nime määratleda). Seda saab nüüd kasutada konteineri loomiseks, mis käivitab pildi Jarisse pakitud koodi:

doki käitamine - nimerakendus -p 4000: 8080 spring-boot-jms-tutorial

See loob ja käivitab paketi spring-boot-jms-tutorial üles ehitatud konteineri. See nimetab konteinerirakenduse ja omadus -p võimaldab kohaliku masina pordi kaardistada konteineri sisese porti. Konteineri pordi 8080 juurde pääsemiseks peame lihtsalt kasutama pordi 4000 omaenda masinas.

Kui peatame selle konteineri ja tahame seda uuesti käivitada, peaksime kasutama käsku:

doki käivitamise rakendus

Kus rakendus on varem loodud konteineri nimi. Kui doki käitust uuesti kasutataks, loob see olemasoleva taaskasutamise asemel uue uue konteineri. Kuna me andsime konteinerile nime, põhjustab sama käsu käitamine varasematest vea.

Nüüd töötab kevadine rakendus edukalt konteineris, kuid logid ei näe eriti head välja. Vaatame kiiresti, et saaksime teada, mida peame järgmisena tegema.

MongoDB-ühenduse tõrge:

Erand monitori niidil serveri mongokonteineriga ühendamisel: 27017 com.mongodb.MongoSocketException: mongocontainer: nimi ei lahene aadressil com.mongodb.ServerAddress.getSocketAddress (ServerAddress.java:188) ~ [mongodb-driver-core-3.6.4. purk! /: na] aadressil com.mongodb.connection.SocketStreamHelper.initialize (SocketStreamHelper.java:59) ~ [mongodb-driver-core-3.6.4.jar! /: na] at com.mongodb.connection.SocketStream. avatud (SocketStream.java:57) ~ [mongodb-driver-core-3.6.4.jar! /: na] com.mongodb.connection.InternalStreamConnection.open (InternalStreamConnection.java:126) ~ [mongodb-driver-core -3.6.4.jar! /: Na] aadressil com.mongodb.connection.DefaultServerMonitor $ ServerMonitorRunnable.run (DefaultServerMonitor.java:114) ~ [mongodb-driver-core-3.6.4.jar! /: Na] javas .lang.Thread.run (Thread.java:748) [ei: 1.8.0_171] Põhjus: java.net.UnknownHostException: mongocontainer: Nimi ei lahene java.net.Inet4AddressImpl.lookupAllHostAddr (algne meetod) ~ [ei : 1.8.0_171] aadressil java.net.InetAddress $ 2.lookupA llHostAddr (InetAddress.java:928) ~ [ei: 1.8.0_171] aadressil java.net.InetAddress.getAddressesFromNameService (InetAddress.java:1323) ~ [na: 1.8.0_171] java.net.InetAddress.getAllByName0 (InetAddress.getAllByName0). java: 1276) ~ [na: 1.8.0_171] aadressil java.net.InetAddress.getAllByName (InetAddress.java:1192) ~ [na: 1.8.0_171] java.net.InetAddress.getAllByName (InetAddress.java:1126) ~ [ei: 1.8.0_171] aadressil java.net.InetAddress.getByName (InetAddress.java:1076) ~ [na: 1.8.0_171] aadressil com.mongodb.ServerAddress.getSocketAddress (ServerAddress.java:186) ~ [mongodb- driver-core-3.6.4.jar! /: ei] ... 5 ühist kaadrit on ära jäetud

ActiveMQ-d pole ka seal:

JMS-ühendust ei õnnestunud värskendada sihtpunkti „OrderTransactionQueue” jaoks - uuesti proovimine, kasutades FixedBackOff {intervall = 5000, currentAttempts = 1, maxAttempts = piiramatu}. Põhjus: maakleri URL-iga ei saanud ühendust: tcp: // activemqcontainer: 61616. Põhjus: java.net.UnknownHostException: activemqcontainer

Me sorteerime need järgmistes osades välja, et rakendus saaks töötada täies mahus.

Viimane asi enne Mongo ja ActiveMQ vaatamist.

Dockerfile-maven-pluginat võiks kasutada ka ülaltoodud abistamiseks, mis loob konteineri osana mvn installimisest. Valisin selle mitte kasutada, kuna mul ei õnnestunud seda doki-komponeerimisega korralikult töötada. Allpool on kiire näide pistikprogrammi kasutamisest:

See võimaldab meil asendada mõned Dockerfile'i read:

Siin on lisatud üks rida ja üks olemasolev rida on muudetud. JAR_FILE argument asendab jari algse nime, mille pistikprogramm on sisestanud pom.xml-st. Tehke need muudatused ja käivitage mvn install ja bam, teie konteiner on ehitatud koos kogu vajaliku koodiga.

MongoDB pildi kasutamine

MongoDB pilt on valmis ja ootab meid kasutamist. Ideaalis kannab see nime mongo… Mida sa veel ootasid? Peame ainult pildi käitama ja andma konteinerile nime:

dokk run -d - nimi mongocontainer mongo

-D lisamisel käivitatakse konteiner taustal. Konteineri nimi pole ainult mugavuse huvides, kuna kevadine rakendus vajab seda hiljem Mongoga ühenduse loomiseks.

ActiveMQ-pildi peale

ActiveMQ seadistamine on sama lihtne kui Mongol. Käivitage järgmine käsk:

doki käivitamine -d - nimi Activemqkonteiner -p 8161: 8161 rmohr / activemq

Siin kaardistatakse 8161 pordid konteineri ja masina vahel, kus see töötab, võimaldades administraatori konsoolile juurdepääsu väljaspool konteinerit.

Sidudes selle kõik kokku

Kui olete postituse läbi lugenud kõiki neid käske, oleksite märganud, et rakenduse konteineris pole tegelikult näha mongokonteinerit ja aktiivset mqkonteinerit. Selle põhjuseks on asjaolu, et need ei tööta samas võrgus. Nendega suhelda pole keeruline ja selleks on vaja vaid mõnda täiendavat sammu.

Vaikimisi loob Docker ühenduse seadistamisel sillavõrgu ilma täiendava konfiguratsioonita. Allpool on kirjas, kuidas seda teha:

doki võrk looge võrk

Nüüd, kui võrk (nimega võrk) on loodud, tuleb varem käitatud käske muuta, et luua konteinerid, mis ühenduvad selle asemel võrguga. Allpool on 3 käsku, mida kasutati eelmistes sektsioonides konteinerite loomiseks, igaüks neist muudeti võrguga liitumiseks.

doki run -d - nimi mongocontainer --network = võrgu mongo
doki käitamine -d - nimi activemqcontainer -p 8161: 8161 --network = network rmohr / activemq
doki käitamine - nimerakendus -p 4000: 8080 - võrk = võrgu kevad-alglaadimise-jms-õpetus

Kui need kõik käivitatakse, töötab nüüd rakendus tervikuna. Iga konteiner näeb üksteist. Rakenduse konteineril ühenduse loomine vastavates konteinerites MongoDB ja ActiveMQ-ga.

Sel hetkel kõik töötab. See töötab samamoodi, kui ma mäletan, et see töötas, kui mul oli kõik oma sülearvuti üles seatud. Kuid seekord ei seata midagi kohapeal paika ... Välja arvatud Docker!

Dokker koostab selle

Oleksime võinud seal peatuda, kuid see järgmine jagu teeb kõik jooksmise veelgi lihtsamaks. Docker Compose võimaldab meil tõhusalt koondada kõik käsud, mida varem jooksime, ja käivitada kõik konteinerid ja nende võrk ühe käsuga. Seadistamist on veel natuke, kuid lõpuks ma arvan, et kirjutamise hulk tegelikult väheneb.

Selleks peame looma faili docker-compose.yml:

Kasutage koos selle Dockerfile'i versiooniga:

See on peaaegu kõik, mis tuleb ära teha.

appcontainer on projekti koodist ehitatud kevadine rakenduste konteiner. Konteineri ehitusomadus käsib Dockeril pildi üles ehitada projekti juurkataloogist leitud projektide põhjal, mille Dockerfile leiab. See edastatakse JAR_FILE argumendis Dockerfile, teisaldades mõned konfiguratsioonid sellesse faili.

Kaks muud konteinerit ei vaja palju seadistusi. Nagu eelnevate käskude puhul, täpsustatakse ka need pildid, millest need on ehitatud ja activemqcontainer lisab selle kaardistatud portide ümber konfiguratsiooni.

Viimane seadistustükk toimub taustal. Loodud on võrk ja kõik konteinerid lisatakse sellele. See eemaldab vajaduse võrgu käsitsi loomiseks.

Jääb vaid üleval käsu käivitada:

dokkija-komponeerima

See ehitab ja töötab kõik konteinerid. Rakenduse koodipilt luuakse vajadusel. Selle täpse käsu käitamisel väljastatakse kõik konteinerite logid konsooli, selleks lisage taustal taust -d:

dokkija-koosta üles -d

Pärast seda saate vaadata loodud konteinereid ja võrku. Jooks:

dokk ps - - vorming "tabel {{.Image}} \ t {{. Nimed}}"

Näitab meile:

PILDI NIMED
mongo spring-boot-jms_mongocontainer_1
spring-boot-jms_appcontainer spring-boot-jms_appcontainer_1
rmohr / activemq spring-boot-jms_activemqcontainer_1

Ja võrk:

dokkerivõrk ls

Toodab:

VÕRGU ID NIMI DRIVERI ULATUS
163edcfe5ada spring-boot-jms_default bridge local

Konteinerite ja võrgu nimed on ette nähtud projekti nimega.

Järeldus

See on kõik, mis selleks olemas ... lihtsaks seadistamiseks ikkagi. Olen kindel, et Dockeri jumalad võiksid veel palju ära teha, kuid ma ei kuulu nende hulka ... Ometi.

Kokkuvõtteks võtsime olemasoleva rakenduse, mille ma kirjutasin, et töötada kohapeal masina peal ja surusin kõik mõneks konteineriks. See tähendas, et läksime masinast, kus oli vaja kõik seadistatud (nii MongoDB kui ka ActiveMQ installitud), masinasse, mis suudaks konteinerite abil kõik selle vahele jätta ja vajaks ainult Dockeri installimist. Seejärel haldab Docker kõiki meie jaoks sõltuvusi.

Vaatasime, kuidas teisaldada rakenduse iga osa konteinerisse ja sidusime seejärel kõik koos Docker Compose'iga. Jättes meid selle kõige lõpuks ühe käsuga, mis võib meid liikuda absoluutselt mitte millestki kõigest, mida on vaja rakenduse käivitamiseks.

Selles postituses kasutatud koodi leiate minu GitHubist.

Kui leidsite, et sellest postitusest oleks abi, saate minu uute postitustega kursis hoidmiseks jälgida mind Twitteris aadressil @LankyDanDev.

Minu postitustest leitavad arvamused ja vaated on minu enda arvamused ja ei esinda Accenture'i seisukohti ühelgi teemal. Vaata kõiki Dan Newtoni postitusi

Algselt avaldati veebisaidil saidil vietnants vietnaildanblog.com 2. septembril 2018.