Jei per pastaruosius kelerius metus susisiekėte su naujausia programavimo pasaulio raida, būtumėte pastebėję garsų „Docker“ ir „Docker“ konteinerių šurmulį. Šis doko populiarumas nėra be priežasties. „Docker“ pristatymas labai pakeitė kūrėjų požiūrį į programų kūrimą.
Kas nori likti užnugaryje, kai tokia revoliuciją kelianti technologija pasiekia programavimo pasaulį? Taigi, šiandien mes pradedame naują pamokų seriją, kad sužinotumėte, kaip naudoti „Docker“ kuriant programas. Jei esate tikras „Docker“ pradedantysis, ši pamokų serija yra tinkama vieta pradėti.
Pirmajame mūsų vadovėlių ciklo straipsnyje norime suprasti, kas tiksliai yra „Docker“ ir kodėl kūrėjai taip myli „Docker“. Mes taip pat sujungsime paprastą „Node.js“ programą, kad supažindintume jus su pagrindinėmis „Docker“ sąvokomis.
Kodėl laukti ilgiau? Pradėkime!
„Docker“ yra įrankis, naudojamas kuriant programas; tai yra kurti, diegti ir paleisti programas per konteinerius.
Su sudėtiniu rodiniu visos bibliotekos ir kitos programos vykdymui reikalingos priklausomybės yra supakuotos kaip vienas diegimo paketas.
Pagrindinis programos talpinimo tikslas yra izoliuoti jas nuo kitų toje pačioje sistemoje veikiančių programų. Šis metodas užtikrina, kad programos netrukdo viena kitai veikti, ir labai palengvina programų priežiūrą.
Nors toje pačioje sistemoje veikiantys konteineriai vykdant yra izoliuoti vienas nuo kito, jie turi tą patį OS branduolį. Taigi konteineriai yra lengvesni, palyginti su alternatyviu programos vykdymo, virtualių mašinų išskyrimo pasirinkimu.
Nepaisant pasikeitusios aplinkos, garantuojama, kad konteinerių programa, veikianti jūsų „Windows“ operacinėje sistemoje, veiks be problemų kito vartotojo „Windows“ mašinoje.
Nors konteineriai buvo seniai naudojami prieš „Docker“, „Docker“ pristatymas kūrėjų bendruomenėje išpopuliarėjo naudojant konteinerius. Yra du komponentai, naudojami jungiant programą: Dockerfile ir „Docker“ vaizdas . Sužinokime, kokie jie yra.
„Dockerfile“ yra tekstinis failas, kuriame yra komandų rinkinys, reikalingas docker vaizdui sukurti. „Dockerfile“ yra informacijos, be kita ko, apie pagrindinę OS, kalbą, failo vietą ir tinklo prievadus.
Kai vykdote „Docker“ sukūrimo komandą su dockerfile vietoje, docker vaizdas sukuriamas remiantis dockerfile. Jie veikia kaip šablonai kuriant galutinį dokavimo konteinerį. Sukūrus doko vaizdus, jie yra statiški. Galite iškviesti „Docker“ vykdymo komandą, kad sukurtumėte doko talpyklą naudodami dokininko vaizdą.
Šioje pamokoje ketiname prijungti „Node.js“ programą. Laikysimės žingsnis po žingsnio, kad „Docker“ konteineris būtų paleistas ir paleistas.
1 - Sukurkite „Node.js“ programą 2 - Sukurkite dockerfile 3 - Sukurkite docker vaizdą 4 - Sukurkite programos konteinerį
Prieš nardydami prisijungti prie mūsų programos, turėtumėte įsitikinti, kad „Docker“ ir „Node.js“ yra įdiegti jūsų sistemoje
Iš komandinės eilutės eikite į naują projekto katalogą ir paleiskite šią komandą, kad sukurtumėte failą package.json, kuriame yra informacija apie programos priklausomybes ir paleidimo scenarijų.
npm init -y
Tada įdiekite ir pridėkite „Express“ kaip priklausomybę nuo savo programos, vykdydami šią komandą komandinėje eilutėje. Programai sukurti naudosime „Express“.
npm install express --save
Tai pridės išraišką kaip priklausomybę nuo mūsų package.json
failą.
Dabar „Express“ pagalba galime sukurti „Node“ programą.
Sukurkite failą pavadinimu app.js
projekto kataloge ir pridėkite šį failą prie failo.
const express = require('express') const app = express() app.get('/', (req, res) => {
res.send('Hello World!') }) app.listen(3000, () => {
console.log('Node server has started running') })
Pirmiau pateiktas kodas sukuria mazgo serverį, kuris klausosi gaunamų užklausų 3000 prievade. Norėdami paleisti mazgo serverį, galite paleisti šią komandą komandinėje eilutėje.
node app.js
Dabar eikite į savo naršyklę ir vadovaukitės URL http://localhost:3000
ir pamatysite tekstą Hello World!
puslapyje.
Savo projektui sukūrėme paprastą „Node“ programą. Dabar pereikime prie dockerfile kūrimo.
„Dockerfile“ pateikiame informaciją, kurios reikia norint sukurti ir paleisti „Node“ programą be „Docker“ aplinkos.
Tai apima kalbos ir jos versijos, naudojamos programoje, nustatymą, mūsų projekto katalogo nustatymą kaip darbo katalogą, visų failų, esančių darbo kataloge, nukopijavimą, tinklo prievado nustatymą ir failo, kuris yra programos įvedimo taškas, nustatymą. Sudėtingesnėse programose taip pat turėsite nustatyti aplinkos kintamuosius ir duomenų bazės URL dockerfile.
FROM node:latest WORKDIR /dockerTutorial COPY . . RUN npm install EXPOSE 3000 ENTRYPOINT ['node', 'app.js']
package.json
failą.node app.js
.Norėdami sukurti „Docker“ vaizdą iš „dockerfile“, naudokite šią komandą.
docker build -t docker-tutorial .
Docker-tutorial
yra „Docker“ atvaizdo pavadinimas. Taškas nurodo failo kelią į projekto katalogą, kur mes šiuo metu esame komandinėje eilutėje.
Jei OS vaizdas nurodytas su NUO komanda, mazgas: naujausias , šiuo metu nėra jūsų įrenginyje, jis bus ištrauktas iš „Docker Hub“, kai vykdysite pirmiau nurodytą komandą.
Ištraukus vaizdą, kiekviena komanda dockerfile bus vykdoma po vieną.
Vykdymo pabaigoje, jei matote pranešimą sėkmingai pastatytas , programos doko vaizdas sėkmingai sukurtas. Paleiskite šią komandą, kad pamatytumėte pastatytą doko vaizdą vietinėje vaizdų saugykloje.
docker images
Rezultatas atrodo taip
Dabar mes galime naudoti pastatytą vaizdą savo „Docker“ konteineriui sukurti. Norėdami sukurti talpyklą, naudokite „Docker run“ komandą.
docker run -p 8080:3000 docker-tutorial
Čia skaičiai 8080 ir 3000 nurodo konteinerio išorę ir vidų. Išorinis prievadas, 8080, yra prievadas, kurį naudojame prisijungdami prie programos per savo naršyklę. Vidinis prievadas, 3000, yra tas prievadas, kurį mūsų programa klauso gaunamų užklausų. „Docker“ konteineris nurodytą išorinį prievadą susieja su vidiniu prievadu.
Apsilankykite URL http://localhost:8080
naršyklėje ir pažiūrėkite, ar gaunate puslapį naudodami Hello World!
pranešimas, kurį gavote lankydamasis http://localhost:3000
prieš tai. Jei taip, tada jūsų „Docker“ konteineris veikia ir veikia.
Naudodami šią komandą galite peržiūrėti visus veikiančius „Docker“ konteinerius savo prietaise.
docker ps
Komanda suteiks jums tokį išėjimą. Čia galite rasti veikiančio konteinerio CONTAINER_ID ir NAME.
Pamenate, kaip minėjau programą su aplinkos kintamaisiais, reikia daugiau instrukcijų dockerfile? Aplinkos kintamojo vertė kinta atsižvelgiant į aplinką, kurioje jie veikia.
Atkreipkite dėmesį, kaip mes aiškiai paminėjome prievadą, kurio klausosi „Node“ programa, kai veikia serveris. Šis požiūris yra nelankstus ir linkęs į klaidas. Jei mes paleidžiame savo programą aplinkoje, kuri neatidaro „Node“ serverio 3000 prievado, mūsų programa nustoja veikti.
Tinkamiausias įgyvendinimas yra uosto numerio pašalinimas iš programos. Vietoje prievado numerio naudojame kintamojo pavadinimą ir nustatome to kintamojo vertę bėgimo aplinkoje. Mūsų atveju bėgimo aplinka yra „Docker“ konteineris. Taigi, mes turime pridėti prievado numerį prie „dockerfile“ kaip aplinkos kintamojo.
Pažiūrėkime, kaip mes galime tai padaryti.
Pirmiausia pridėkite aplinkos kintamąjį prie mūsų dockerfile su jo verte. Norėdami tai įvykdyti, turime pridėti naują komandą prie „dockerfile“.
FROM node:latest WORKDIR /dockerTutorial COPY . . ENV PORT=3000 RUN npm install EXPOSE $PORT ENTRYPOINT ['node', 'app.js']
Naudodami komandą ENV, po kurios pateikiamas kintamojo pavadinimas ir vertės priskyrimas, prie savo dockerfile galime pridėti naują aplinkos kintamąjį. Ar pastebėjote, kaip pakeista komanda EXPOSE 3000, kad nebūtų aiškiai paminėtas prievado numeris? Vietoj to, jis nurodo sukurtą PORT kintamąjį, kad gautumėte tikslų prievado numerį. Taikydami šį metodą, jei turime pakeisti prievado numerį, turime pakeisti tik vieną kodo vietą, o tai palengvina mūsų programos priežiūrą.
Dabar mes pakeitėme „dockerfile“, kitas žingsnis yra pakeisti app.js, kad būtų nurodytas sukurtas aplinkos kintamasis. Tam mes pakeisime prievado numerį 3000, naudojamą klausymo metodo viduje, procesu.env.PORT.
const express = require('express') const app = express() app.get('/', (req, res) => {
res.send('Hello World!') }) app.listen(process.env.PORT, () => {
console.log('Node server has started running') })
Kadangi mes pakeitėme savo programos failus ir „dockerfile“, turime sukurti naują naujo konteinerio vaizdą. Tačiau pirmiausia turime sustabdyti šiuo metu veikiantį „Docker“ konteinerį, kad tai pasiektume.
Konteineriui sustabdyti galime naudoti „docker stop“ komandą.
docker stop f10
Šioje komandoje naudojama vertė f10 yra pirmieji trys sudėtinio rodinio ID skaitmenys.
Mes galime naudoti komandą „Docker kill“, kad sustabdytume bėgantį konteinerį.
docker kill f10
Skirtumas tarp „Docker kill“ ir „Docker Stop“ yra tas, kad „Docker Stop“ konteineris grakščiau sustabdomas atleidžiant naudojant išteklius ir taupant būseną. „Docker kill“ vis dėlto staigiau sustabdo konteinerį, tinkamai neišlaisvindamas išteklių ir negelbėdamas valstybės. Konteineriui, veikiančiam gamybos aplinkoje, geresnis pasirinkimas yra naudoti „Docker Stop“, kad sustabdytumėte konteinerį.
Sustabdę veikiantį konteinerį, naudodami šią komandą būtinai išvalykite konteinerio likučius iš pagrindinės aplinkos.
Kai bandysite paleisti aukščiau nurodytas komandas, kad sustabdytumėte konteinerį, pastebėtumėte, kad terminalo skirtukas, kurį naudojome kurdami konteinerį, negali būti naudojamas daugiau komandoms vykdyti, nebent mes nužudysime konteinerį. Tai galime rasti naudodami atskirą skirtuką naujų komandų vykdymui.
Tačiau yra geresnis požiūris. Mes galime paleisti konteinerį „daemon“ režimu. Naudojant „daemon“ režimą, konteineris veikia fone nenaudojant dabartinio skirtuko išvestims rodyti.
Norėdami paleisti konteinerį „daemon“ režimu, tiesiog turite pridėti papildomą vėliavą -d prie „Docker run“ komandos.
docker run -d -p 8080:3000 docker-tutorial
Norėdami paleisti sudėtinį rodinį interaktyviuoju režimu, jis jau turėtų veikti. Įjungę interaktyvųjį režimą, galite paleisti komandas, kad pridėtumėte ar pašalintumėte failus į talpyklą, išvardytumėte failus ar paleistumėte kitas paprastai naudojamas komandas.
Norėdami paleisti konteinerį interaktyviuoju režimu, naudokite šią komandą.
docker exec -it e37 bash
Čia e37 yra konteinerio ID. Žaiskite naudodami interaktyvųjį režimą naudodami „bash“ komandas.
Pirmoje mūsų „Docker“ mokymo programų serijos pamokoje sužinojote, kaip sukurti paprastos „Node.js“ programos „Docker“ talpyklą. Bet yra daugiau, ką galėtumėte padaryti su „Docker“ ir konteineriais. Mūsų būsimose mokymo programose pamatysime, kaip dirbti su duomenų bazėmis, tomais ir dirbti su keliais konteineriais, kuriuos naudoja programa, sukurta naudojant mikropaslaugas.