Për kërkesën tonë, Habr krijoi një Hub dhe na bën të kënaqur të publikojmë postimin e parë aty. Abonohuni!
Kubernetes është e thjeshtë. Pse bankat po më paguajnë shumë para për punën time në këtë fushë, ndërsa çdo kush mund ta zotërojë këtë teknologji për disa orë?
NĂ«se dyshoni se Kubernetes mund tĂ« mĂ«sohet kaq shpejt - ju sugjeroj ta provoni vetĂ«. Duke zotĂ«ruar kĂ«tĂ« material, do tĂ« jeni nĂ« gjendje tĂ« drejtoni njĂ« aplikacion tĂ« bazuar nĂ« mikroshĂ«rbime nĂ« njĂ« grup Kubernetes. Mund ta garantoj, pasi kjo metodologji qĂ« pĂ«rdoret kĂ«tu Ă«shtĂ« ajo qĂ« pĂ«rdor pĂ«r tĂ« mĂ«suar klientĂ«t tanĂ« pĂ«r Kubernetes. ĂfarĂ« e dallon kĂ«tĂ« udhĂ«zues nga tĂ« tjerĂ«t? NĂ« tĂ« vĂ«rtetĂ«, shumĂ« gjĂ«ra. Shumica e materialeve tĂ« tilla fillojnĂ« me shpjegimin e gjĂ«rave tĂ« thjeshta - koncepteve tĂ« Kubernetes dhe veçorive tĂ« komandĂ«s kubectl. AutorĂ«t e kĂ«tyre materialeve e supozojnĂ« se lexuesi i tyre Ă«shtĂ« i njohur me zhvillimin e aplikacioneve, me mikroshĂ«rbimet dhe me kontejnerĂ«t Docker. Ne do tĂ« ndjekim njĂ« rrugĂ« tjetĂ«r. Fillimisht do tĂ« tregojmĂ« se si tĂ« drejtoni nĂ« kompjuter njĂ« aplikacion tĂ« bazuar nĂ« mikroshĂ«rbime. Pastaj do tĂ« shqyrtojmĂ« ndĂ«rtimin e imazheve tĂ« kontejnerĂ«ve pĂ«r çdo mikroshĂ«rbim. VetĂ«m pas kĂ«saj do tĂ« njohim Kubernetes dhe do tĂ« shqyrtojmĂ« depozitimin e njĂ« aplikacioni tĂ« bazuar nĂ« mikroshĂ«rbime nĂ« njĂ« grup tĂ« menaxhuar nga Kubernetes.
Ky qasje, me një afrim gradual drejt Kubernetes, do të ofrojë një thellësi kuptimi të nevojshme për një njeri të zakonshëm për të kuptuar se si gjithçka është e thjeshtë në Kubernetes. Kubernetes është, pa dyshim, një teknologji e thjeshtë, për sa kohë që i është e njohur atij që dëshiron ta zotërojë, ku dhe si përdoret.
Tani, pa fjalë të panevojshme, le të fillojmë punën dhe të flasim për aplikacionin me të cilin do të punojmë.
Aplikacioni eksperimental
Aplikacioni ynë do të kryejë vetëm një funksion. Pranon, si të dhëna hyrëse, një fjali, dhe më pas, duke përdorur mjete analize teksti, realizon një analizë sentimenti (sentiment analysis) të kësaj fjale, duke marrë një vlerësim të qëndrimit emocional të autorit të fjalës ndaj një objekti të caktuar.
Kështu duket dritarja kryesore e këtij aplikacioni.

Aplikacioni në web për analizimin e tonit të teksteve
Nga një pikëpamje teknike, aplikacioni përbëhet nga tre mikroshërbime, secili nga të cilat zgjidh një grup të caktuar detyrash:
- SA-Frontend â serveri web Nginx qĂ« shĂ«rben skedarĂ«t statikĂ« tĂ« React.
- SA-WebApp â aplikacioni web i shkruar nĂ« Java, i cili pĂ«rpunon kĂ«rkesat nga frontend-i.
- SA-Logic â njĂ« aplikacion Python qĂ« ekzekuton analizĂ«n e tonit tĂ« tekstit.
ĂshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet qĂ« mikroshĂ«rbimet nuk ekzistojnĂ« nĂ« izolim. Ato realizojnĂ« idenĂ« e "ndarjes sĂ« detyrave", por, gjithashtu, duhet tĂ« bashkĂ«punojnĂ« me njĂ«ra-tjetrĂ«n.

Flukset e të dhënave në aplikacion
Në diagramin e mësipërm, mund të shihni etapat e numëruara të funksionimit të sistemit, që ilustrojnë flukset e të dhënave në aplikacion. Le të analizojmë ato:
- Shfletuesi i kërkon serverit një skedar
index.html(i cili, nga ana e tij, shkarkon paketën e aplikacionit React). - Përdoruesi ndërvepron me aplikacionin, çka shkakton një kërkesë për aplikacionin web të bazuar në Spring.
- Aplikacioni web redirekton kërkesën për ekzekutimin e analizës së tekstit tek aplikacioni Python.
- Aplikacioni Python kryen analizën e tonit të tekstit dhe kthen rezultatin si përgjigje ndaj kërkesës.
- Aplikacioni Spring dërgon përgjigjen në aplikacionin React (i cili, nga ana e tij, tregon rezultatin e analizës së tekstit për përdoruesin).
Kodi për të gjithë këto aplikacione mund të gjendet . Ju rekomandoj ta kopjoni këtë depoishëm tani, pasi na presin eksperimentime interesante me të.
Nisja e aplikacionit të bazuar në mikroshërbime në kompjuterin lokal
PĂ«r tĂ« bĂ«rĂ« qĂ« aplikacioni tĂ« funksionojĂ«, na nevojitet tĂ« nisim tĂ« tre mikroshĂ«rbimet. Le tĂ« fillojmĂ« me aplikacionin mĂ« simpatik tĂ« tĂ« gjithĂ«ve â aplikacionin frontend.
âKonfigurimi i React pĂ«r zhvillimin lokal
Për të nisur aplikacionin React, ju nevojitet të instaloni në kompjuterin tuaj platformën Node.js dhe NPM. Pas instalimit të të gjitha këtyre, kaloni me terminal në folderin e projektit sa-frontend dhe ekzekutoni komandën e mëposhtme:
npm install Duke ekzekutuar këtë komandë, në folderin node_modules do të shkarkohen varësitë e aplikacionit React, të cilat janë regjistruar në skedarin package.json. Pasi të përfundojë shkarkimi i varësive, në të njëjtin folder ekzekutoni komandën e tillë:
npm start Ja ku jemi. Tani aplikacioni React është nisur, dhe për të hyrë në të, mund të kaloni në shfletues në adresën localhost:3000. Mund të bëni ndonjë ndryshim në kodin e tij. Efekti i këtyre ndryshimeve do ta shihni menjëherë në shfletues. Kjo është e mundur falë asaj që quhet zëvendësim "nxehtë" i moduleve. Falë kësaj, zhvillimi i frontend-it bëhet një aktivitet i thjeshtë dhe të këndshëm.
â PĂ«rgatitja e aplikacionit React pĂ«r prodhim
Për qëllime të përdorimit të vërtetë të aplikacionit React, na nevojitet ta konvertojmë në një grup skedarësh statikë dhe t'i dorëzojmë ata klientëve, duke përdorur një server web.
Për të ndërtuar aplikacionin React, sërish, duke përdorur terminalin, kaloni në dosjen sa-frontend dhe ekzekutoni komandën e mëposhtme:
npm run build Kjo do të çojë në krijimin e një direktorie në dosjen e projektit build. Në të do të gjenden të gjitha skedaret statikë që janë të nevojshme për funksionimin e aplikacionit React.
â ShĂ«rbimi i skedarĂ«ve statikĂ« me Nginx
Së pari duhet të instaloni dhe të nisni serverin web Nginx. mund ta shkarkoni dhe të gjeni udhëzimet për instalimin dhe nisjen e tij. Më pas duhet të kopjoni përmbajtjen e dosjes sa-frontend/build në folderin [your_nginx_installation_dir]/html.
Me këtë qasje, skedari i gjeneruar gjatë procesit të ndërtimit të aplikacionit React index.html do të jetë i aksesueshëm në adresën [your_nginx_installation_dir]/html/index.html. Ky është skedari që, sipas parazgjedhjes, serveri Nginx e ofron kur i drejtohesh. Serveri është i konfiguruar për të dëgjuar në portin 80, por mund të konfigurohet siç dëshironi, duke modifikuar skedarin [your_nginx_installation_dir]/conf/nginx.conf.
Tani hapni shfletuesin dhe shkoni në adresën localhost:80. Do të shihni faqen e aplikacionit React.

Aplikacioni React, i shërbyer nga serveri Nginx
NĂ«se tani shkruani ndonjĂ« gjĂ« nĂ« fushĂ«n Type your sentence dhe klikoni butonin Send â nuk do tĂ« ndodhĂ« asgjĂ«. Por, nĂ«se e shikoni konsolĂ«n, atje mund tĂ« shihni mesazhe gabimi. PĂ«r tĂ« kuptuar se ku ndodhin kĂ«to gabime, le t'i ndjekim kodin e aplikacionit.
â Analiza e kodit tĂ« aplikacionit frontend
Duke parĂ« kodin e skedarit App.js, mund tĂ« shohim se klikimi nĂ« buton Send thĂ«rret metodĂ«n analyzeSentence(). Kodi i kĂ«saj metode Ă«shtĂ« i dhĂ«nĂ« mĂ« poshtĂ«. NĂ« tĂ« njĂ«jtĂ«n kohĂ«, vini re se çdo rresht qĂ« ka njĂ« koment tĂ« tillĂ« # ĐĐŸĐŒĐ”Ń, ka njĂ« shpjegim tĂ« dhĂ«nĂ« poshtĂ« kodit. NĂ« tĂ« njĂ«jtĂ«n mĂ«nyrĂ« do tĂ« analizojmĂ« dhe segmentet e tjera tĂ« kodit.
analyzeSentence() {
   fetch('http://localhost:8080/sentiment', {  // #1
       method: 'POST',
       headers: {
           'Content-Type': 'application/json'
       },
       body: JSON.stringify({
                      sentence: this.textField.getValue()})// #2
   })
       .then(response => response.json())
       .then(data => this.setState(data));  // #3
}1. URL ku të cilës bëhet kërkesa POST. Supozohet se në këtë adresë ndodhet një aplikacion që pret kërkesa të tilla.
2.Trupi i kërkesës që i dërgohet aplikacionit. Ja një shembull i trupit të kërkesës:
{
   sentence: "Më pëlqen yogobella!"
} 3.Pasi merrni një përgjigje për kërkesën, përditësohet gjendja e komponentit. Kjo shkakton rindizjen e komponentit. Nëse marrim të dhëna (pra, një objekt JSON që përmban të dhënat e futur dhe vlerësimin e llogaritur të tekstit), do ta shkruajmë komponentin Polarity, pasi do të përmbushen kushtet përkatëse. Këtu është si e përshkruajmë komponentin:
const polarityComponent = this.state.polarity !== undefined ?
   :
   null; Kodi duket se funksionon mirë. Por çfarë nuk është në rregull? Nëse supozoni se në atë adresë ku aplikacioni përpiqet të dërgojë kërkesën POST, nuk ka asgjë që mund ta pranojë dhe ta përpunojë këtë kërkesë, do jeni plotësisht në të drejtat tuaja. Pikërisht, për të përpunuar kërkesat që vijnë në adresën http://localhost:8080/sentiment, na nevojitet një aplikacion web, të bazuar në Spring.

Na nevojitet një aplikacion Spring që të pranojë kërkesën POST
âKonfigurimi i aplikacionit web, tĂ« bazuar nĂ« Spring
Për të instaluar një aplikacion Spring, ju nevojitet JDK8 dhe Maven dhe variablat e mjedisit të konfiguruar siç duhet. Pasi të keni instaluar gjithçka, mund të vazhdoni me punën mbi projektin tonë.
âPaketa e aplikacionit nĂ« njĂ« skedar jar
Shkoni, me ndihmën e terminalit, në dosjen sa-webapp dhe shtypni komandën në vazhdim:
mvn install Pas ekzekutimit tĂ« kĂ«saj komande, do tĂ« krijohet njĂ« direktore nĂ« dosjen sa-webapp Atje do tĂ« ndodhet aplikacioni Java, i paketuar nĂ« skedarin jar, i pĂ«rfaqĂ«suar nga skedari targetsentiment-analysis-web-0.0.1-SNAPSHOT.jar âNisja e aplikacionit Java.
Shkoni në dosjen
dhe nisni aplikacionin me komandën në vazhdim: target java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar
Gjatë ekzekutimit të kësaj komande do të ndodhë një gabim. Për të filluar zgjidhjen e saj, mund të analizoni informacionet mbi përjashtimin në të dhënat e gjurmimit të stackut:Gjatë ekzekutimit të kësaj komande do të ndodhë një gabim. Për të filluar zgjidhjen e tij, mund të analizojmë informacionin mbi përjashtimin në të dhënat e gjurmimit të stack-ut:
Gabimi në krijimin e bean me emrin 'sentimentController': Injekcioni i varësive të autowire nuk kishte sukses; përjashtimi i përfshirë është java.lang.IllegalArgumentException: Nuk mund të zgjidhte vendin e rezervuar 'sa.logic.api.url' në vlerën "${sa.logic.api.url}" Për ne, këtu gjëja më e rëndësishme është përmendja e pamundësisë për të zbuluar vlerën sa.logic.api.url. Do të analizojmë kodin, në të cilin ndodh gabimi.
âAnaliza e kodit Java-aplikacionit
Ja një fragment i kodit, në të cilin ndodh gabimi.
@CrossOrigin(origins = "*")
@RestController
public class SentimentController {
   @Value("${sa.logic.api.url}")    // #1
   private String saLogicApiUrl;
   @PostMapping("/sentiment")
   public SentimentDto sentimentAnalysis(
       @RequestBody SentenceDto sentenceDto)
   {
       RestTemplate restTemplate = new RestTemplate();
       return restTemplate.postForEntity(
               saLogicApiUrl + "/analyse/sentiment",    // #2
               sentenceDto, SentimentDto.class)
               .getBody();
   }
}- NĂ« S
entimentControllerka një fushësaLogicApiUrl. Vlera e tij përcaktohet nga pronësiasa.logic.api.url. - String
saLogicApiUrlkonkatenohet me vlerën/analyse/sentiment. Së bashku, ato formojnë adresën për kryerjen e thirrjes në mikroshërbimin që kryen analizën e tekstit.
âCaktimi i vlerĂ«s sĂ« pronĂ«s
Në Spring, burimi standard i vlerave të pronave është skedari application.properties, i cili mund të gjendet në adresën sa-webapp/src/main/resources. Por përdorimi i tij nuk është mënyra e vetëm për të caktuar vlera pronash. Kjo mund të bëhet edhe përmes komandës së mëposhtme:
java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=ĂFARĂ.ĂSHTĂ.SA.LOGIC.API.URLVlera e kĂ«saj prona duhet tĂ« tregojĂ« adresĂ«n e aplikacionit tonĂ« Python.
Duke e konfiguruar atë, ne i tregojmë aplikacionit web Spring se ku duhet të drejtohet për të kryer kërkesat për analizë teksti.
Për të mos e komplikuar jetën, do të vendosim që aplikacioni Python të jetë i aksesueshëm në adresën localhost:5000 dhe do të përpiqemi ta mbajmë në mend. Si rezultat, komanda për të nisur aplikacionin Spring do të duket kështu:
java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=http://localhost:5000 
Sistemi ynë i mungon aplikacioni Python.
Tani na mbetet vetëm të nisim aplikacionin Python dhe sistemi do të funksionojë si pritej.
âCaktimi i aplikacionit Python
Për të nisur aplikacionin Python, duhet të keni instaluar Python 3 dhe Pip, dhe duhet të jenë të konfiguruara siç duhet variablat përkatës të mjedisit.
âInstalimi i varĂ«sive
Shkoni në dosjen e projektit sa-logic/sa dhe kryeni këto komanda:
python -m pip install -r requirements.txt
python -m textblob.download_corporaâNisja e aplikacionit
Pas instalimit të varësive, jemi të gatshëm për të nisur aplikacionin:
python sentiment_analysis.pyPas ekzekutimit të kësaj komande, do të njoftohemi për këtë:
* Po punon në http://0.0.0.0:5000/ (Shtypni CTRL+C për të mbyllur) Kjo do të thotë se aplikacioni është aktiv dhe pret kërkesa në adresën localhost:5000/
âKĂ«rkimi i kodit
Le të shqyrtojmë kodin e aplikacionit Python për të kuptuar se si reagon ndaj kërkesave:
from textblob import TextBlob
from flask import Flask, request, jsonify
app = Flask(__name__) #1
@app.route("/analyse/sentiment", methods=['POST']) #2
def analyse_sentiment():
sentence = request.get_json()['sentence'] #3
polarity = TextBlob(sentence).sentences[0].polarity #4
return jsonify( #5
sentence=sentence,
polarity=polarity
)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000) #6- Inicializimi i objektit
Flask. - Caktimi i adresës për të kryer kërkesat POST ndaj saj.
- Ekstraktimi i pronës
sentencenga trupi i kërkesës. - Inicializimi i objektit anonim
TextBlobdhe marrja e vlerëspolaritypër propozimin e parë që ka ardhur në trupin e kërkesës (në këtë rast është një propozim i vetëm që po dërgohet për analizë). - Kthimi i përgjigjes, në trupin e së cilës përmban tekstin e propozimit dhe treguesin e llogaritur për të.
polarity. - Nisja e aplikacionit Flask, i cili do të jetë i aksesueshëm në adresën
0.0.0.0:5000(mund të aksesoni atë edhe me një strukturë të tillë silocalhost:5000).
Tani mikroshërbimet, përbërëse të aplikacionit, janë aktivizuar. Ato janë të konfiguruara për të bashkëvepruar me njëra-tjetrën. Kështu duket skema e aplikacionit në këtë fazë të punës.

Të gjitha mikroshërbimet, përbërëse të aplikacionit, janë vënë në një gjendje funksionale.
Tani, para se tĂ« vazhdojmĂ«, hapni aplikacionin React nĂ« shfletues dhe provoni tĂ« analizoni njĂ« propozim me tĂ«. NĂ«se gjithçka Ă«shtĂ« bĂ«rĂ« siç duhet â pas klikimit tĂ« butonit Send do tĂ« shihni rezultatet e analizĂ«s nĂ«n fushĂ«n e tekstit.
Në seksionin e ardhshëm, do të flasim se si të nisni mikroshërbimet tona në konteinerët Docker. Kjo është e nevojshme për të përgatitur aplikacionin për t'u nisur në klasterin Kubernetes.
Konteinerët Docker
â Ă«shtĂ« njĂ« sistem pĂ«r automatizimin e shpĂ«rndarjes, shkallĂ«zimit dhe menaxhimit tĂ« aplikacioneve tĂ« kontenjerizuara. Njihet gjithashtu si "orkestra e kontenjerĂ«ve" (container orchestrator). NĂ«se Kubernetes punon me kontenjerĂ«, atĂ«herĂ« pĂ«rpara se ta pĂ«rdorim kĂ«tĂ« sistem, duhet sĂ« pari tĂ« kemi kĂ«ta kontenjerĂ«. Por fillimisht le tĂ« flasim pĂ«r atĂ« se çfarĂ« janĂ« kontenjerĂ«t. Mendoj se pĂ«rgjigjja mĂ« e mirĂ« pĂ«r pyetjen se çfarĂ« janĂ« mund tĂ« gjendet nĂ« Docker:
Imazhi i kontenjerit është një paketë e lehtë, autonome dhe ekzekutueshme që përmban një aplikacion, duke përfshirë gjithçka të nevojshme për ekzekutimin e tij: kodin e aplikacionit, mjedisin e ekzekutimit, mjetet dhe bibliotekat e sistemit, konfigurimet. Aplikacionet e kontenjerizuara mund të përdoren në mjediset Linux dhe Windows, dhe ato gjithmonë do të funksionojnë njësoj pavarësisht nga infrastruktura.
Kjo do të thotë se kontenjerët mund të ekzekutohen në çdo kompjuter, përfshirë serverat e prodhimit, dhe në çdo mjedis, aplikacionet e mbyllura brenda tyre do të funksionojnë njësoj.
Për të hetuar karakteristikat e kontenjerëve dhe për t'i krahasuar ato me mënyra të tjera të ekzekutimit të aplikacioneve, le të shqyrtojmë shembullin e shërbimit të aplikacionit React duke përdorur një makinë virtuale dhe një kontenjer.
â ShĂ«rbimi i skedhave statike tĂ« aplikacionit React me mjete tĂ« makinĂ«s virtuale
Duke u përpjekur të organizojmë shërbimin e skedhave statike me mjetet e makinave virtuale, do të përballemi me këto disavantazhe:
- Përdorim joefektiv i burimeve, pasi çdo makinë virtuale përfaqëson një sistem operativ të plotë.
- Varësia nga platforma. Ajo që funksionon në ndonjë kompjuter lokal, mund të mos funksionojë në serverin e prodhimit.
- Shkallëzimi i ngadalshëm dhe kërkues për burime të zgjidhjeve të bazuara në makina virtuale.

Serveri web Nginx që shërben skedhat statike, i ekzekutuar në një makinë virtuale
Nëse për të zgjidhur një detyrë të ngjashme aplikojmë kontenjerë, atëherë, në krahasim me makinat virtuale, do të vërejmë këto pika të forta:
- Përdorim efektiv i burimeve: puna me sistemin operativ nëpërmjet Docker.
- Pavarësia nga platformat. Një kontenier që zhvilluesi mund ta ekzekutojë në kompjuterin e tij, do të funksionojë kudo.
- Instalimi i lehtë përmes përdorimit të shtresave të imazheve.

Serveri web Nginx, i cili shërben skedarë statikë, i nisur në kontenier
Ne i kemi krahasuar makinat virtuale me kontenierët vetëm në disa pika, por edhe kjo mjafton për të ndjerë forcën e madhe të kontenierëve. mund të gjeni detaje rreth kontenierëve Docker.
âNdĂ«rtimi i imazhit tĂ« kontenierit pĂ«r aplikacionin React
Bloku kryesor i ndërtimit të kontenierit Docker është skedari Dockerfile. Në fillim të këtij skedari bëhet regjistrimi i imazhit bazë të kontenierit, pastaj përfshihen një sërë udhëzimesh që tregojnë rendin e ndërtimit të kontenierit, i cili do të përmbushë nevojat e një aplikacioni të caktuar.
Para se të fillojmë të punojmë me skedarin Dockerfile, kujtojmë atë që kemi bërë për të përgatitur skedarët e aplikacionit React për të qenë të vendosur në serverin Nginx:
- Ndërtimi i paketës së aplikacionit React (
npm run build). - Nisja e serverit Nginx.
- Kopjimi i përmbajtjes së drejtorisë
buildnga folderi i projektitsa-frontendnë folderin e serveritnginx/html.
Më poshtë do të mund të shihni paralelizma midis krijimit të një konteneri dhe veprimeve të përshkruara më sipër, të kryera në kompjuterin lokal.
âPĂ«rgatitja e skedarit Dockerfile pĂ«r aplikacionin SA-Frontend
Udhëzimet që do të përfshihen në Dockerfile për aplikacionin SA-Frontend, përbëhen vetëm nga dy komanda. Kjo është për shkak se grupi i zhvilluesve të Nginx ka përgatitur një bazë për Nginx, që do të përdorim për të ndërtuar imazhin tonë. Ja ato dy hapa që duhet të përshkruajmë:
- Baza e imazhit duhet të jetë imazhi Nginx.
- Përmbajtja e folderit
sa-frontend/buildduhet të kopjohet në folderin e imazhitnginx/html.
Nëse kaloni nga ky përshkrim në skedarin Dockerfile, ai do të duket kështu:
FROM nginx
COPY build /usr/share/nginx/html Siç e shihni, gjithçka këtu është shumë e thjeshtë, ndërkohë përmbajtja e skedarit rezulton të jetë mjaft e lexueshme dhe e kuptueshme. Ky skedar i tregon sistemit se çfarë duhet të marrë nga imazhi nginx me të gjithë atë që ka brenda, dhe të kopjojë përmbajtjen e drejtorisë build në direktorinë nginx/html.
KĂ«tu mund tĂ« keni njĂ« pyetje lidhur me se si e di se ku saktĂ«sisht duhet tĂ« kopjoj skedarĂ«t nga folderi build, pra â nga ku u mor rruga /usr/share/nginx/html. NĂ« tĂ« vĂ«rtetĂ«, edhe kĂ«tu nuk ka asgjĂ« tĂ« komplikuar. Kjo Ă«shtĂ« pĂ«r shkak se informacionet pĂ«rkatĂ«se mund tĂ« gjenden nĂ« tĂ« imazhit.
âNdĂ«rtimi i imazhit dhe ngarkimi i tij nĂ« depo
Para se të mund të punojmë me imazhin e gatshëm, na nevojitet ta dërgojmë atë në depo të imazheve. Për këtë, do të përdorim platformën falas të hostingut të imazheve Docker Hub. Në këtë fazë pune, ju lutem të bëni këto hapa:
- Instalo .
- Regjistrohu në faqen e internetit Docker Hub.
- Hyni në llogarinë tuaj duke ekzekutuar në terminal komandën e këtij lloji:
docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
Tani na nevojitet të kalojmë në direktorinë sa-frontend dhe ta ekzekutojmë atje komandën e këtij lloji:
docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend . Këtu dhe në vazhdim në komanda të ngjashme $DOCKER_USER_ID duhet të zëvendësohet me emrin tuaj të përdoruesit në Docker Hub. Për shembull, kjo pjesë e komandës mund të duket kështu: rinormaloku/sentiment-analysis-frontend.
Në të njëjtën kohë, kjo komandë mund të shkurtoshet duke hequr nga ajo -f Dockerfile, sepse në folderin ku ne ekzekutojmë këtë komandë, ky skedar tashmë është i pranishëm.
Për të dërguar imazhin e gatshëm në depo, na nevojitet komandë e tillë:
docker push $DOCKER_USER_ID/sentiment-analysis-frontendPas ekzekutimit të saj, kontrolloni listën e depozitave tuaja në Docker Hub për të parë nëse ngarkimi i imazhit në ruajtjen e cloud ishte i suksesshëm.
âFillimi i kontejnerit
Tani kushdo mund të ngarkojë dhe të ekzekutojë imazhin, i njohur si $DOCKER_USER_ID/sentiment-analysis-frontend. Për ta bërë këtë, nevojitet të kryhen komandat e mëposhtme:
docker pull $DOCKER_USER_ID/sentiment-analysis-frontend
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend Tani kontejneri është i ekzekutuar, dhe ne mund të vazhdojmë punën duke krijuar imazhe të tjera të nevojshme. Por, para se të vazhdojmë, le të kuptojmë strukturën 80:80, e cila shfaqet në komandën e startit të imazhit dhe mund të duket e paqartë.
- Numri i parë
80është numri i portit të hostit (dmth - kompjuterit lokal). - Numri i dytë
80është porta e kontejnerit në të cilën kërkesa duhet të redirektohet.
Le ta shqyrtojmë ilustrimin e mëposhtëm.

Redirektimi i portave
Sistemi kryen redirektimin e kërkesave nga porta <hostPort> në portën <containerPort>. Pra, kërkesa për portin 80 e kompjuterit redirektohet në portin 80 e kontejnerit.
Pasi porta 80 është e hapur në kompjuterin lokal, mund ta qasni aplikacionin nga ky kompjuter me adresën localhost:80. Nëse sistemi juaj nuk mbështet Docker, aplikacioni mund të fillohet në një makinë virtuale Docker, adresë e së cilës do të duket si :80. Për të zbuluar adresën IP të makinës virtuale Docker, mund të përdorni komandën docker-machine ip.
Në këtë fazë, pas nisjes me sukses të kontejnerit të aplikacionit frontend, duhet të keni mundësi të hapni faqen e tij në shfletues.
âSkedari .dockerignore
Duke ndërtuar imazhin e aplikacionit SA-Frontend, ne mund të kemi vënë re se ky proces është jashtëzakonisht i ngadaltë. Kjo ndodh për shkak se duhet të dërgohet konteksti i ndërtimit të imazhit te demoni Docker. Direktoriumi që përfaqëson kontekstin e ndërtimit përcaktohet nga argumenti i fundit i komandës docker build. Në rastin tonë, në fund të kësaj komande qëndron pika. Kjo sjell që në kontekstin e ndërtimit të përfshihet struktura si vijon:
sa-frontend:
| Â Â .dockerignore
| Â Â Dockerfile
| Â Â package.json
| Â Â README.md
+---build
+---node_modules
+---public
---src Por na nevojitet vetëm dosja build. Ngarkimi i çfarëdo gjëje tjetër është një humbje e kotë kohe. Ndërtimi mund të shpejtohet duke i treguar Docker-it se cilat direktoriume mund të injorohen. Pikërisht për këtë na nevojitet skedari .dockerignore. Nëse jeni të njohur me skedarin .gitignore, struktura e këtij skedari, me siguri do t'ju duket e njohur. Ai përmban një listë direktoriumesh që sistemi i ndërtimit të imazhit mund t'i injorojë. Në rastin tonë, përmbajtja e këtij skedari duket kështu:
node_modules
src
public Skeda .dockerignore duhet të jetë në të njëjtën dosje me skedarin Dockerfile. Tani ndërtimi i imazhit do të zgjasë vetëm disa sekonda.
Tani do të merremi me imazhin për aplikacionin Java.
âNdĂ«rtimi i imazhit tĂ« kontejnerit pĂ«r aplikacionin Java
E dini, në të vërtetë keni studiuar gjithçka të nevojshme për të krijuar imazhe kontejnerësh. Prandaj ky seksion do të jetë shumë i shkurtër.
Hapni skedarin Dockerfile, i cili ndodhet në dosjen e projektit sa-webapp. Nëse e lexoni tekstin e këtij skedari, do të gjeni vetëm dy konstrukte të reja që fillojnë me fjalët kyçe ENV dhe EXPOSE:
ENV SA_LOGIC_API_URL http://localhost:5000
âŠ
EXPOSE 8080 Fjala kyçe ENV lejon të deklaroni variabla mjedisi brenda kontejnerëve Docker. Në veçanti, në rastin tonë, ajo lejon të caktoni URL-në për qasje në API-në e aplikacionit, që kryen analizën e teksteve.
Fjala kyçe EXPOSE lejon të tregojë Docker se cilin port duhet ta hapë. Ne do të përdorim këtë port gjatë punës me aplikacionin. Mund ta vëreni që në Dockerfile për aplikacionin SA-Frontend nuk ka një komandë të tillë. Kjo nevojitet vetëm për qëllime dokumentimi, në fjalë të tjera, kjo konstrukcion është e destinuar për ata që do të lexojnë Dockerfile.
NdĂ«rtimi i imazhit dhe dĂ«rgimi i tij nĂ« depo duket pikĂ«risht si nĂ« shembullin e mĂ«parshĂ«m. NĂ«se ende nuk jeni shumĂ« tĂ« sigurt nĂ« aftĂ«sitĂ« tuaja â komandat pĂ«rkatĂ«se mund t'i gjeni nĂ« skedarin README.md nĂ« dosjen sa-webapp.
âNdĂ«rtimi i imazhit tĂ« kontejnerit pĂ«r aplikacionin Python
Nëse shikoni përmbajtjen e skedarit Dockerfile në dosjen sa-logic, nuk do të gjeni asgjë të re për vetë. Komandat për ndërtimin e imazhit dhe dërgimin e tij në depo gjithashtu duhet të jenë të njohura për ju, por ato, ashtu si në rastin e aplikacioneve tona të tjera, mund të gjenden në skedarin README.md në dosjen sa-logic.
âTestimi i aplikacioneve tĂ« kontenierizuara
A mund të besoni në diçka që nuk e keni testuar? As unë nuk mundem. Le të provojmë kontejnerët tanë.
- Le të fillojmë kontejnerin e aplikacionit
sa-logicdhe ta konfigurojmë atë për të dëgjuar në portin5050:docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic - Le të fillojmë kontejnerin e aplikacionit
sa-webappdhe ta konfigurojmë atë për të dëgjuar në portin8080. Për më tepër, na nevojitet të konfirmojmë portin në të cilin aplikacioni Python do të presë kërkesat nga aplikacioni Java, duke rishikuar variablin e ambientitSA_LOGIC_API_URL:$ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://:5000' $DOCKER_USER_ID/sentiment-analysis-web-app
PĂ«r tĂ« mĂ«suar se si tĂ« gjej IP-adresĂ«n e kontejnerit ose tĂ« makinerisĂ« virtuale Docker â referohuni nĂ« skedarin .
Le të fillojmë kontejnerin e aplikacionit sa-frontend:
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend Tani gjithçka është gati për të hyrë në shfletues në adresën localhost:80 dhe të testoni aplikacionin.
Vini re se nëse e keni ndryshuar portin për sa-webapp, ose nëse po punoni me një makinë virtuale Docker, do t'ju nevojitet të redaktoni skedarin App.js në dosjen sa-frontend, duke ndërruar IP-adresën ose numrin e portit në metodën analyzeSentence(), duke zëvendësuar të dhënat e vjetruara me të dhëna të sakta. Pas kësaj, duhet ta rindërtoni imazhin dhe ta përdorni atë.
Ja si duket skema e aplikacionit tonë tani.

Mikrosherbimet ekzekutohen në kontejnerë
Përmbledhje: përse na nevojitet Kubernetes cluster?
Së fundi, ne kemi shqyrtuar skedarët Dockerfile, folëm për mënyrën e ndërtimit të imazheve dhe dërgimit të tyre në depo Docker. Përveç kësaj, mësuam si të përshpejtojmë ndërtimin e imazheve duke përdorur skedarin .dockerignore. Në fund, mikroshërbimet tona tani ekzekutohen në kontejnerët Docker. Këtu mund t'ju lindë një pyetje e drejtë përse na nevojitet Kubernetes. Përgjigjia për këtë pyetje do t'i kushtohet pjesës së dytë të këtij materiali. Ndërkohë, mendoni për pyetjen e mëposhtme:
Supozoni se aplikacioni ynĂ« web pĂ«r analizĂ«n e teksteve Ă«shtĂ« bĂ«rĂ« i njohur nĂ« tĂ« gjithĂ« botĂ«n. Ădo minutĂ«, miliona kĂ«rkesa i drejtohen atij. Kjo do tĂ« thotĂ« se mikroshĂ«rbimet sa-webapp dhe sa-logic do tĂ« jenĂ« nĂ«n njĂ« ngarkesĂ« tĂ« madhe. Si mund ta shkallĂ«zojmĂ« kontejnerĂ«t, nĂ« tĂ« cilĂ«t ekzekutohen mikroshĂ«rbimet?
Burimi: habr.com
