Programmering

Hva er Docker? Gnisten for containerrevolusjonen

Docker er en programvareplattform for å bygge applikasjoner basert på containere - små og lette utførelsesmiljøer som bruker operativsystemkjernen, men ellers kjører isolert fra hverandre. Mens containere som konsept har eksistert i noen tid, hjalp Docker, et open source-prosjekt som ble lansert i 2013, med å popularisere teknologien, og har bidratt til å drive trenden mot containerisering og mikrotjenester i programvareutvikling som har blitt kjent som sky-native utvikling.

Hva er containere?

Et av målene med moderne programvareutvikling er å holde applikasjoner på samme vert eller klynge isolert fra hverandre slik at de ikke unødvendig forstyrrer hverandres drift eller vedlikehold. Dette kan være vanskelig takket være pakkene, bibliotekene og andre programvarekomponenter som kreves for at de skal kjøre. En løsning på dette problemet har vært virtuelle maskiner, som holder applikasjoner på samme maskinvare helt atskilt, og reduserer konflikter mellom programvarekomponenter og konkurranse om maskinvareressurser til et minimum. Men virtuelle maskiner er klumpete - hver krever sitt eget operativsystem, det er vanligvis gigabyte i størrelse - og vanskelig å vedlikeholde og oppgradere.

Beholderederimot, isoler applikasjonsutførelsesmiljøer fra hverandre, men del den underliggende OS-kjernen. De måles vanligvis i megabyte, bruker langt færre ressurser enn virtuelle maskiner og starter opp nesten umiddelbart. De kan pakkes langt tettere på samme maskinvare og spinnes opp og ned en masse med langt mindre innsats og overhead. Beholdere gir en svært effektiv og meget granulær mekanisme for å kombinere programvarekomponenter i de typer applikasjons- og servicestabler som trengs i en moderne bedrift, og for å holde programvarekomponentene oppdatert og vedlikeholdt.

Docker

Hva er Docker?

Docker er et open source-prosjekt som gjør det enkelt å lage containere og containerbaserte apper. Opprinnelig bygget for Linux, kjører Docker nå også på Windows og MacOS. For å forstå hvordan Docker fungerer, la oss ta en titt på noen av komponentene du vil bruke til å lage Docker-containeriserte applikasjoner.

Dockerfil

Hver Docker-container starter med en Dockerfil. En Dockerfile er en tekstfil skrevet i en lettfattelig syntaks som inneholder instruksjonene for å bygge en Docker bilde (mer om det om et øyeblikk). En Dockerfile spesifiserer operativsystemet som skal ligge til grunn for beholderen, sammen med språk, miljøvariabler, filplasseringer, nettverksporter og andre komponenter den trenger - og selvfølgelig hva beholderen faktisk gjør når vi kjører den.

Paige Niedringhaus over på ITNext har en god oversikt over syntaksen til en Dockerfile.

Docker-bilde

Når du har skrevet Dockerfilen din, påkaller du Docker bygge verktøy for å lage en bilde basert på den Dockerfile. Mens Dockerfile er settet med instruksjoner som forteller bygge hvordan lage bildet, et Docker-bilde er en bærbar fil som inneholder spesifikasjonene for hvilke programvarekomponenter beholderen skal kjøre og hvordan. Fordi en Dockerfile sannsynligvis vil inneholde instruksjoner om å hente noen programvarepakker fra online arkiver, bør du passe på å eksplisitt spesifisere de riktige versjonene, ellers kan Dockerfile produsere inkonsekvente bilder, avhengig av når den blir påkalt. Men når et bilde er opprettet, er det statisk. Codefresh gir deg en titt på hvordan du bygger et bilde mer detaljert.

Docker-løp

Docker’s løpe verktøyet er kommandoen som faktisk starter en container. Hver container er en forekomst av et bilde. Containere er designet for å være forbigående og midlertidige, men de kan stoppes og startes på nytt, noe som setter containeren i samme tilstand som da den ble stoppet. Videre kan flere containerforekomster av det samme bildet kjøres samtidig (så lenge hver container har et unikt navn). Code Review har en god oversikt over de forskjellige alternativene for løpe kommando, for å gi deg en følelse av hvordan det fungerer.

Docker Hub

Selv om det er enkelt å bygge containere, ikke skjønne at du trenger å bygge hvert eneste bilde fra bunnen av. Docker Hub er et SaaS-lager for deling og administrering av containere, hvor du finner offisielle Docker-bilder fra open source-prosjekter og programvareleverandører og uoffisielle bilder fra allmennheten. Du kan laste ned containerbilder som inneholder nyttig kode, eller laste opp din egen, dele dem åpent eller gjøre dem private i stedet. Du kan også opprette et lokalt Docker-register hvis du foretrekker det. (Docker Hub har tidligere hatt problemer med bilder som ble lastet opp med bakdører innebygd i dem.)

Docker-motor

Docker Engine er kjernen i Docker, den underliggende klientserverteknologien som oppretter og kjører containerne. Generelt sett når noen sier Docker generelt og snakker ikke om selskapet eller det totale prosjektet, de betyr Docker Engine. Det er to forskjellige versjoner av Docker Engine som tilbys: Docker Engine Enterprise og Docker Engine Community.

Docker Community Edition

Docker ga ut sin Enterprise Edition i 2017, men det opprinnelige tilbudet, omdøpt til Docker Community Edition, forblir åpen kildekode og gratis, og mistet ingen funksjoner i prosessen. I stedet la Enterprise Edition, som koster $ 1500 per node per år, avanserte administrasjonsfunksjoner, inkludert kontroller for klynge- og bildebehandling, og sårbarhetsovervåking. BoxBoat-bloggen har en oversikt over forskjellene mellom utgavene.

Hvordan Docker erobret containerverdenen

Ideen om at en gitt prosess kan kjøres med en viss grad av isolasjon fra resten av driftsmiljøet har vært innebygd i Unix-operativsystemer som BSD og Solaris i flere tiår. Den originale Linux-containerteknologien, LXC, er en virtualiseringsmetode på OS-nivå for å kjøre flere isolerte Linux-systemer på en enkelt vert. LXC ble muliggjort av to Linux-funksjoner: navnerom, som pakker inn et sett med systemressurser og presenterer dem for en prosess for å få det til å se ut som de er dedikert til den prosessen; og cgroups, som styrer isolering og bruk av systemressurser, for eksempel CPU og minne, for en gruppe prosesser.

Beholdere kobler fra applikasjoner fra operativsystemer, noe som betyr at brukere kan ha et rent og minimalt Linux-operativsystem og kjøre alt annet i en eller flere isolerte containere. Og fordi operativsystemet er abstrahert bort fra containere, kan du flytte en container på tvers av en hvilken som helst Linux-server som støtter containerens kjøretidsmiljø.

Docker introduserte flere viktige endringer i LXC som gjør containere mer bærbare og fleksible å bruke. Ved hjelp av Docker-containere kan du distribuere, replikere, flytte og sikkerhetskopiere en arbeidsbelastning enda raskere og enklere enn du kan gjøre det ved hjelp av virtuelle maskiner. Docker gir skylignende fleksibilitet til enhver infrastruktur som kan kjøre containere. Docker's containerbildeverktøy var også et fremskritt over LXC, slik at en utvikler kunne bygge biblioteker med bilder, komponere applikasjoner fra flere bilder og starte disse containere og applikasjoner på lokal eller ekstern infrastruktur.

Docker Compose, Docker Swarm og Kubernetes

Docker gjør det også lettere å koordinere atferd mellom containere, og bygg dermed applikasjonsstabler ved å feste containere sammen. Docker Compose ble opprettet av Docker for å forenkle prosessen med å utvikle og teste applikasjoner med flere containere. Det er et kommandolinjeverktøy, som minner om Docker-klienten, som tar inn en spesielt formatert deskriptor-fil for å samle applikasjoner ut av flere containere og kjøre dem sammen på en enkelt vert. (Ta en titt på Docker Compose-opplæringen for å lære mer.)

Mer avanserte versjoner av denne oppførselen - det som kalles container orkestrering— Tilbys av andre produkter, som Docker Swarm og Kubernetes. Men Docker gir det grunnleggende. Selv om Swarm vokste ut av Docker-prosjektet, har Kubernetes blitt de facto Valg av Docker-orkestrasjonsplattform.

Docker fordeler

Docker-containere gir en måte å bygge bedrifts- og bransjeapplikasjoner på som er enklere å montere, vedlikeholde og bevege seg rundt enn deres konvensjonelle kolleger. 

Docker-containere muliggjør isolering og struping

Docker-containere holder apper isolert ikke bare fra hverandre, men fra det underliggende systemet. Dette gir ikke bare en renere programvarestabel, men gjør det lettere å diktere hvordan en gitt containerisert applikasjon bruker systemressurser - CPU, GPU, minne, I / O, nettverk og så videre. Det gjør det også lettere å sikre at data og kode holdes atskilt. (Se "Docker-containere er statsløse og uforanderlige" nedenfor.)

Docker-containere muliggjør bærbarhet

En Docker-container kjører på alle maskiner som støtter containerens kjøretidsmiljø. Programmer trenger ikke å være knyttet til vertsoperativsystemet, så både applikasjonsmiljøet og det underliggende operativmiljøet kan holdes rent og minimalt.

For eksempel vil en MySQL for Linux-container kjøre på de fleste Linux-systemer som støtter containere. Alle avhengighetene for appen blir vanligvis levert i samme container.

Containerbaserte apper kan enkelt flyttes fra on-prem-systemer til sky-miljøer eller fra utviklers bærbare datamaskiner til servere, så lenge målsystemet støtter Docker og hvilket som helst av tredjepartsverktøyene som kan være i bruk med det, for eksempel Kubernetes (se "Docker-containere letter orkestrering og skalering," nedenfor).

Normalt må Docker-containerbilder bygges for en bestemt plattform. En Windows-container vil for eksempel ikke kjøre på Linux og omvendt. Tidligere var en vei rundt denne begrensningen å starte en virtuell maskin som kjørte en forekomst av det nødvendige operativsystemet, og kjøre containeren i den virtuelle maskinen.

Imidlertid har Docker-teamet siden utviklet en mer elegant løsning, kaltmanifesterer seg, som lar bilder for flere operativsystemer pakkes side om side i samme bilde. Manifester blir fortsatt ansett som eksperimentelle, men de antyder hvordan containere kan bli en applikasjonsløsning på tvers av plattformer så vel som en miljømessig løsning. 

Docker-containere muliggjør komposisjon

De fleste forretningsapplikasjoner består av flere separate komponenter organisert i en bunke - en webserver, en database, en hurtigbuffer i minnet. Beholdere gjør det mulig å komponere disse stykkene i en funksjonell enhet med deler som er lette å bytte ut. Hvert stykke er levert av en annen container og kan vedlikeholdes, oppdateres, byttes ut og modifiseres uavhengig av de andre.

Dette er i hovedsak mikroservicemodellen for applikasjonsdesign. Ved å dele applikasjonsfunksjonalitet i separate, selvstendige tjenester, tilbyr mikroservicemodellen en motgift for å bremse tradisjonelle utviklingsprosesser og ufleksible monolitiske apper. Lette og bærbare containere gjør det lettere å bygge og vedlikeholde mikrotjenestebaserte applikasjoner.

Docker-containere letter orkestrering og skalering

Fordi containere er lette og påfører lite overhead, er det mulig å lansere mange flere av dem på et gitt system. Men containere kan også brukes til å skalere en applikasjon på tvers av systemklynger, og for å rampe tjenester opp eller ned for å møte etterspørsel eller for å spare ressurser.

De mest versjoner av verktøyene for distribusjon, administrering og skalering av containere som tilbys av bedriften, leveres gjennom tredjepartsprosjekter. Hoved blant dem er Googles Kubernetes, et system for automatisering av hvordan containere distribueres og skaleres, men også hvordan de er koblet sammen, lastbalansert og administrert. Kubernetes gir også måter å opprette og gjenbruke definisjoner for applikasjoner med flere containere eller "Helm charts", slik at komplekse appstabler kan bygges og administreres etter behov.

Docker inkluderer også sitt eget innebygde orkestrasjonssystem, Swarm-modus, som fortsatt brukes i saker som er mindre krevende. Når det er sagt, har Kubernetes blitt noe av standardvalget; faktisk er Kubernetes bundet med Docker Enterprise Edition.

Docker forbehold

Beholdere løser mange problemer, men de er ikke helbredende. Noen av deres mangler er av design, mens andre er biprodukter av deres design.

Docker-containere er ikke virtuelle maskiner

Den vanligste konseptuelle feilen folk gjør med containere er å sidestille dem med virtuelle maskiner. Imidlertid, fordi containere og virtuelle maskiner bruker forskjellige isolasjonsmekanismer, har de tydelig forskjellige fordeler og ulemper.

Virtuelle maskiner gir høy grad av isolasjon for prosesser, siden de kjører i sin egen forekomst av et operativsystem. Operativsystemet trenger heller ikke være det samme som det som kjøres på verten. En virtuell Windows-maskin kan kjøre på en Linux hypervisor og omvendt.

Containere bruker derimot kontrollerte deler av vertsoperativsystemets ressurser; mange applikasjoner deler den samme OS-kjernen, på en høyt administrert måte. Som et resultat er ikke containeriserte apper så grundig isolert som virtuelle maskiner, men de gir nok isolasjon for de aller fleste arbeidsmengder.

Docker-containere gir ikke metallhastighet

$config[zx-auto] not found$config[zx-overlay] not found