Containere giver en let måde at tage applikationsarbejdsbelastninger bærbare, som en virtuel maskine, men uden omkostninger og bulk, der typisk er forbundet med virtuelle computere. Med containere kan apps og tjenester pakkes op og flyttes frit mellem fysiske, virtuelle eller sky-miljøer.
Docker, et containeroprettelses- og styringssystem oprettet af Docker Inc., tager den oprindelige containerfunktionalitet, der findes i Linux, og gør den tilgængelig for slutbrugere via en kommandolinjegrænseflade og et sæt API'er.
Mange almindelige applikationskomponenter er nu tilgængelige som færdigpakkede Docker-containere, hvilket gør det let at installere stakke software som afkoblede komponenter (mikroservicemodellen). Når det er sagt, hjælper det at vide, hvordan stykkerne passer sammen indefra og ud.
Således installerer jeg i denne vejledning Apache-webserveren i en Docker-container og undersøger, hvordan Docker fungerer undervejs.
Installer Docker
Jeg bruger Ubuntu som grundlaget for Docker-buildet. Ubuntu er ikke kun en populær og udbredt distribution, men Docker-teamet bruger selv Ubuntu til udvikling, og Docker understøttes på Ubuntu Server fra version 12.04 og nyere. For enkelheds skyld starter jeg med instruktioner, når jeg bruger en ny installation af Ubuntu 16.04.
Forbered Ubuntu Linux til Docker
Den første ting at gøre er at få den rigtige version af kernen og dens overskrifter:
$ sudo apt-get install - installation-anbefaler linux-generic-hwe-16.04
Denne proces kan tage noget tid og kræver en genstart, når du er færdig:
$ sudo genstart
Det kan også være nødvendigt at opgradere andre pakker i systemet bagefter:
$ sudo apt-get opdatering
$ sudo apt-get opgradering
Installer Docker på Ubuntu
Installation af Docker på CentOS-, Fedora-, Debian-, Ubuntu- og Raspbian Linux-distributioner er gjort let ved hjælp af et shell-script, som du kan downloade fra //get.docker.com/. Til det har du brug for krølle
kommando. For at få den nyeste version af krølle
:
sudo apt-get install krølle
Når du har gjort det krølle
installeret, hent installationsscriptet og indstillet det til at køre:
krølle -s //get.docker.com | sudo sh
Når scriptet er færdig med installationen, ser du en note som følgende med installationsoplysninger om versionen af Docker, både klienten og serverkomponenterne:

Bemærk detaljerne i bunden om at tilføje ikke-root-brugere til Docker. Det er praktisk at gøre dette, men hvis du gør det, anbefales det at oprette en ikke-root-bruger specifikt til at arbejde med Docker og til ingen anden funktion. Af hensyn til denne vejledning holder jeg dog med at bruge sudo
at køre Docker via en ikke-privilegeret bruger.
Nu kan du teste en grundlæggende Docker-container:
$ sudo docker kør -i -t ubuntu / bin / bash
Denne kommando downloader det generiske Docker Ubuntu-billede (i henhold til ubuntu
parameter) og kør / bin / bash
kommando i den container. Det -jeg
og -t
valgmuligheder åbner henholdsvis standardindgang og en pseudo TTY.
Hvis det lykkes, skal du se værtsnavnet i kommandoprompten skifte til noget lignende root @ 216b04387924: / #
, der angiver ID-nummeret (og værtsnavnet) på din nye kørende container. For at forlade, skriv Afslut
, samme som du ville forlade enhver shell-session.
Du skal nu have en funktionel Docker-installation på din server. Du kan teste det og få grundlæggende oplysninger ved hjælp af docker info
kommando:
Resultatet af En sidste ændring, du bliver nødt til at foretage, hvis du kører Ubuntu's UFW-firewall, er at give mulighed for videresendelse af pakker. Du kan kontrollere, om UFW kører ved at indtaste følgende: Hvis kommandoen returnerer status som inaktiv, kan du springe dette næste trin over. Ellers skal du redigere UFW-konfigurationsfilen / etc / default / ufw og ændre politikken til videresendelse fra Og skift denne linje: Til dette: Gem filen, og kør derefter: Docker-containere er meget mere effektive end virtuelle maskiner. Når en container ikke kører en proces, er den fuldstændig i dvale. Du kan måske tænke på Docker-containere som selvstændige processer - når de ikke kører aktivt, forbruger de ingen ressourcer bortset fra lagerplads. Du kan se aktive og inaktive containere ved hjælp af $ sudo docker ps Du kan se alle tilgængelige kommandoer ved blot at indtaste Da jeg løb En komplet, søgbar liste over billeder og arkiver er tilgængelig på Docker Hub. Noget, der er værd at stave på dette tidspunkt, er, hvordan billeder, containere og pull / push-processen fungerer sammen. Docker-containere er bygget fra billeder, som i det væsentlige er skaller af operativsystemer, der indeholder de nødvendige binære filer og biblioteker til at køre applikationer i en container. Billeder er mærket medtags, i det væsentlige metadata, der gør det let at gemme og trække forskellige versioner af et billede. Naturligvis kan et enkelt billede associeres med flere tags: Da jeg skrev Bemærk, at hvis jeg havde skrevet: Jeg ville have pullet alle billeder ( Den samme logik bag repos og tags gælder for andre manipulationer af billeder. Hvis du trak Tilbage til arbejde med billeder. Når du har trukket et billede, uanset hvad det måtte være, skal du oprette en live container fra det (som jeg har vist) ved at udføre Det er vigtigt at bemærke, at Docker kun gemmer deltas eller ændringer i billeder, der er bygget fra andre billeder. Når du bygger dine egne billeder, gemmes kun de ændringer, du foretager i basisbilledet, i det nye billede, som linker tilbage til basisbilledet for alle dets afhængigheder. Således kan du oprette billeder, der har en virtuel størrelse på 266MB, men kun tager et par megabyte på disken på grund af denne effektivitet. Fuldt konfigurerede containere kan derefter skubbes op til et centralt lager, der skal bruges andre steder i organisationen eller endda deles offentligt. På denne måde kan en applikationsudvikler udgive en offentlig container til en app, eller du kan oprette private arkiver til at gemme alle containere, der bruges internt af din organisation. Nu hvor du har en bedre forståelse af, hvordan billeder og containere fungerer, skal vi oprette en Apache-webservercontainer og gøre den permanent. Først skal du bygge en ny container. Der er et par måder at gøre dette på, men fordi du har et par kommandoer at køre, skal du starte en rodskal i en ny container: Dette opretter en ny container med et unikt ID og navnet root @ d7c8f02c3c8c: / # apt-get installer apache2 Bemærk, at du ikke behøver at bruge Det normale root @ d7c8f02c3c8c: / # apt-get install krølle root @ d7c8f02c3c8c: / # krølle // localhost Efter den sidste kommando skal du se den rå HTML på standard-Apache-siden vist i konsollen. Dette betyder, at vores Apache-server er installeret og kører i din container. Hvis du gjorde dette i et produktionsmiljø, ville du derefter konfigurere Apache til dine krav og installere en applikation, som den skal tjene. Docker letd-mapper uden for en container kortlægges til stier inde i den, så en tilgang er at gemme din webapp i et bibliotek på værten og gøre den synlig for containeren gennem en kortlægning. Husk, at en Docker-container kun kører, så længe dens proces eller processer er aktive. Så hvis den proces, du starter, når du kører en container første gang, som en systemdæmon, stopper Docker containeren. Derfor er du nødt til at køre Apache i forgrunden, når containeren starter, så beholderen ikke går ud, så snart den fyres op. Opret et script, startapache.sh, i / usr / local / sbin: root @ d7c8f02c3c8c: / # apt-get install nano I filen startapache.sh skal du tilføje disse linjer: . / etc / apache2 / envvars / usr / sbin / apache2 -D FORGRUND Skriv ændringerne, og gem filen. Gør det derefter eksekverbart: Alt dette lille script gør er at bringe de relevante miljøvariabler til Apache ind og starte Apache-processen i forgrunden. Du er færdig med at ændre indholdet af containeren, så du kan forlade containeren ved at skrive Nu skal du begå beholderen for at gemme de ændringer, du har foretaget: Forpligtelsen gemmer din container som et nyt billede og returnerer et unikt ID. Argumentet Du kan se dette ved at køre kommandoen lokal apache_web d95238078ab0 4 minutter siden 284,1 MB Bemærk, at de nøjagtige detaljer om dit billede - billed-id'et, størrelsen på containeren - vil være anderledes end mit eksempel. Docker-containere er designet til at væreuforanderlig. Hver gang du foretager ændringer i en container, skrives resultaterne til en helt ny container, aldrig til originalen. Hvis du vil bytte Apache ud med f.eks. Nginx, starter du med originalen Nu hvor du har vores image, kan du starte vores container og begynde at vise sider. Før du gør det, lad mig dog tage et øjeblik til at forklare, hvordan Docker håndterer netværk. Når Docker er installeret, opretter det tre virtuelle netværk, der kan bruges af Docker-containere: Når du vil starte en container og få den til at kommunikere med både andre containere og omverdenen, skal du manuelt kortlægge porte fra denne container til værten. Af hensyn til mit eksempel kan du gøre dette på kommandolinjen, når du starter din nyoprettede container:$ sudo docker info
docker info
kommandoen viser antallet af containere og billeder, blandt andre relevante oplysninger. Bemærk, at det kan være ret langt; dette eksempel viser kun den sidste af to sider.
$ sudo ufw status
DRÅBE
til ACCEPTERE
. For at gøre dette ved hjælp af Nano-editoren skal du indtaste følgende:$ sudo nano / etc / default / ufw
DEFAULT_FORWARD_POLICY = "DROP"
DEFAULT_FORWARD_POLICY = "ACCEPT"
$ sudo ufw genindlæs
Arbejd med Docker-billeder og Docker-containere
docker ps
kommando:# Denne kommando viser ALLE containere på systemet
$ sudo docker ps -a
# Dette viser kun KØRENDE containere
docker
. For en opdateret gennemgang af alle kommandoer, deres muligheder og fulde beskrivelser, se den officielle kommandolinjedokumentation.docker-kørsel
tidligere kommandoen automatisk trukket et Ubuntu-containerbillede fra Docker Hub-registertjenesten. Det meste af tiden vil du dog trække containerbilleder ind i den lokale cache på forhånd i stedet for at gøre det efter behov. Brug dette for at gøre det docker pull
, sådan her:$ sudo docker pull ubuntu
Docker-billeder kontra containere
ubuntu: 16.04
, ubuntu: xenial-20171201
, ubuntu: xenial
, ubuntu: nyeste
.docker pull ubuntu
tidligere trak jeg standard Ubuntu-billedet fra Ubuntu repository, som er billedet tagget seneste
. Med andre ord kommandoen docker pull ubuntu
svarer til docker pull ubuntu: nyeste
og (på tidspunktet for denne skrivning) docker pull ubuntu: xenial
. $ sudo docker pull-en ubuntu
-en
flag) i Ubuntu-arkivet i mit lokale system. Det meste af tiden vil du dog enten have standardbilledet eller en bestemt version. Hvis du f.eks. Vil have billedet til Ubuntu Saucy Salamander, skal du bruge det docker pull -a ubuntu: saucy
at hente billedet med det bestemte mærke fra den repo.saucy
som i ovenstående eksempel, vil du køre det ved at skrive sudo docker køre -i -t ubuntu: saucy / bin / bash
. Hvis du skriversudo docker image rm ubuntu
, for at fjerne ubuntu
billede, fjerner det kun det taggede billede seneste
. For at fjerne andre billeder end standard, såsom Ubuntu Saucy, skal du medtage det relevante tag:sudo docker image rm ubuntu: saucy
Docker-image og container-workflow
docker-kørsel
kommando. Når du har tilføjet software og ændret indstillinger inde i containeren, kan du oprette et nyt billede ud fra disse ændringer ved hjælp af docker begå
kommando.Opret et nyt Docker-billede fra en container
Start med en ny Docker-container
$ sudo docker kør -i -t --navn apache_web ubuntu / bin / bash
apache_web
. Det giver dig også en rodskal, fordi du har angivet / bin / bash
som kommandoen til at køre. Installer nu Apache-webserveren ved hjælp af apt-get
:root @ d7c8f02c3c8c: / # apt-get opdatering
sudo
, fordi du kører som rod inde i containeren. Bemærk, at du gør har brug for at løbe apt-get opdatering
, fordi igen pakkelisten inde i containeren er ikke den samme som den uden for den.apt-get
output vises, og Apache2-pakken er installeret i din nye container. Når installationen er afsluttet, skal du starte Apache, installere krølle og teste installationen, alt sammen fra din container:root @ d7c8f02c3c8c: / # service apache2 start
Opret et startscript til en Docker-container
# Du skal muligvis først installere Nano inde i containeren
root @ d7c8f02c3c8c: / # nano /usr/local/sbin/startapache.sh
#! / bin / bash
root @ d7c8f02c3c8c: / # chmod + x /usr/local/sbin/startapache.sh
Afslut
. Når du forlader containeren, stopper containeren.Forpligt containeren til at oprette et nyt Docker-billede
$ sudo docker begår apache_web lokalt: apache_web
lokal: apache_web
vil medføre, at forpligtelsen placeres i et lokalt lager, der hedder lokal
med et mærke af apache_web
.sudo docker billeder
:REPOSITORY TAG BILLED-ID Oprettet VIRTUEL STØRRELSE
ubuntu: nyeste
container, tilføj Nginx til det, og gem resultaterne som en helt ny container med navnet noget lignende lokal: nginx
.Forstå grundlæggende Docker-netværk
$ sudo docker kør -d -p 8080: 80 --navn apache lokalt: apache_web /usr/local/sbin/startapache.sh