Docker: Let som build, run, done!

Docker har fået en masse brummer for nylig og med god grund. Containeriseringstjenesten gør implementering af mikroservices let og stabil, da hver tjeneste kan køre et operativsystem i sit eget virtuelle miljø. Det betyder fuld kompatibilitet ... ikke mere bekymre dig om OS-versioner, afhængigheder og forskelle mellem dine udviklings- og produktionsmaskiner! Og for at afslutte det er det let, så du kan køre flere Docker-containere i samme maskine (EC2-forekomst). I dag lærer vi, hvordan du opsætter og implementerer Docker på Amazon EC2 i 3 nemme trin!

Inden vi starter, skal du se på dette diagram på højt niveau (med tilladelse fra infoworld.com).

På venstre side er din traditionelle virtuelle maskineopsætning ved hjælp af en hypervisor. En hypervisor er simpelthen din VM-manager, der er ansvarlig for at tildele hardware-ressourcer til hvert virtuelt operativsystem. Hvis hvert gæst OS har brug for 1 GB hukommelse, og værten bruger 1 GB hukommelse, vil installationen til venstre kræve 4 GB i alt.

På højre side er en containeropsætning, der kører en containermotor som Docker. Den mest betydningsfulde forskel er, at en containermotor er mere let, fordi den kan dele bestemte hardwarressourcer med sit værts-OS, i modsætning til traditionelle VM'er, der kræver deres egen separate tildeling. Denne opsætning kræver 1 GB til værts-OS og måske 600 MB pr.Container (fordi 300 MB deles hypotetisk med værts-OS), i alt 2,8 GB krævet. Se disse fordele? Sejt, nu kan vi starte!

Kom godt i gang

Indtast din EC2-forekomst og klon Kangzeroos-ES6-React-Redux-Boilerplate fra Github. Koden, du ser, er til opsætning af denne webapp, men trinene er de samme for ethvert projekt. Når du har downloadet det, skal du gå ind i mappen og finde nedenstående filer. Dette er de filer, vi bruger med Docker.

Dockerfile build.sh run.sh

Før vi kan bruge Docker, skal vi først installere det. Nedenfor er den hurtige og enkle måde at installere Docker på, men hvis du vil have den fulde konfigurationscheck, er de officielle dokumenter.

$ sudo apt-get update $ sudo apt-get install docker-engine $ sudo service docker start $ sudo docker run hello-world

Den sidste kommando kontrollerer, om Docker kører med succes, og afslutter derefter. Hvis alt dette fungerer, er du klar til at starte Dockerizing!

Trin 1: Opbygning af Dockerfile

Det første trin er at konfigurere de filer, der kræves for, at Docker kan bygge et billede af sig selv. Docker-billeder er simpelthen tegninger af miljøer, som du vil oprette, mens containere er de faktiske kørende og funktionelle miljøer, som din app vil blive udført i. I roden til vores appkatalog er der en mappe kaldet App. Selve webappen findes i denne Appmappe, mens alle de Docker-relaterede ting er udenfor. Dette er nødvendigt, da Docker vil containerisere alt indeni App. Så lad os lave den første Docker-fil kaldet Dockerfile(ingen filtypenavn Dockerfile.sh, bare Dockerfile) og gå igennem den linje for linje.

FROM ubuntu # ubuntu setup RUN apt-get update -y RUN apt-get upgrade -y RUN apt-get install nodejs -y && apt-get install npm -y # install curl for n RUN apt-get install curl -y RUN apt-get install vim -y # obtain latest stable version of node RUN npm cache clean -f RUN npm install -g n RUN n stable # setup working directory # ADD /App /App WORKDIR /App RUN npm install # expose port EXPOSE 8080

Den første linje er FROM ubuntu. Formålet med Dockerfileer at oprette OS og programmer inde i OS, så det giver mening, at den første linje specificerer, hvilken OS-version der skal bruges. ubuntuher henviser til et specifikt billede hostet på Docker Hub, specifikt det officielle Ubuntu OS-billede.

# ubuntu setup RUN apt-get update -y RUN apt-get upgrade -y RUN apt-get install curl -y RUN apt-get install vim -y

Det næste sæt linjer er opsætning i Ubuntu. Vi vil se efter Ubuntu-opdateringer med RUN apt-get update -yog opgraderinger med RUN apt-get upgrade -y... temmelig standard ting til opsætning af dit miljø. Installer også curl RUN apt-get install curl -yog vim RUN apt-get install vim -y, begge rart at have til generelle formål.

# obtain latest stable version of node RUN apt-get install nodejs -y && apt-get install npm -y RUN npm cache clean -f RUN npm install -g n RUN n stable

Det næste sæt linjer er konfigurationsspecifik for NodeJS. Da vi vil bruge ES6-funktioner, har vi brug for den nyeste version af NodeJS, der opnås via nodemodulet n. Installer NodeJS og NPM med RUN apt-get install nodejs -y && apt-get install npm -y. Rengør derefter npm for at gøre plads til nbrug RUN npm cache clean -f. Installer nmed RUN npm install -g n. Og endelig kan vi køre n(nyeste version af NodeJS) med RUN n stable.

NodeJS er til Javascript, men hvis du arbejdede med andre sprog som Python, ville du installere de programmer, du har brug for til at køre din Python-app.

# setup working directory ADD /App /App WORKDIR /App RUN npm install # expose port EXPOSE 8080

Den sidste del af Dockerfileer at opsætte selve appens arbejdsmappe. ADD /App /Apptager Appmappen fra vores maskine og kopierer den til Docker-containeren. Dernæst WORKDIR /Appindstiller Docker-arbejdskataloget til, /Appså alle kommandoer, du kører i Docker, udføres i /App. Dette er nødvendigt for npm installat installere det rigtige sted (også kendt /Appsom Docker-containeren).

Endelig vi, RUN npm installder installerer vores NodeJS afhængigheder i vores maskine. Til sidst vil vi eksplicit eksponere port 8080 i vores Docker-billede med, EXPOSE 8080så omverdenen kan få adgang til vores app. Omverdenen inkluderer internettet såvel som andre Docker-containere, der kører på den samme maskine.

Trin 2: Bygg scriptet

docker build -t kangzeroo .

Opret en ny fil i rodmappen til din app, der kaldes build.sh. Dette er en shell-fil til opbygning af vores Docker-container. Denne build.shfil er faktisk ikke nødvendig, da vi direkte kan køre denne kommando i terminalen. Det er dog virkelig rart at forenkle processen.

Her er fordelingen af ​​denne linje: docker builder kommandoen, der fortæller Docker at oprette et billede. -t kangzerooindstiller tagnavnet på Docker-billedet til kangzeroo, som vi senere kan henvise til. Vær venligst opmærksom på, at det for at have et gyldigt tagnavn skal være med små bogstaver og ikke have mellemrum (brug slangebetegnelse). Endelig .fortæller Docker, hvor man skal lede efter det, Dockerfileder er nødvendigt til bygningen ( .betyder her).

Hvis du er i en EC2-forekomst, kan vi køre bash build.shfra vores projekts rodmappe. Dette starter Docker-byggeprocessen, når den går gennem trinene i det, Dockerfilevi oprettede. Dette kan tage et stykke tid ... i slutningen skal det se sådan ud: (Vær ikke bekymret for de ikke-kritiske fejl, såsom den valgfri afhængighed, der springes over i nedenstående skærmbillede).

Lad os nu kontrollere, om vores billede er oprettet. Skriv for docker imagesat se de billeder, der aktuelt kører i vores maskine. Du skal se et resultat som dette:

Hvis vi vil slette dette billede, skal du blot skrive docker rmi kangzeroo. Hvis du skriver docker imagesigen efter sletning, vil du se, at billedet ikke længere er der. Lad os for nu forlade billedet, fordi vi skal bruge det til at bygge Docker-containeren, så vores app kan køre.

Trin 3: Kør scriptet

Nu hvor vores image er skabt, lad os lave run.sh. Husk at Docker-billeder simpelthen er tegninger af miljøer, som du vil oprette. Containere er de faktiske kørende og funktionelle miljøer, som din app vil blive udført i. Det run.shvil også gøre vores billeder til containere. Sådan run.shser det ud:

docker run -d -it -p 80:8080 --name=kz kangzeroo npm run ec2 -- --host=0.0.0.0

Lad os gennemgå dette korte script. docker runer kommandoen til at køre en container fra et billede. -d -iter kommandoen til daemon(kører opgaver i baggrunden) og interactive terminal(giver os en måde at interagere med containeren). Hvis du udelader, -dkører docker-containeren ikke i baggrunden, og du vil se logoutput fra appen. -p 80:8080kortlægger port 80 på vores maskine til port 8080 i containeren. Husk, at vi tidligere har specificeret EXPOSE 8080i vores Dockerfile. Så nu tager vi indgående forbindelser på vores maskins port 80 (port 80 er standard for http) og omdirigerer dem til vores containerport 8080. Hvis din app ikke er en webside, kan du ekskludere denne portkortlægning. --name=kzgiver vores container navnet kz. Endelig kangzeroo npm run ec2henviser til vores image kaldetkangzerooog npm run ec2er en kommando, der er specifik for denne kedelplade-app (til opstart af appen). Den sidste del — — host=0.0.0.0indstiller kedelpladen til at køre på 0.0.0.0 i stedet for localhost (også dette er specifikt for kedelpladen). Hvis du kørte en Python-backend-app, ville det se ud docker run -d -it --name=kz kangzeroo python app.py.

Store! Gem denne fil og kør den med bash run.sh. Kontroller derefter, om containeren kører ved at skrive docker ps -a. Sådan skal det se ud:

Din app er nu online og kører inde i en Docker-container! Kontroller, om det fungerer ... for denne kedelplade kan du tjekke fra en webbrowser.

Og det fungerer! Godt, lad os nu slukke for vores Docker-container. Skriv for docker ps -aat se alle containerne igen. Skriv docker stop kzog det stopper containeren. Hvis du skriver docker ps, vil du ikke se containeren længere, men du vil se den, hvis du skriver docker ps -a( -abetyder alt inklusive kørsel og ikke kørsel af container. Udelad, -ahvis du kun vil se kørende containere). For at fjerne beholderen skal du skrive docker rm kz. Hvis du skriver, ser docker ps -adu ikke containeren længere.

Konklusion

Det var Docker! Alt i alt er Docker meget nemmere end at opsætte en hypervisor-baseret VM, og du kan se, hvordan en mikroservicearkitektur bliver meget lettere at administrere, når du vedtager containere. Med vores Dockerfile, build.shog run.shfiler oprettet i EC2, kan vi opsummere de 3 trin til at køre Docker fra vores app rodmappe:

$ bash build.sh $ bash run.sh $ exit

Det er det! Docker: let som build, run, done!

Bonus cheatsheet

Da denne tutorial tog en trinvis tilgang til undervisning i Docker, synes jeg det er hensigtsmæssigt at give dig en oversigt over alle de Docker-kommandoer, du har brug for til almindeligt brug.

$ docker images // To view install images $ docker rmi  // To remove an installed image $ docker ps -a // To view all docker containers $ docker stop  // To stop a docker container $ docker rm  // To remove a docker container $ docker exec -it  bash // Execute into container and run bash * If you want to see the log output from a docker container, omit the -d from run.sh
Disse metoder blev delvist brugt i implementeringen af ​​renthero.ca