Docker za začetnike: kaj je Docker in kako ustvariti zabojnike Docker

Če bi bili v stiku z najnovejšimi dosežki v programskem svetu v zadnjih nekaj letih, bi opazili glasno brenčanje okoli Dockerjevih in Dockerjevih zabojnikov. Ta priljubljenost dockerja ni brez razloga. Uvedba Dockerja se je močno spremenila, kako razvijalci pristopajo k razvoju aplikacij.

Kdo želi ostati, ko takšna revolucionarna tehnologija prizadene programski svet? Danes torej začenjamo novo serijo vadnic, v kateri boste izvedeli, kako uporabljati Docker za razvoj aplikacij. Če ste absolutno začetnik Dockerja, je ta vadnica pravi kraj za začetek.

V prvem članku naše vadnice želimo razumeti, kaj natančno je Docker in zakaj ga imajo razvijalci tako radi. Doekerizirali bomo tudi preprosto aplikacijo Node.js, da vas seznanimo z osnovnimi koncepti Dockerja.


Zakaj čakati dlje? Začnimo!



Kaj je Docker

Docker je orodje, ki se uporablja za izdelavo aplikacij; to je ustvarjanje, uvajanje in zagon aplikacij skozi vsebnike.


Z vsebnikom so vse knjižnice in druge odvisnosti, potrebne za zagon aplikacije, pakirane kot en paket za razmestitev.

Glavni cilj vsebništva aplikacije je izolirati jo od drugih aplikacij, ki se izvajajo v istem sistemu. Ta pristop zagotavlja, da aplikacije ne motijo ​​medsebojnega delovanja in zelo olajša vzdrževanje aplikacij.

Čeprav so vsebniki, ki se izvajajo v istem sistemu, med izvajanjem ločeni drug od drugega, imajo isto jedro OS. Zato so vsebniki lažji v primerjavi z alternativno izbiro za izoliranje izvajanja aplikacij, navideznimi stroji.

Kontejnerska aplikacija, ki se izvaja v vašem operacijskem sistemu Windows, bo zagotovo delovala brez težav v računalniku Windows drugega uporabnika kljub spremembi okolja.


Čeprav se pred Dockerjem zabojniki že dolgo uporabljajo, je uvedba Dockerja popularizirala uporabo zabojnikov v skupnosti razvijalcev. Obstajata dve komponenti, ki se uporabljata pri nameščanju aplikacije v docker: Dockerfile in Slika Dockerja . Ugotovimo, kaj so.

Dockerfile

Dockerfile je besedilna datoteka, ki vsebuje nabor ukazov, potrebnih za izdelavo slike dockerja. Datoteka Docker med drugim vsebuje informacije o osnovnem OS, jeziku, lokaciji datoteke in omrežnih vratih.

Slika Dockerja

Ko zaženete Dockerjev ukaz za gradnjo z nameščeno datoteko docker, se na podlagi datoteke docker ustvari slika dockerja. Delujejo kot predloge za ustvarjanje končnega zabojnika. Ko so slike dockerjev ustvarjene, so statične. Dockerjev ukaz za zagon lahko prikličete, da ustvarite zabojnik s pomočjo dockerjeve slike.



Dockerizacija aplikacije Node.js

V tej vadnici bomo pristavili aplikacijo Node.js. Sledili bomo korak za korakom, da bomo posodo Docker zagnali in zagnali.


1 - Ustvari aplikacijo Node.js 2 - Ustvari datoteko docker 3 - Ustvari sliko dockerja 4 - Ustvari vsebnik aplikacije

Preden se poglobite v dockerizacijo naše aplikacije, se prepričajte, da sta Docker in Node.js nameščena v vašem sistemu

  • Namestite Docker v sistem - v tej vadnici ne bom opisoval namestitve Dockerja, vendar lahko sledite dokumentaciji Dockerja in namestite Docker na namizje sistema Windows ali Ubuntu.
  • Prenesite in namestite Node.js z uradne spletne strani

Ustvarite aplikacijo Node.js

V ukazni vrstici se pomaknite do novega imenika projekta in zaženite naslednji ukaz, da ustvarite datoteko package.json, ki vsebuje informacije o odvisnostih aplikacije in zagonu skripta.

npm init -y


Nato namestite in dodajte Express kot odvisnost v svojo aplikacijo tako, da zaženete ta ukaz v ukazni vrstici. Za izdelavo aplikacije bomo uporabili Express.

npm install express --save

To bo ekspres dodalo kot odvisnost k našemu package.json mapa.

Zdaj lahko s pomočjo Expressa ustvarimo aplikacijo Node.


Ustvarite datoteko z imenom app.js v imenik projekta in v datoteko dodajte naslednjo kodo.

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') })

Zgornja koda ustvari strežnik Node, ki posluša dohodne zahteve na vratih 3000. Ta ukaz lahko zaženete v ukazni vrstici, da zaženete strežnik Node.

node app.js

Zdaj pojdite v brskalnik in sledite URL-ju http://localhost:3000 in videli boste besedilo Hello World! na strani.

Za naš projekt smo zgradili preprosto aplikacijo Node. Zdaj pa pojdimo na ustvarjanje datoteke docker.

Ustvarite datoteko Docker

V datoteki docker nudimo informacije, ki so potrebne za izdelavo in zagon naše aplikacije Node v okolju Docker.

To vključuje določitev jezika in njegove različice, ki se uporablja v aplikaciji, nastavitev direktorija našega projekta kot delovnega imenika, kopiranje vseh datotek v delovnem imeniku, nastavitev omrežnih vrat in določitev, katera datoteka je vstopna točka v aplikacijo. V bolj zapletenih aplikacijah boste morali tudi v datoteki docker nastaviti spremenljivke okolja in URL baze podatkov.

FROM node:latest WORKDIR /dockerTutorial COPY . . RUN npm install EXPOSE 3000 ENTRYPOINT ['node', 'app.js']
  • OD ukaz pridobi sliko OS za zagon naše aplikacije na določenem OS iz Docker Hub. Docker Hub je skladišče slik dockerjev, ki jih lahko potegnemo v lokalno okolje. Pridobimo sliko, ki temelji na Ubuntuju in ima nameščen Node.js. Uporaba »najnovejše« kot različice vozlišča potegne sliko, ki ima nameščeno najnovejšo različico vozlišča.
  • WORKDIR ukaz nastavi delovni imenik aplikacije.
  • KOPIRATI ukaz kopira datoteke iz trenutnega imenika (v ukazni vrstici) v delovni imenik, ki je bil nastavljen v prejšnjem koraku. Določite lahko ime datoteke za kopiranje ali uporabite dvojne pike za kopiranje vseh datotek v trenutnem imeniku v delovni imenik.
  • TEK ukaz namesti vse odvisnosti, ki so potrebne za izdelavo aplikacije. To vključuje vse odvisnosti, določene v package.json mapa.
  • IZPOSTAVITEV ukaz odpre vrata iz vsebnika Docker v zunanji svet. Ta vrata prejemajo vse zahteve, ki jih pošljemo v vsebnik Docker. Vrata so posebej nastavljena na 3000, ker so vrata, ki jih aplikacija Node znotraj vsebnika Docker posluša za zahteve.
  • VSTOPNA TOČKA določa, kako zagnati aplikacijo. Docker se matriki, ki jo dobimo, pridruži enemu ukazu za zagon aplikacije. V tem primeru je node app.js.

Ustvarjanje slike Dockerja

Z naslednjim ukazom ustvarite sliko Dockerja iz datoteke docker.

docker build -t docker-tutorial .

Docker-tutorial je ime Dockerjeve slike. Pika označuje pot datoteke do imenika projekta, kjer smo trenutno v ukazni vrstici.

Če je slika OS podana z OD ukaz, vozlišče: najnovejše , trenutno ni v vaši napravi, bo izpuščen iz Docker Hub, ko zaženete zgornji ukaz.

Po vlečenju slike se bo vsak ukaz v datoteki docker izvedel enega za drugim.

Na koncu izvedbe, če vidite sporočilo uspešno zgrajena , slika dockerja aplikacije je bila uspešno zgrajena. Zaženite ta ukaz, da si ogledate vgrajeno sliko dockerja v lokalnem repozitoriju slik.

docker images

Izhod je videti takole

Ustvarjanje vsebnika

Zdaj lahko z vgrajeno sliko ustvarimo naš Dockerjev vsebnik. Za ustvarjanje vsebnika uporabite ukaz docker run.

docker run -p 8080:3000 docker-tutorial

Tu številki 8080 in 3000 označujeta zunanjo in notranjost posode. Zunanja vrata, 8080, so vrata, ki jih uporabljamo za povezavo z aplikacijo prek našega brskalnika. Notranja vrata, 3000, so vrata, ki jih naša aplikacija posluša za dohodne zahteve. Dockerjev vsebnik preslika dana zunanja vrata v notranja vrata.

Obiščite URL http://localhost:8080 v brskalniku in preverite, ali dobite stran z Hello World! sporočilo, ki ste ga dobili ob obisku http://localhost:3000 prej. Če je odgovor da, potem je vaš vsebnik Docker pripravljen in deluje.

Ta ukaz lahko uporabite za ogled vseh delujočih vsebnikov Dockerja v vaši napravi.

docker ps

Ukaz vam bo dal takšen izhod. Tu lahko najdemo CONTAINER_ID in NAME delujočega vsebnika.

Dodajanje okoljskih spremenljivk v aplikacijo

Se spomnite, kako sem omenil, da aplikacija z okoljskimi spremenljivkami zahteva več navodil v datoteki docker? Vrednost okoljske spremenljivke se spreminja z okoljem, v katerem delujejo.

Upoštevajte, kako smo izrecno omenili vrata, ki jih posluša naša aplikacija Node, ko se strežnik izvaja. Ta pristop je neprilagodljiv in nagnjen k napakam. V primeru, da aplikacijo zaženemo v okolju, ki ne odpre vrat 3000 za strežnik Node, naša aplikacija preneha delovati.

Najprimernejša izvedba je odstranitev številke vrat iz aplikacije. Namesto tega uporabimo ime spremenljivke namesto številke vrat in nastavimo vrednost za to spremenljivko v delujočem okolju. V našem primeru je tekaško okolje Dockerjev vsebnik. Torej moramo datoteki docker dodati številko vrat kot spremenljivko okolja.

Poglejmo, kako lahko to storimo.

Najprej v našo datoteko docker dodajte okoljsko spremenljivko s svojo vrednostjo. Za to moramo datoteki docker dodati nov ukaz.

FROM node:latest WORKDIR /dockerTutorial COPY . . ENV PORT=3000 RUN npm install EXPOSE $PORT ENTRYPOINT ['node', 'app.js']

Z ukazom ENV, ki mu sledi ime spremenljivke in dodelitev vrednosti, lahko v datoteko docker dodamo novo spremenljivko okolja. Ste opazili, kako je bil spremenjen ukaz EXPOSE 3000, da izrecno ne omenja številke vrat? Namesto tega se sklicuje na ustvarjeno spremenljivko PORT, da dobi natančno številko vrat. Če moramo spremeniti številko vrat, moramo s tem pristopom spremeniti le eno mesto v naši kodi, kar olajša vzdrževanje naše aplikacije.

Zdaj smo spremenili datoteko docker, naslednji korak je sprememba app.js, da se sklicuje na ustvarjeno spremenljivko okolja. V ta namen nadomestimo številko vrat 3000, ki se uporablja znotraj metode poslušanja, s process.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') })

Ker smo spremenili svoje aplikacijske datoteke in dockerfile, moramo zgraditi novo sliko za nov vsebnik. Najprej pa moramo ustaviti trenutno delujoči vsebnik Docker, da to dosežemo.

Za zaustavitev vsebnika lahko uporabimo ukaz docker stop.

docker stop f10

Vrednost f10, uporabljena v tem ukazu, je prva tri števke ID-ja vsebnika.

Za zaustavitev tekočega vsebnika lahko uporabimo ukaz docker kill.

docker kill f10

Razlika med zaustavitvijo dockerja in zaustavitvijo dockerja je v tem, da zaustavitev dockerja bolj elegantno ustavi vsebnik tako, da sprosti uporabo virov in shrani stanje. docker kill pa zaustavi vsebnik nenadoma, ne da bi pravilno sprostil vire ali shranil stanje. Za zabojnik, ki deluje v proizvodnem okolju, je boljša izbira uporaba zaustavitvene postaje za zaustavitev posode.

Po zaustavitvi delujočega vsebnika z naslednjim ukazom očistite ostanke vsebnika iz gostiteljskega okolja.

Zagon vsebnika v načinu Daemon

Ko poskušate zagnati zgornje ukaze za zaustavitev vsebnika, bi opazili, da terminalskega zavihka, ki smo ga uporabili za ustvarjanje vsebnika, ni mogoče uporabiti za izvajanje dodatnih ukazov, razen če vsebnika ubijemo. Rešitev za to lahko najdemo z uporabo ločenega zavihka za izvajanje novih ukazov.

Vendar obstaja boljši pristop. Posodo lahko zaženemo v načinu demona. V načinu demona se vsebnik izvaja v ozadju, ne da bi za prikaz izhodov uporabil trenutni zavihek.

Če želite zagnati vsebnik v načinu demona, morate preprosto dodati dodatno zastavico -d ukazu za zagon dockerja.

docker run -d -p 8080:3000 docker-tutorial

Zagon vsebnika v interaktivnem načinu

Za zagon vsebnika v interaktivnem načinu bi moral vsebnik že delovati. Ko ste v interaktivnem načinu, lahko zaženete ukaze za dodajanje ali odstranjevanje datotek v vsebnik, seznam datotek ali zagon drugih bash ukazov, ki jih običajno uporabljamo.

Z naslednjim ukazom zaženite vsebnik v interaktivnem načinu.

docker exec -it e37 bash

Tu je e37 ID vsebnika. Poigrajte se z interaktivnim načinom z uporabo bash ukazov.



Zaključek

V prvi vadnici naše vadnice Docker ste se naučili, kako ustvariti vsebnik Docker za preprosto aplikacijo Node.js. Toda z Dockerjem in posodami lahko storite še več. V naslednjih vajah bomo videli, kako delati z bazami podatkov, nosilci in delati z več vsebniki, ki jih uporablja aplikacija, zgrajena z mikro storitvami.