I denne opplæringen skal vi ta en titt på historien om containerisering, Docker, dens komponenter, og hvordan du kommer i gang med å bruke den i vårt daglige arbeid. Men før vi dykker for dypt inn i opplæringen, la oss ta en titt på hva Docker er slik at vi får en forståelse av hva det er som vi skal jobbe med.
Docker er en åpen plattform for bygging, frakt og kjøring av distribuerte applikasjoner. Det gir programmerere, utviklingsgrupper og driftsingeniører den felles verktøykassen de trenger for å dra nytte av den distribuerte og nettverksbaserte naturen til moderne applikasjoner.
Som det fremgår av den formelle definisjonen av Docker over, hjelper det utviklere eller driftsingeniører med automatisering av infrastrukturmiljøet som applikasjoner trenger.
La oss si at du har et program skrevet i Node.js som bruker Express for RESTful service og MongoDB for data utholdenhet. La oss gjøre det mer komplekst og legge til flere forekomster av Node.js og Nginx Load Balancer foran Node.js-forekomster.
Ville det ikke vært bedre hvis jeg skriver ned installasjonstrinnene i en tekstfil og la noen installere hele miljøet for meg? Docker hjelper deg med å beholde alle komponentene i arkitekturen (Node.js eksempel, Nginx Web Server, MongoDB database, etc.) veldig enkelt..
Men hva er containerisering uansett? La oss ta en titt på historien om containeriseringsteknologi.
Det første containeriseringsprosjektet jeg kan huske er OpenVZ, som er en containerbasert virtualisering for Linux, som først ble utgitt i 2005. OpenVZ lar deg lage flere isolerte, sikre Linux-containere for å kjøre dem på samme fysiske server uten konflikter mellom applikasjoner.
Samtidig kom et annet prosjekt av FreeBSD opp, kalt Jails. Dette lar deg sette apper og tjenester i ett fengsel (vi kan kalle dette en container) ved hjelp av chroot.
Det var andre prosjekter som Solaris Containers, men hvorfor ble Docker blitt populært selv om alle containeriseringsprosjektene ovenfor er åtte år eldre enn Docker? Fortsett å lese for å utjevne Docker-kunnskapen din.
Før du forklarer hvordan Docker fungerer, la meg forklare hvordan containere fungerer. En container er noe relatert til operativsystem-nivå virtualisering som gjør at vi kan opprette flere isolerte brukerrom i stedet for bare en. Denne isolasjonen er laget ved å bruke chroot
.
Hovedforskjellen mellom Containere og VM er som følger. Når du lager flere virtuelle maskiner ved å bruke VM, blir operativsystemene og virtualiserte hardwares duplisert for hver gjest. Men hvis du oppretter flere beholdere, blir bare de operativsystemfordelingsrelaterte mappene opprettet fra bunnen av, mens delene som er relatert til Linux-kjernen, deles mellom containere. Du kan se på bildet under for å se forskjellen på en visuell måte.
Som du også kan se i skjemaet, hvis du lager Ubuntu og Mint-gjester ved hjelp av VM, blir deres Guest OS duplisert, selv om de bruker samme Linux-kjernen. Egentlig betyr distribusjon differensiering av binger og libs mapper, og Linux-kjernen er den samme.
Hvis du ser på det andre bildet ovenfor, vil du se at alt operativsystemnivåarkitekturen deles over beholdere, og bare binger og libs er laget fra grunnen til forskjellige containere. Docker Engine har navneområder, cgroups
, og SELinux, og hjelper deg med å orkestrere beholdere. Hvis du trenger ekstra informasjon om Docker Engine, kan du se på Dockers nettside.
Før du fortsetter med å forklare komponentene, kan du installere Docker på datamaskinen. Den har ganske grunnleggende trinn for å installere.
Docker har hovedsakelig to komponenter: Docker Engine og Docker Hub. Docker Engine er for orkestrerende containere, som jeg sa ovenfor, og Docker Hub er en SaaS-tjeneste for å administrere og dele applikasjonsstabler. Hvis du for eksempel vil bruke Redis med Docker, kan du trekke den til din lokale maskin ved å utføre følgende kommando:
docker pull redis
Dette henter alle lagene på containerbildet og vil være klar til å kjøre på ditt miljø. Du kan se på Docker Hub for mange lagre.
Docker har også et spesielt filsystem kalt AUFS (ENdvanced Multi Layered Uforstørrelse File System). Med dette systemet holdes hver enkelt forandringsendring i lag, som versjonskontroll. Hvis du gjør en endring i Docker-bildet ditt, vil det bli holdt som en annen forpliktelse, og den vil ikke bli fullstendig gjenoppbygd på byggeoperasjonen. Alle de andre lagene er bygget før.
I tillegg, når du trekker et repository til din lokale datamaskin, vil du se at hentingen er laget lag for lag. La oss si at du har gjort en endring, og du tester den nye beholderen, men det mislykkes. Ikke noe problem, du kan rulle tilbake endringene og gjenoppbygge som du alltid gjør det i Git.
Forutsatt at Docker allerede er installert på datamaskinen, kan vi komme i gang med noen ganske kule Docker-kommandoer.
dokkingstasjonen drar ubuntu-dokkingstasjonen - en ubuntu bash
Som du kan gjette, vil kommandoen ovenfor hente ubuntu-bildet fra Docker Hub og kjøre det etterfulgt av bash-kommandoen.
Du vil se at du er inne i beholderen etter å ha utført kommandoen ovenfor. Du er nå i Ubuntu-skall og fri til å utføre * nix-kommandoer. Du kan lage noe, slette noe, se prosesser, osv.
Vær imidlertid forsiktig fordi når du forlater containeren, vil dataene dine gå tapt. Hvorfor? Fordi du trenger å designe beholderne som uforanderlige.
Første design hvilke pakker vil bli inkludert, hvilke applikasjoner vil klones inn i beholderen, etc., og kjør deretter beholderen din. Når du feiler på noe, må du kunne endre konfigurasjonen og kjøre igjen. Ikke hold tilstanden i beholderne dine.
For å kunne kjøre containeren, kan du bruke følgende format.
docker kjøre [OPTIONS] IMAGE [: TAG | @DIGEST] [COMMAND] [ARG ...]
Det finnes mange parametere tilgjengelig i Docker for kjøreoperasjonen. Du kan referere til dokumentasjonen for alle alternativene, men jeg vil gi deg et par eksempler for virkelig bruk.
docker kjøre -d redis
Denne kommandoen kjører et Redis-bilde i frittliggende modus. Dette betyr at hele I / O-en vil bli gjort gjennom nettverk eller delte tilkoblinger. Du kan anta at den kjører i daemon-modus. Vi har sagt Redis
her, men du kan også spesifisere bildeforfatteren og taggen ved å bruke en kommando som den nedenfor.
docker kjøre -d huseyinbabal / mongodb: 1.0
Vi kjører a mongodb
bilde som tilhører huseyinbabal
med spesifikk versjon 1.0
.
Du kan også kjøre bildet ditt interaktivt slik:
docker kjøre-en huseyinbabal / ubuntu: 1,2 bash
Når du kjører kommandoen ovenfor, vil den løpe ubuntu 1.2
og kjør deretter en bash
beordre å legge ledeteksten inn i terminalen inne i beholderen.
Vi har kjørt bilder som er trukket fra Docker Hub Repository. Hva med å bygge vårt eget bilde? Vi kan gjøre det ved å bruke kommandoen Docker build, men vi må spesifisere a Dockerfile
å la Docker kjøre alle setninger definert i Dockerfile.
FRA ubuntu MAINTAINER Huseyin BABAL RUN apt-key advkeykeerver keyserver.ubuntu.com --recv 7F0CEB10 RUN ekko "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | tee -a /etc/apt/sources.list.d/10gen.list RUN apt-get oppdatering RUN apt-get -y installer apt-utils Kjør apt-get -y installer mongodb-10gen RUN ekko "noen configs" >> /etc/mongodb.conf CMD ["/ usr / bin / mongod", "--config", "/etc/mongodb.conf")
Dette er en veldig enkel Dockerfile-definisjon som hjelper oss med å bygge bildet vårt. I denne Dockerfile-definisjonen sier vi først og fremst at vi vil arve alle egenskapene fra ubuntu-bildet. Dette bildet hentes først fra din lokale server. Hvis den ikke kan bli funnet, hentes den fra Docker Hub.
På den andre linjen definerer vi forfatteren eller vedlikeholderen av bildet. I de følgende filene kjører vi bare * nix-kommandoer med RUN-kommandoen for å installere viktige pakker og MongoDB-relaterte pakker. For å starte MongoDB, skriver vi mongodb.conf
, og i det siste trinnet kjører vi kommandoen ved å bruke CMD
.
For å kunne kjøre bildet vårt, bør vi bygge bildet ved å bruke denne Dockerfilen. Du kan bruke følgende til å bygge bildet.
docker build -t huseyinbabal / mongodb: 1.0 .
Dette vil bare bygge et bilde med en tagg huseyinbabal / mongodb: 1.0
og vil bruke Dockerfile i den nåværende mappen (se prikken på slutten av kommandoen). For å teste om den er opprettet eller ikke, kan du bruke følgende kommando.
docker bilder
Dette vil liste opp alle bildene som finnes på datamaskinen din som nedenfor.
Hvis du vil kjøre et innebygd bilde, kan du bare kjøre:
docker kjøre -d huseyinbabal / mongodb: 1.0
Men vent! Dette er daemon node. Så, hvordan kan jeg gå inn i denne containeren? Det er veldig enkelt. Først får du navnet på mongodb-containernes navn ved å bruke følgende kommando.
docker ps
Du ser en utgang som nedenfor.
Du kan se navnet i kolonnen NAMES. Nå er det på tide å gå inn i beholderen med følgende kommando.
docker exec -i -tbash
Du kan se de løpende prosessene i denne beholderen.
Som jeg sa før, hvis du lukker kjørerbeholderen, vil alle dataene knyttet til denne beholderen gå tapt. Dette er normalt i Docker World.
For eksempel, i vår container, skriver MongoDB alle dataene i en sti spesifisert i mongodb.conf. Denne mappen finnes i containeren, og hvis du lukker beholderen, vil alle dataene gå tapt. Hvis du vedvarer dataene i en mappe som deles med en vertsmaskin som Docker kjører, kan du bruke -v
alternativet inne i løpe
kommando. For eksempel:
docker kjøre -d -v / vert / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1.0
Dette vil kartlegge /vert / mongo_db_path
som er i din vertsmaskin til /Beholderen / mongo_data_path
som er i beholderen. Når mongo skriver data til stien inne i containeren, blir den automatisk tilgjengelig i vertsmaskinen. Selv om du lukker beholderen, forblir dataene i banen inne i vertsmaskinen.
La si at MongoDB løper inne i containeren. Du kan utsette MongoDB-porten utenfor beholderen på port 27017, og du kan bruke følgende kommando for å få tilgang fra utenfor beholderen med port 5000.
docker kjøre -d-P 5000: 27017 -v / vert / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1.0
Så du kan koble til MongoDB inne i beholderen utenfra ved å bruke port 5000.
La si at du trenger nettverksinformasjonen til den angitte beholderen. Du kan hente den detaljene ved å bruke docker inspisere
kommando. Denne kommandoen vil skrive ut mange metadata om beholderen.
er den delen som finnes i CONTAINER ID
i docker ps
produksjon. Utgangen av inspeksjonen vil være i JSON-format. For å få IP-adressen til beholderen, kan du bruke:
docker inspisere - formatet .NetworkSettings.IPAddress '
Ovennevnte kommandoer er de grunnleggende mens du gjør Docker ting. Hvis du trenger å lære mye om Docker-kommandoer, vennligst se dokumentasjonen.
Det er best praksis å gi bare ett ansvar til hver container. Det jeg mener her er, bør du ikke installere MongoDB- og Spring Boot-applikasjoner i en container for å betjene DB- og Application-lagene i en container. I stedet for det kan du sette en app i en beholder. Hver applikasjonseksempel, databasemedlem, meldingskø, etc., skal bare angi én container.
La oss si at du legger applikasjons- og databaselagene i en beholder. Det vil være svært vanskelig å måle ytelse eller diagnostikk for applikasjonen eller databasen. På samme måte, hvis du ønsker å skalere søknaden din, vil du ikke kunne skalere den beholderen fordi det også er et databaseprogram installert i den beholderen.
Når du kjører din container, må du aldri ssh inn i den aktuelle beholderen for å oppdatere eller slette noe. Hovedgrunnen til å bruke Docker er å holde endringene i Dockerfile historisk. Hvis du vil endre noe, endrer du Dockerfile, bygg bildet og kjør beholderen. Selv om du endrer noe inne i containeren manuelt, vil den bli slettet hvis den beholderen er re-run.
Normalt vil du kanskje skrive hver kommando på egne linjer som nedenfor.
Fra ubuntu MAINTAINER Huseyin BABAL RUN apt-get oppdatering Kjør apt-get install -y build-essential Kjør apt-get install -y php5 Kjør apt-get install -y nginx CMD ["nginx", "g", "demonen" "] EXPOSE 80
Dette betyr ett lag for hver linje. Det er ikke en foreslått måte å konstruere Dockerfile på. Du kan skille kommandoene dine med et tilbakeslag (\) for hver gruppe jobber, som nedenfor:
FRA Ubuntu: 15.04 HOLDING Huseyin BABAL RUN apt-oppdatering \ -y build-essential -y php5 \ -y nginx = 1.7.9 \ apt-få ren CMD ["nginx", "g", "demon off;"] EXPOSE 80
I ovennevnte Dockerfile har vi planlagt å installere de nødvendige pakkene på en linje og utført a ren
drift for å gjøre miljøet rent. Ved å gjøre dette skapte vi ikke separate lag for hver kommando.
Å bygge og kjøre en container er veldig enkle ting. Etter to måneder kan du ende opp med 50 beholdere for din applikasjonsarkitektur! Det vil være svært vanskelig å finne årsaken til et problem hvis det oppstår feil i beholderne.
Den enkle måten å håndtere dette på er å logge opp containeraktiviteten i et sentralt loggsystem. For eksempel, omdiriger dine stdout-logger til en loggfil i hver container. Og en agent kan streame disse logginnholdene til et sentralt loggstyringssystem som ELK, eller Splunk. Hvis du sender containerspesifikke data i logger, for eksempel container ID, vil det være veldig enkelt å filtrere feil på logghåndteringspanelet.
Du vil kanskje overvåke beholderen selv. Denne gangen kan du se på Google cadvisor. Dette lar deg overvåke beholderen din via en REST-tjeneste. For eksempel, for å se containerinformasjon, kan du lage en GET-forespørsel til http: // vertsnavn
/api/v1.0/containers/
.
Hvis du bruker standardprosedyrer til containerens livssyklus, vil det være veldig enkelt å kontrollere den generelle arkitekturen. For eksempel kan du opprette en basisbeholder for å arve noen operasjoner i andre beholdere. På den annen side kan du bruke standardsteder for config-filer, loggfiler og kildefiler. Vær forsiktig med å bruke en separat Dockerfil for hver container. Til slutt, bruk versjonering til alle dine containere for å skille mellom funksjoner og bruk ulike versjoner i henhold til dine behov.
Sikkerhet er et svært viktig tema når det gjelder containere. Kjør alltid containrene dine i uønsket modus. Jeg foreslår at du bruker Apparmor for å beskytte beholderen mot eksterne tråder, til og med nulldagsangrep. Jeg foreslår også SELinux for dine containere å bruke sikkerhetsregler for tilgangskontroll i henhold til dine behov. Fortsett også med oppdateringene av bildene du bruker i containere for å bruke de nyeste oppdateringene på beholderen. Mens du gjør dette, ikke glem å pinne bildet ditt til en stabil versjon.
Modulus er en fullt støttet enterprise distribusjon og orkestrasjon plattform. De startet først med en Node.js-fokusert PaaS på toppen av LXC, og da bestemte de seg for å bytte til Docker, og dette la dem støtte flere språk forskjellig fra Node.js, dvs. PHP, Java, Python og Static-prosjekter.
Det jeg mener ved å støtte språk her er at du kan distribuere søknaden din skrevet på språkene over til Modul med en enkelt kommando med forhåndsdefinerte egenskaper. La si at du vil distribuere Node.js-programmet til modulen, og det eneste du må gjøre er å utføre moduler distribuere
inne i prosjektmappen din. Modul består av følgende komponenter.
Modul CLI er for distribusjonsoperasjonen for søknaden din fra kommandolinjen, og kan enkelt installeres med npm installer -g modulus
. Du kan opprette prosjekter, distribuere prosjekter, streame logger og gjøre noen databaselaterte operasjoner med Modulus CLI. Alternativt kan du distribuere prosjektet ditt ved å laste opp om adminpanelet.
Du kan opprette og distribuere søknaden din med et par enkle trinn. Du kan velge språk, servostørrelse og plassering. Så gjør deg klar til å distribuere prosjektet ditt.
Alternativt kan du opprette et prosjekt på kommandolinjen med modulprosjekt opprette
og så moduler distribuere
.
Du vil kanskje lagre noen data i søknaden din. Modulus lar deg også legge til en database i søknaden din. MongoDB brukes bak kulissene. Du kan gå og lage en database i dashbordet, og du kan også lage en database på kommandolinjen. Du kan se databaseskjermen nedenfor.
Du kan ta tak i databasen URL på detalj skjermen og bruke den i dine applikasjoner.
Du kan hale programlogger fra kommandolinjen med modul logger hale
, eller du kan streame logger på dashbordet som nedenfor.
Når du klikker på STRØM knappen, du kan se loggene i sanntid.
Det er hovedkomponentene i modulen. Du kan se på andre komponenter som metrics, Auto-skalering, Addons, Varsler, og Administrasjon på modulet dashbordet.
Vi har diskutert containere og gitt en kort historie. Sammenliknet med VM, har Docker mange alternativer for å administrere din applikasjonsinfrastruktur.
Hvis du bruker Docker for arkitekturen din, må du være forsiktig med noen begreper, som Enkelt ansvar, Immutable Servers, Security, Application og Container Monitoring.
Når systemet blir større, vil det være veldig enkelt å kontrollere. Modulus er et av selskapene som bruker Docker for sitt PaaS-system. Ved å bruke kraften i Docker har Modulus designet et flott system for å hjelpe folk å distribuere sine applikasjoner skrevet i Node.js, PHP, Java og Python veldig enkelt..