Docker fra bakken Arbeid med containere, del 1

Dette er en del av en todelt serie om å jobbe med Docker-beholdere. I denne delen fokuserer vi på de mange måtene og alternativene for å kjøre et bilde, og hvordan verten kan samhandle med en Docker-beholder. 

I den andre delen vil vi dekke oppføring, start, stopp og omstart av containere, samt å utføre kommandoer på løpende containere. Dockerbilder er enhetene for distribusjon. Når du kjører et bilde, setter du opp en Docker-beholder som kjører en enkelt prosess i sitt eget isolerte miljø for filsystemet, nettverk og prosesser. 

Dockerbeholdere er svært fleksible og muliggjør mange brukstilfeller som er for tungvektige, komplekse og / eller dyre med andre teknologier som virtuelle maskiner og bare metal servere.

Før vi starter, må du kontrollere at Docker er installert riktig i ditt miljø. Avhengig av hvordan det er installert og brukeren din, må du kanskje kjøre den som sudo. Jeg hopper over sudo. 

Kjører et bilde

Du starter en Docker-beholder ved å kjøre et bilde. Det er flere måter å kjøre en beholder på, som påvirker hvor lett det er å håndtere alle beholdere. Når beholderen starter, kjører den vanligvis kommandoen som er definert i Dockerfilen. Her er Dockerfilen for hello-world-beholderen:

FRA SKRIFT KOPIER hei / CMD ["/ hei"] 

Kommandoen kjører bare "hei" binær som ble kopiert til roten av beholderen når du bygger bildet.

Forgrunn vs Frittstående

En beholder kan løpe i forgrunnen der den blokerer til prosessen går ut og beholderen slutter å løpe. I forgrunnsmodus skriver beholderen utskriften til konsollen og kan lese standardinngang. I frittstående modus (når du oppgir -d-flagg), returnerer kontrollen umiddelbart og beholderen 

Kjører en ukjent container

Den enkleste måten å kjøre en container på er: docker kjøre .

Når du kjører en container ved hjelp av denne kommandoen, vil Docker tilordne den et navn bestående av to tilfeldige ord. For eksempel: Docker kjøre Hei-verden.

Hvis du allerede har hallo-verdensbildet, vil Docker kjøre det. Hvis du ikke gjør det, vil den trekke den fra det offisielle Docker repository DockerHub og deretter kjøre det. Utgangen skal se ut som:

Hei fra Docker! Denne meldingen viser at installasjonen ser ut til å fungere som den skal. For å generere denne meldingen tok Docker følgende trinn: 1. Docker-klienten kontaktet Docker-demonen. 2. Docker-demonen trakk hello-world-bildet fra Docker Hub. 3. Docker-demonen opprettet en ny beholder fra det bildet som kjører kjørbarheten som produserer utgangen du leser. 4. Docker-demonen streamet den som ble sendt til Docker-klienten, som sendte den til terminalen din. For å prøve noe mer ambisiøst kan du kjøre en Ubuntu-beholder med: $ docker kjøre-en ubuntu bash Del bilder, automatiser arbeidsflyter og mer med en gratis Docker ID: https://cloud.docker.com/ For flere eksempler og ideer, besøk: https://docs.docker.com/engine/userguide/ 

Hei-programmet avsluttes etter at meldingen er avsluttet, som avslutter prosessen som løper inne i beholderen og avslutter beholderløpet. Beholderen stikker fortsatt rundt hvis du vil koble til den, undersøke logger eller noe annet. For å se beholderen kan du kjøre følgende kommando:

docker ps -a -format "bord .ID \ t .navn \ t .navn" CONTAINER ID STATUS NAVN 8e2e491accb5 avsluttet (0) 2 minutter siden clever_liskov

Jeg vil forklare senere hvordan du skal liste opp containere og alle relevante alternativer. For nå, la oss fokusere på Navn-delen. Docker genererte navnet "clever_liskov" automatisk, og jeg må bruke den eller beholder-IDen til å referere til denne beholderen for ethvert formål som å starte det på nytt, fjerne det eller utføre en kommando.

Kjører en navngitt beholder

Bruke container ID eller automatisk genererte navn er noen ganger ubeleilig. Hvis du ofte samhandler med en beholder du oppretter ofte, vil den få en annen ID og automatisk generert navn. Også navnet vil være tilfeldig. 

Docker lar deg navngi beholderne når du kjører dem ved å gi et "- navn "kommandolinjeprengivelse. I enkle tilfeller, hvor du bare har én beholder per bilde, kan du navngi beholderen etter bildet ditt: docker kjøre - navn hei verden hallo verden.

Nå, hvis vi ser på prosessen (jeg fjernet clever_liskov tidligere) vi ser at beholderen heter hei-verden:

docker ps -a -format "bord .ID \ t .navn" CONTAINER ID NAMES f6fe77b3b6e8 hello-world 

Det er flere fordeler med en navngitt beholder:

  • Du har et stabilt navn for dine containere du bruker både interaktivt og i skript.
  • Du kan velge et meningsfylt navn.
  • Du kan velge et kort navn for bekvemmelighet når du arbeider interaktivt.
  • Det forhindrer at du ved et uhell har flere beholdere med samme bilde (så lenge du alltid oppgir samme navn).

La oss se på det siste alternativet. Hvis jeg prøver å kjøre den samme kjørkommandoen igjen med det samme "hei-verden" -navnet, får jeg en klar feilmelding:

docker løp - navn hei verden Hei-verden docker: Feil respons fra demon: Konflikt. Beholdernavnet "/ hello-world" er allerede i bruk av container f6fe77b3b6e8e77ccf346c32c599e67b2982893ca39f0415472c2949cacc4a51. Du må fjerne (eller gi nytt navn) den beholderen for å kunne bruke det navnet igjen. Se "dokkingstasjon - hjelp". 

Kjører et automatisk fjern bilde

Beholdere holder seg som standard. Noen ganger trenger du ikke dem. I stedet for å fjerne tomme beholdere manuelt, får du beholderen til å gå vekk alene. De --rm kommandolinjeprøven gjør tricket: docker kjøre - rm hei-verden.

Kjører en annen kommando

Som standard kjører Docker kommandoen som er angitt i Dockerfile som brukes til å bygge bildet (eller direkte inngangspunktet hvis ingen kommando er funnet). Du kan alltid overstyre det ved å gi din egen kommando på slutten av løpekommandoen. La oss løpe ls-labusybox bilde (the Hei Verden bildet har nei ls kjørbar):

docker kjøre busybox ls-totalt 44 drwxr-xr-x 18 rotrot 4096 Mar 18 17:06. drwxr-xr-x 18 rotrot 4096 Mar 18 17: 06 ... -rwxr-xr-x 1 rotrot 0 mar 18 17:06 .dockerenv drwxr-xr-x 2 rotrot 12288 mar 9 00:05 bin drwxr-xr -x 5 rotrot 340 mar 18 17:06 dev drwxr-xr-x 2 rotrot 4096 Mar 18 17:06 etc drwxr-xr-x 2 ingen nogroup 4096 mar 9 00:05 hjem dr-xr-xr-x 85 rot rot 0 Mar 18 17:06 proc drwxr-xr-x 2 rot rot 4096 Mar 9 00:05 root dr-xr-xr-x 13 rot rot 0 Mar 18 17:06 sys drwxrwxrwt 2 rot rot 4096 Mar 9 00: 05 tmp drwxr-xr-x 3 rotrot 4096 mar 9 00:05 usr drwxr-xr-x 4 rotrot 4096 mar 9 00:05 var 

Interagere med verten

Dockerbeholdere kjører isolerte prosesser i sin egen lille verden. Men det er ofte nødvendig og nyttig å gi tilgang til verten.

Videresending av miljøvariabler til en container

Dockerbeholdere arver ikke automatisk miljøet av vertsprosessen som kjørte dem. Du må eksplisitt gi miljøvariabler til beholderen når du kjører den ved hjelp av -e kommandolinjeflagg. Du kan passere flere miljøvariabler. Her er et eksempel: 

docker kjøre --rm -it -e ENV_FROM_HOST = "123" busybox / # env HOSTNAME = 8e7672bce5a7 SHLVL = 1 HOME = / root ENV_FROM_HOST = 123 TERM = xterm PATH = / usr / lokal / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin PWD = / / # 

Den første linjen kjører oppbevaringsboksen, passerer den ENV_FROM_HOST variabel og deretter inne i beholderen som kjører env viser at ENV_FROM_HOST er riktig satt.

Du kan også bruke vertsmiljøvariabler. Dette setter et par vertsmiljøvariabler og bruker dem i run-kommandoen:

$ eksport VAR_1 = 1 $ eksport VAR_2 = 2 $ docker kjøre --rm -it -e VAR_1 = "$ VAR_1" -e VAR_2 = "$ VAR_2" opptaksboks

Inne i beholderen er de nå synlige:

/ # env | grep VAR VAR_1 = 1 VAR_2 = 2 

Monteringsverts kataloger

En av de mest nyttige interaksjonene er å montere verts kataloger. Det tillater flere interessante brukstilfeller:

  • Delt lagring mellom containere som kjører på samme vert.
  • Vise og redigere filer ved hjelp av vertsmiljøet og verktøyene dine og bruk filene i containeren.
  • Vannnivå utholdenhet utover levetiden til en beholder.

Her lager jeg en fil på verten: $ echo "Ja, det virker!" > ~ / data / 1.txt

Så kjører jeg busybox bilde montering av ~ / datakatalog til /data i beholderen og viser filinnholdet på skjermen:

$ docker kjøre --rm -v ~ / data: / data busybox cat /data/1.txt Ja, det virker! 

Jeg brukte katt / data/1.txt kommandoen her.

Eksponering av porter til verten

Hvis du avslører en port i Dockerfile ved hjelp av AVDEKKE, Det vil kun være tilgjengelig for andre dockerbeholdere. For å gjøre det tilgjengelig på verten, må du bruke -p kommandolinje argument. Syntaxen er -p :.

Her kjører Nginx bilde, som avslører port 80 og bruker -p kommandolinjeparametre for å gjøre det synlig på verten på port 9000: 

docker kjøre - navn nginx --rm -d -p 9000: 80 nginx

Merk at i motsetning til tidligere kommandoer som utførte noen oppgaver og fullført, vil nginx-beholderen fortsette å løpe og lytte til innkommende forespørsler. La oss bekrefte at nginx virkelig er i gang og svarer på forespørsler på port 9000. Jeg foretrekker den utmerkede httpie HTTP-klienten over krøll for å slå webservere og tjenester fra kommandolinjen:

http: HEAD localhost: 9000 HTTP / 1.1 200 OK Godta-Ranger: Bytes Tilkobling: Keep-Alive Innholdslengde: 612 Innholdstype: Tekst / html Dato: Søndag, 19 Mar 2017 07:35:55 ​​GMT ETag: "58a323e4- 264 "Senest endret: Tue, 14 Feb 2017 15:36:04 GMT Server: nginx / 1.11.10 

Konklusjon

Det er mange måter å kjøre et Docker-bilde på for å lage en container, og det er mange alternativer. Hver kombinasjon støtter en bestemt bruk. Det er veldig nyttig når du arbeider med Docker-beholdere for å forstå detaljene og bruke den beste metoden for å starte beholderne. 

I tillegg gir vedlegg av vertsvolumer og eksponering og publisering av porter en tett integrasjon med verten og en mengde bruksscenarier. I del to, vil vi dykke i å styre en haug med containere og dra nytte av den fulle kraften Docker gir.