Što je Docker? Iskra za revoluciju kontejnera

Docker je softverska platforma za izgradnju aplikacija temeljenih na spremnicima - malim i laganim izvedbenim okruženjima koja zajednički koriste jezgru operativnog sustava, ali se inače izvode međusobno izolirano. Iako kontejneri kao koncept postoje već neko vrijeme, Docker, projekt otvorenog koda pokrenut 2013. godine, pomogao je popularizirati tehnologiju i pomogao pokrenuti trend prema kontejnerizaciji i mikrouslugama  u razvoju softvera koji je poznat kao oblak izvorni razvoj.

Što su kontejneri?

Jedan od ciljeva modernog razvoja softvera je zadržati aplikacije na istom hostu ili klasteru međusobno izolirane kako ne bi neopravdano ometale međusobno rad ili održavanje. To može biti teško zahvaljujući paketima, knjižnicama i ostalim softverskim komponentama potrebnim za njihovo pokretanje. Jedno od rješenja ovog problema bili su virtualni strojevi koji drže aplikacije na istom hardveru potpuno odvojenim i smanjuju sukobe među softverskim komponentama i konkurenciju za hardverske resurse na minimum. No virtualni su strojevi glomazni - svaki zahtijeva svoj OS, takav je i veličine gigabajta - i težak za održavanje i nadogradnju.

S druge strane, spremnici međusobno izoluju okruženja izvršavanja aplikacija, ali dijele osnovnu jezgru OS-a. Obično se mjere u megabajtima, koriste mnogo manje resursa od VM-ova i pokreću se gotovo odmah. Mogu se spakirati daleko gušće na isti hardver i masovno vrtjeti gore-dolje uz daleko manje napora i troškova. Spremnici pružaju vrlo učinkovit i vrlo granuliran mehanizam za kombiniranje softverskih komponenata u vrste aplikacijskih i servisnih nizova potrebnih u modernom poduzeću te za održavanje i ažuriranje i održavanje tih softverskih komponenti.

Lučki radnik

Što je Docker?

Docker je projekt otvorenog koda koji olakšava stvaranje spremnika i aplikacija temeljenih na spremnicima. Izvorno izgrađen za Linux, Docker sada radi i na sustavima Windows i MacOS. Da bismo razumjeli kako Docker funkcionira, pogledajmo neke komponente koje biste koristili za stvaranje Docker-kontejneriranih aplikacija.

Dockerfile

Svaki spremnik Dockera započinje datotekom Docker . Dockerfile je tekstualna datoteka napisana u lako razumljivoj sintaksi koja uključuje upute za izgradnju Dockerove slike (o tome više u trenutku). Dockerfile navodi operativni sustav koji će biti temelj spremnika, zajedno s jezicima, varijablama okoliša, lokacijama datoteka, mrežnim priključcima i ostalim komponentama koje su mu potrebne - i, naravno, što će kontejner zapravo raditi nakon što ga pokrenemo.

Paige Niedringhaus na ITNext ima dobru raščlambu sintakse Dockerfile-a.

Dockerova slika

Nakon što napišete svoju Dockerfile, pozivate builduslužni program Docker kako biste stvorili sliku na temelju te Dockerfile. Dok je Dockerfile skup uputa koji govore buildkako napraviti sliku, Docker slika je prijenosna datoteka koja sadrži specifikacije za koje će softverske komponente spremnik raditi i kako. Budući da će Dockerfile vjerojatno sadržavati upute o preuzimanju nekih softverskih paketa iz mrežnih spremišta, trebali biste voditi računa o tome da izričito navedete odgovarajuće verzije, inače bi vaša Dockerfile mogla proizvesti nedosljedne slike, ovisno o tome kada je pozvana. Ali kad se slika jednom stvori, ona je statična. Codefresh nudi detaljniji prikaz načina izrade slike.

Docker trči

Dockerov runuslužni program naredba je koja zapravo pokreće spremnik. Svaki spremnik je primjer slike. Spremnici su dizajnirani da budu privremeni i privremeni, ali se mogu zaustaviti i ponovno pokrenuti, što kontejner lansira u isto stanje kao kad je zaustavljeno. Dalje, istovremeno se može pokretati više instanci spremnika iste slike (sve dok svaki spremnik ima jedinstveno ime). Code Review ima sjajnu raščlambu različitih opcija za runnaredbu, kako biste imali osjećaj kako ona funkcionira.

Docker Hub

Iako je gradnja spremnika jednostavna, nemojte shvaćati da ćete svaku svoju sliku trebati graditi od nule. Docker Hub je SaaS spremište za dijeljenje i upravljanje spremnicima, gdje ćete pronaći službene Dockerove slike projekata otvorenog koda i dobavljača softvera te neslužbene slike šire javnosti. Možete preuzeti slike spremnika s korisnim kodom ili prenijeti vlastiti, podijeliti ih otvoreno ili ih umjesto toga učiniti privatnima. Ako želite, također možete stvoriti lokalni Docker registar. (Docker Hub je u prošlosti imao problema sa slikama koje su prenesene s ugrađenim backdoor-ima.)

Docker motor

Docker Engine jezgra je Dockera, temeljne tehnologije klijent-poslužitelj koja stvara i pokreće spremnike. Općenito govoreći, kad netko generički kaže Docker i ne govori o tvrtki ili ukupnom projektu, onda misli na Docker Engine. U ponudi su dvije različite verzije Docker Engine-a: Docker Engine Enterprise i Docker Engine Community.

Docker Community Edition

Docker je svoje izdanje Enterprise izdao 2017. godine, ali njegova originalna ponuda, preimenovana u Docker Community Edition, i dalje je otvorena i besplatna te u procesu nije izgubila nijednu značajku. Umjesto toga, Enterprise Edition, koji košta 1.500 USD po čvoru godišnje, dodao je napredne značajke upravljanja, uključujući kontrole za upravljanje klasterima i slikama, te praćenje ranjivosti. Blog BoxBoat donosi pregled razlika između izdanja.

Kako je Docker osvojio svijet kontejnera

Ideja da se određeni proces može izvoditi s određenim stupnjem izolacije od ostatka svog operativnog okruženja desetljećima je ugrađena u Unix operativne sustave kao što su BSD i Solaris. Izvorna tehnologija kontejnera Linux, LXC, metoda je virtualizacije na razini OS-a za pokretanje više izoliranih Linux sustava na jednom hostu. LXC su omogućile dvije značajke Linuxa: imenski prostori koji umotavaju skup sistemskih resursa i prikazuju ih procesu kako bi izgledalo kao da su posvećeni tom procesu; i cgroups, koje upravljaju izolacijom i korištenjem sistemskih resursa, poput CPU-a i memorije, za grupu procesa.

Spremnici razdvajaju aplikacije od operativnih sustava, što znači da korisnici mogu imati čist i minimalan Linux operativni sustav i pokretati sve ostalo u jednom ili više izoliranih spremnika. A budući da je operativni sustav apstrahiran dalje od spremnika, spremnik možete premjestiti preko bilo kojeg Linux poslužitelja koji podržava okruženje izvođenja spremnika.

Docker je uveo nekoliko značajnih promjena u LXC koje čine spremnike prijenosnijim i fleksibilnijim za upotrebu. Korištenjem Dockerovih spremnika možete rasporediti, umnožiti, premjestiti i sigurnosno kopirati radno opterećenje još brže i jednostavnije nego što to možete učiniti pomoću virtualnih strojeva. Docker donosi fleksibilnost nalik oblaku u bilo koju infrastrukturu sposobnu za pokretanje spremnika. Dockerovi alati za slike spremnika također su napredak u odnosu na LXC, omogućavajući programeru da gradi biblioteke slika, sastavlja aplikacije iz više slika i pokreće te spremnike i programe na lokalnoj ili udaljenoj infrastrukturi.

Docker Compose, Docker Swarm i Kubernetes

Docker također olakšava koordinaciju ponašanja između spremnika, a time i izradu snopova aplikacija spajanjem spremnika. Docker Compose stvorio je Docker kako bi pojednostavio postupak razvoja i testiranja aplikacija s više spremnika. To je alat naredbenog retka, koji podsjeća na Docker klijenta, koji uzima posebno oblikovanu datoteku deskriptora za sastavljanje aplikacija iz više spremnika i njihovo zajedničko pokretanje na jednom hostu. (Pogledajte tutorial za Docker Compose da biste saznali više.)

Naprednije verzije ovog ponašanja - ono što se naziva orkestracijom spremnika - nude drugi proizvodi, poput Docker Swarm i Kubernetes. Ali Docker pruža osnove. Iako roj izrastao iz projekta Docker, Kubernetes je postao de facto Docker orkestracija platforma izbora.

Docker prednosti

Docker kontejneri pružaju način za izgradnju poslovnih i poslovnih aplikacija koje je lakše sastaviti, održavati i kretati se od njihovih uobičajenih kolega. 

Docker spremnici omogućuju izolaciju i prigušivanje

Docker spremnici drže aplikacije izolirane ne samo jedna od druge, već i od osnovnog sustava. Ovo ne samo da omogućuje čistiji snop softvera, već olakšava diktiranje kako određena spremnička aplikacija koristi sistemske resurse - CPU, GPU, memoriju, I / O, umrežavanje itd. Također olakšava osiguravanje odvojenosti podataka i koda. (Pogledajte "Docker-spremnici bez državljanstva i nepromjenjivi", u nastavku.)

Docker spremnici omogućuju prenosivost

Spremnik Docker izvodi se na bilo kojem stroju koji podržava radno okruženje spremnika. Aplikacije ne moraju biti povezane s glavnim operativnim sustavom, tako da i aplikacijsko okruženje i osnovno operativno okruženje mogu biti čisti i minimalni.

Na primjer, MySQL za Linux spremnik pokrenut će se na većini bilo kojeg Linux sustava koji podržava spremnike. Sve ovisnosti za aplikaciju obično se isporučuju u istom spremniku.

Aplikacije temeljene na spremnicima mogu se lako premjestiti iz pretplatničkih sustava u oblačna okruženja ili s prijenosnih računala programera na poslužitelje, sve dok ciljani sustav podržava Docker i bilo koji od alata treće strane koji bi mogli biti u upotrebi s njim, poput Kubernetes (pogledajte "Docker spremnici olakšavaju orkestraciju i skaliranje", dolje).

Obično se slike spremnika Dockera moraju graditi za određenu platformu. Na primjer, Windows spremnik neće raditi na Linuxu i obrnuto. Prije je jedan od načina zaobilaženja ovog ograničenja bio pokretanje virtualnog stroja koji je pokrenuo instancu potrebnog operativnog sustava i pokretanje spremnika u virtualnom stroju.

Međutim, tim Dockera od tada je osmislio elegantnije rješenje, nazvano  manifestima , koje omogućavaju da se slike za više operativnih sustava spakiraju jedna do druge u istu sliku. Manifesti se još uvijek smatraju eksperimentalnim, ali nagovještavaju kako spremnici mogu postati rješenje za više platformi kao i rješenje za više okoliša. 

Docker spremnici omogućuju komponiranje

Većina poslovnih aplikacija sastoji se od nekoliko zasebnih komponenti organiziranih u stog - web poslužitelja, baze podataka i predmemorije u memoriji. Spremnici omogućuju sastavljanje tih dijelova u funkcionalnu jedinicu s lako promjenjivim dijelovima. Svaki komad daje drugi spremnik i može se održavati, ažurirati, mijenjati i mijenjati neovisno o drugima.

Ovo je u osnovi model mikroservisa dizajna aplikacija. Dijeleći funkcionalnost aplikacije na zasebne, samostalne usluge, model mikrousluga nudi protuotrov za usporavanje tradicionalnih razvojnih procesa i nefleksibilnih monolitnih aplikacija. Lagani i prijenosni spremnici olakšavaju izgradnju i održavanje aplikacija temeljenih na mikrouslugama.

Docker spremnici olakšavaju orkestraciju i skaliranje

Budući da su spremnici lagani i nameću malo troškova, moguće je pokrenuti još mnogo njih na danom sustavu. No, spremnici se također mogu koristiti za skaliranje aplikacije kroz klastere sustava i za rampiranje usluga prema gore ili dolje kako bi se zadovoljile velike potražnje ili uštedjeli resursi.

Većina inačica alata za implementaciju, upravljanje i skaliranje spremnika za organizaciju poduzeća pružaju se putem projekata nezavisnih proizvođača. Glavni među njima je Googleov Kubernetes, sustav za automatizaciju raspoređivanja i skaliranja spremnika, ali i međusobno povezivanje, uravnoteženje opterećenja i upravljanje. Kubernetes također nudi načine za stvaranje i ponovnu upotrebu definicija aplikacija s više spremnika ili "Helm charts", tako da se složeni skupovi aplikacija mogu graditi i upravljati njima na zahtjev.

Docker također uključuje vlastiti ugrađeni sustav orkestracije, način rada Roj, koji se i dalje koristi za slučajeve koji su manje zahtjevni. To je reklo, Kubernetes je postao nešto od zadanog izbora; zapravo je Kubernetes u paketu s Docker Enterprise Edition.

Docker upozorenja

Spremnici rješavaju velik broj problema, ali nisu lijek za sve. Neki od njihovih nedostataka su prema dizajnu, dok su drugi nusproizvodi njihovog dizajna.

Docker spremnici nisu virtualni strojevi

Najčešća konceptualna pogreška koju ljudi čine s kontejnerima jest izjednačavanje s virtualnim strojevima. Međutim, budući da spremnici i virtualni strojevi koriste različite izolacijske mehanizme, oni imaju izrazito različite prednosti i nedostatke.

Virtualni strojevi pružaju visok stupanj izolacije za procese, jer se izvode u vlastitom primjerku operativnog sustava. Ni taj operativni sustav ne mora biti isti kao onaj pokrenut na hostu. Virtualni stroj Windows može se izvoditi na Linux hipervizoru i obrnuto.

Nasuprot tome, spremnici koriste kontrolirane dijelove resursa operativnog sustava domaćina; mnoge aplikacije dijele istu jezgru OS-a, na vrlo upravljan način. Kao rezultat toga, kontejnerske aplikacije nisu toliko temeljito izolirane kao virtualni strojevi, ali pružaju dovoljno izolacije za veliku većinu radnih opterećenja.

Docker kontejneri ne pružaju brzinu golog metala