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.
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.
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
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.
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 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:
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".
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
.
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-la
på busybox 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
Dockerbeholdere kjører isolerte prosesser i sin egen lille verden. Men det er ofte nødvendig og nyttig å gi tilgang til verten.
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
En av de mest nyttige interaksjonene er å montere verts kataloger. Det tillater flere interessante brukstilfeller:
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.
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
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.