Docker za početnike: što je Docker i kako stvoriti Docker spremnike

Da ste bili u kontaktu s najnovijim dostignućima u svijetu programiranja u posljednjih nekoliko godina, primijetili biste glasno brujanje oko Dockera i Dockerovih spremnika. Ova popularnost dockera nije bez razloga. Uvođenje Dockera uvelike je promijenilo način na koji programeri pristupaju razvoju aplikacija.

Tko želi biti zaostao kad takva revolucionarna tehnologija pogodi svijet programiranja? Dakle, danas započinjemo novu seriju vodiča da biste naučili kako koristiti Docker za razvoj aplikacija. Ako ste apsolutni početnik Dockera, ova je tutorial pravo mjesto za vas.

U prvom članku naše serije tutorijala želimo shvatiti što je točno Docker i zašto programeri toliko vole Docker. Također ćemo pripremiti jednostavnu Node.js aplikaciju radi dostavljanja kako bismo vas upoznali s osnovnim konceptima Dockera.

Zašto još čekati? Započnimo!

Što je Docker

Docker je alat koji se koristi za izgradnju aplikacija; to jest stvaranje, postavljanje i pokretanje aplikacija kroz spremnike.

S spremnikom su sve knjižnice i ostale ovisnosti potrebne za pokretanje aplikacije spakirane kao jedan paket za implementaciju.



Glavni cilj kontejnerizacije aplikacije je njihova izolacija od ostalih aplikacija pokrenutih u istom sustavu. Ovaj pristup osigurava da aplikacije ne ometaju rad jednih drugih i znatno olakšava održavanje aplikacija.

Iako su spremnici koji se izvode u istom sustavu izolirani jedan od drugog u izvršavanju, oni dijele isto jezgro OS-a. Stoga su spremnici lakši u usporedbi s alternativnim izborom za izoliranje izvršavanja aplikacija, virtualnim strojevima.

Kontejnerizirana aplikacija koja se izvodi na vašem Windows OS-u zajamčena je za rad bez problema na Windows računalu drugog korisnika unatoč promjeni okruženja.

Iako su se spremnici već dugo koristili prije Dockera, uvođenje Dockera populariziralo je korištenje kontejnera u zajednici programera. Dvije su komponente koje se koriste prilikom dodavanja dokumenata u program: Dockerfile i Docker slika . Otkrijmo što su.

Dockerfile

Dockerfile je tekstualna datoteka koja sadrži skup naredbi potrebnih za izgradnju slike dockera. Dockerfile između ostalog sadrži podatke o osnovnom OS-u, jeziku, mjestu datoteke i mrežnim priključcima.

Docker slika

Kada pokrenete Dockerovu naredbu gradnje s docker datotekom na mjestu, slika dockera kreira se na temelju datoteke docker. Oni djeluju kao predlošci za stvaranje zadnjeg spremnika dockera. Jednom stvorene, docker slike su statične. Možete se pozvati na naredbu Docker's run da biste stvorili spremnik dockera pomoću slike dockera.

Dokiranje Node.js aplikacije

U ovom uputstvu idemo na dockerizaciju Node.js aplikacije. Slijedit ćemo korak po korak kako bismo pokrenuli i pokrenuli Docker spremnik.

1 - Stvaranje aplikacije Node.js 2 - Stvaranje datoteke docker 3 - Izrada slike dockera 4 - Izrada spremnika aplikacije

Prije ulaska u dockerizing naše aplikacije, provjerite jesu li Docker i Node.js instalirani u vašem sustavu

  • Instalirajte Docker na svoj sustav - u ovom uputstvu neću opisivati ​​kako instalirati Docker, ali možete slijediti Docker dokumentaciju i instalirati Docker na radnu površinu sustava Windows ili Ubuntu.
  • Preuzmite i instalirajte Node.js sa službenog web mjesta

Stvorite aplikaciju Node.js

Dođite do novog direktorija projekta iz naredbenog retka i pokrenite sljedeću naredbu da biste kreirali datoteku package.json koja sadrži informacije o ovisnostima o aplikaciji i početnoj skripti.

npm init -y

Zatim instalirajte i dodajte Express kao ovisnost o svojoj aplikaciji pokretanjem ove naredbe na naredbenom retku. Za izradu aplikacije koristit ćemo Express.

npm install express --save

To će dodati express kao ovisnost u naš package.json datoteka.

Sada možemo stvoriti Node aplikaciju uz pomoć Expressa.

Stvorite datoteku pod nazivom app.js u direktorij projekta i dodajte sljedeći kod u datoteku.

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

Gornji kôd stvara Node poslužitelj koji sluša dolazne zahtjeve na portu 3000. Ovu naredbu možete pokrenuti na naredbenom retku za pokretanje Node poslužitelja.

node app.js

Sada idite na svoj preglednik i slijedite URL http://localhost:3000 i vidjet ćete tekst Hello World! na stranici.

Izradili smo jednostavnu Node aplikaciju za naš projekt. Krenimo sada na stvaranje docker datoteke.

Stvorite Dockerfile

U datoteci docker pružamo informacije potrebne za izgradnju i pokretanje naše aplikacije Node u okruženju Docker.

To uključuje specificiranje jezika i njegove verzije koja se koristi u aplikaciji, postavljanje direktorija našeg projekta kao radnog imenika, kopiranje svih datoteka u radnom direktoriju, postavljanje mrežnog priključka i određivanje koja je datoteka ulazna točka u aplikaciju. U složenijim aplikacijama morat ćete postaviti i varijable okruženja i URL baze podataka u docker datoteci.

FROM node:latest WORKDIR /dockerTutorial COPY . . RUN npm install EXPOSE 3000 ENTRYPOINT ['node', 'app.js']
  • IZ naredba dohvaća sliku OS-a za pokretanje naše aplikacije na određenom OS-u iz Docker Hub-a. Docker Hub spremište je dokerskih slika koje možemo povući u lokalno okruženje. Dohvaćamo sliku temeljenu na Ubuntuu koja je instalirala Node.js. Korištenje 'najnovije' kao verzije čvora povlači sliku koja ima instaliranu najnoviju verziju čvora.
  • WORKDIR naredba postavlja radni direktorij aplikacije.
  • KOPIRATI naredba kopira datoteke iz trenutnog direktorija (na naredbenom retku) u radni direktorij koji je postavljen u prethodnom koraku. Možete odrediti ime datoteke za kopiranje ili upotrijebiti dvostruke točke za kopiranje svih datoteka u trenutnom direktoriju u radni direktorij.
  • TRČANJE naredba instalira sve ovisnosti potrebne za izgradnju aplikacije. To uključuje sve ovisnosti navedene u package.json datoteka.
  • IZLOŽITI naredba otvara priključak iz Dockerovog spremnika prema vanjskom svijetu. Ovaj port prima sve zahtjeve koje šaljemo u Docker spremnik. Port je posebno postavljen na 3000 jer je to port koji naša aplikacija Node unutar spremnika Docker koristi za preslušavanje zahtjeva.
  • ULAZNA TOČKA određuje kako pokrenuti aplikaciju. Docker se pridružuje nizu koji pružamo jednoj naredbi za pokretanje aplikacije. U ovom slučaju, node app.js.

Izrada Dockerove slike

Upotrijebite sljedeću naredbu za stvaranje slike Dockera iz datoteke docker.

docker build -t docker-tutorial .

Docker-tutorial naziv je Dockerove slike. Točka označava put datoteke do direktorija projekta, gdje se trenutno nalazimo u naredbenom retku.

Ako je slika OS navedena s IZ naredba, čvor: najnoviji , trenutno nije u vašem uređaju, povući će se iz Docker Hub-a kada pokrenete gornju naredbu.

Nakon povlačenja slike, svaka naredba u docker datoteci izvršit će se jedna po jedna.

Na kraju izvršenja, ako vidite poruku uspješno izgrađena , slika dockera aplikacije uspješno je izgrađena. Pokrenite ovu naredbu da biste vidjeli izgrađenu docker sliku u lokalnom spremištu slika.

docker images

Izlaz izgleda ovako

Stvaranje spremnika

Sada možemo koristiti izgrađenu sliku za stvaranje našeg Docker spremnika. Upotrijebite naredbu docker run za izradu spremnika.

docker run -p 8080:3000 docker-tutorial

Ovdje brojevi 8080 i 3000 označavaju vanjsku i unutarnju stranu spremnika. Vanjski port, 8080, port je koji koristimo za povezivanje s aplikacijom putem našeg preglednika. Interni port, 3000, je port koji naša aplikacija osluškuje za dolazne zahtjeve. Docker spremnik preslikava zadani vanjski port na unutarnji.

Posjetite URL http://localhost:8080 u pregledniku i provjerite imate li stranicu s Hello World! poruku koju ste dobili prilikom posjeta http://localhost:3000 prije. Ako je odgovor da, tada je vaš Docker spremnik pokrenut i pokrenut.

Ovu naredbu možete koristiti za prikaz svih aktivnih Docker spremnika na vašem uređaju.

docker ps

Naredba će vam dati ovakav izlaz. Ovdje možemo pronaći CONTAINER_ID i NAME tekućeg spremnika.

Dodavanje varijabli okoliša vašoj aplikaciji

Sjećate se kako sam spomenuo da aplikacija s varijablama okoliša zahtijeva više uputa u datoteci dockera? Vrijednost varijable okoliša mijenja se s okolinom u kojoj trče.

Imajte na umu kako smo izričito spomenuli port koji naša aplikacija Node sluša kada poslužitelj radi. Ovaj je pristup nefleksibilan i sklon pogreškama. U slučaju da našu aplikaciju pokrenemo u okruženju koje ne otvara priključak 3000 za Node poslužitelj, naša aplikacija prestaje raditi.

Najprikladnija implementacija je uklanjanje broja priključka iz aplikacije. Umjesto toga koristimo ime varijable umjesto broja porta i postavljamo vrijednost za tu varijablu u aktivnom okruženju. U našem slučaju, pokrenuto okruženje je Docker spremnik. Dakle, moramo dodati broj porta u datoteku docker-a kao varijablu okruženja.

Da vidimo kako to možemo učiniti.

Prvo dodajte varijablu okoliša u naš dockerfile s njegovom vrijednošću. Da bismo to postigli, u datoteku docker moramo dodati novu naredbu.

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

Korištenjem naredbe ENV nakon koje slijedi naziv varijable i dodjela vrijednosti, možemo dodati novu varijablu okoliša u našu dockerfile. Jeste li primijetili kako je naredba EXPOSE 3000 promijenjena tako da eksplicitno ne spominje broj porta? Umjesto toga, odnosi se na kreiranu varijablu PORT za dobivanje točnog broja porta. Ovim pristupom, ako moramo promijeniti broj porta, moramo promijeniti samo jedno mjesto u našem kodu, što olakšava održavanje naše aplikacije.

Sada smo promijenili datoteku docker, sljedeći korak je promjena app.js kako bi se odnosio na stvorenu varijablu okruženja. U tu svrhu zamjenjujemo broj porta 3000 koji se koristi unutar metode preslušavanja 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') })

Budući da smo izvršili promjene u datotekama aplikacije i datoteci docker, moramo izgraditi novu sliku za novi spremnik. Ali prvo, moramo zaustaviti trenutno pokrenut Docker spremnik da bismo to postigli.

Naredbu zaustavljanja dockera možemo koristiti za zaustavljanje spremnika.

docker stop f10

Vrijednost f10, koja se koristi u ovoj naredbi, prve su tri znamenke ID-a spremnika.

Možemo upotrijebiti naredbu, docker kill, da zaustavimo pokrenuti spremnik.

docker kill f10

Razlika između ubijanja i zaustavljanja dockera je u tome što zaustavljanje dockera gracioznije zaustavlja spremnik oslobađanjem korištenja resursa i spremanjem stanja. docker kill, međutim, naglo zaustavlja spremnik bez pravilnog oslobađanja resursa ili spašavanja stanja. Za kontejner koji radi u proizvodnom okruženju bolji je izbor upotreba zaustavne stanice za zaustavljanje spremnika.

Nakon zaustavljanja tekućeg spremnika, pobrinite se da očistite ostatke koje je spremnik ostavio iz okruženja domaćina pomoću sljedeće naredbe.

Pokretanje spremnika u Daemon modu

Kad pokušate pokrenuti gornje naredbe za zaustavljanje spremnika, primijetili biste da se kartica terminala koju smo koristili za izradu spremnika ne može koristiti za izvršavanje više naredbi ako ne ubijemo spremnik. Zaobilazno rješenje za to možemo pronaći pomoću zasebne kartice za pokretanje novih naredbi.

Ali postoji bolji pristup. Spremnik možemo pokrenuti u demonskom načinu. S načinom demona, spremnik radi u pozadini bez upotrebe trenutne kartice za prikaz izlaza.

Da biste pokrenuli spremnik u načinu demona, jednostavno morate dodati dodatnu -d zastavicu u naredbu pokretanja dockera.

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

Pokretanje spremnika u interaktivnom načinu

Da biste pokrenuli spremnik u interaktivnom načinu, spremnik bi već trebao biti pokrenut. Kad uđete u interaktivni način, možete pokretati naredbe za dodavanje ili uklanjanje datoteka u spremnik, popis datoteka ili pokretanje drugih bash naredbi koje obično koristimo.

Upotrijebite sljedeću naredbu za pokretanje spremnika u interaktivnom načinu.

docker exec -it e37 bash

Ovdje je e37 ID spremnika. Poigrajte se interaktivnim načinom rada pomoću bash naredbi.

Zaključak

U prvom vodiču iz naše serije vodiča za Docker naučili ste kako stvoriti Docker spremnik za jednostavnu aplikaciju Node.js. No, s Dockerom i spremnicima možete učiniti više. U našim predstojećim vodičima vidjet ćemo kako raditi s bazama podataka, volumenima i raditi s više spremnika koje koristi aplikacija izgrađena s mikroservisima.