Hur man paketerar Din Ansökan Infrastruktur med Docker

0
210

Docker är ett sätt att paketera applikationer och alla sina nödvändiga beroenden och konfiguration till en enda bild. I huvudsak visar din server konfiguration till något som kan hanteras med git och synkroniseras mellan varje maskin.

Vad Är Hamnarbetare, och Varför Är Det Nyttigt?

Docker gör det mycket enklare att hantera din produktion server för konfiguration. Snarare än att sätta upp servrar manuellt, kan du automatisera hela processen vara körde när du bygger din container bild.

Denna bild kommer att vara samma för alla i ditt team, så kommer du direkt kunna köra din app med alla nödvändiga beroenden som hanteras för dig. Det här löser även det klassiska “det fungerar inte på min maskin” problem, eftersom Docker bilder kommer att köra samma överallt.

Denna bild kan också vara lätt ut och sprang på en flotta av servrar på mycket liten påverkan på prestanda. Eftersom Docker är inte en virtuell maskin, behöver du inte ta itu med overhead för att köra en gästoperativsystemet för varje ansökan. Detta gör dem billiga och helt skalbar.

För mer information om vad som Hamnarbetare gör, och om inte ska du använda det till din app, kan du läsa vår uppdelning av huruvida eller inte det är värt huvudvärk. För nu, antar vi att du är redo för att komma igång, och dyk in på tekniska detaljer.

Skapa en Dockerfile

Entrypoint för att bygga din behållare kallas för en Dockerfile. Skapa ett nytt projekt katalog för att hysa dina filer, skapa sedan en ny Dockerfile helt enkelt heter Dockerfile med någon förlängning:

touch Dockerfile

Öppna denna fil i din favorittexteditor.

Du vill förmodligen inte börja allt från scratch, så att du kan gaffel i en befintlig bild från Docker Hub, såsom Ubuntu:

FRÅN ubuntu

Observera att även om du gör det, du måste göra det FRÅN grunden.

Under byggprocessen, Docker skapar en modifierbar “lager” som du kan bygga vidare på. Det är tillåtet att kopiera filer och köra kommandon som om de kördes på maskinen, på samma sätt till hur du skulle gå tillväga för att sätta upp en server manuellt. Du kommer att göra allt för din server setup i denna fil, i huvudsak till att automatisera processen du skulle gå igenom om du sköt upp en tom Linux-laptop och blev tillsagda att sätta det i produktion. Detta kan vara en tidskrävande process.

Du kan köra de flesta av dessa kommandon från kommandoraden, och ställ in bilden manuellt. Om du vill få ett bash-skalet i en behållare, kan du köra:

docker exec -det <behållare> /bin/bash

Och spara dina ändringar med:

docker begå <behållare> <namn>

Men, du bör bara använda det för att testa, och göra alla dina aktuella inställningar i en Dockerfile.

Dockerfile Kommandon

Vi kommer att gå igenom de flesta av de vanligaste kommandona, och förklara deras användning och bästa praxis för att använda dem till. För mer utökad referens, kan du konsultera denna cheatsheet, eller samråda med den “Bästa Praxis För att Skriva Dockerfiles” docs inlägg.

KOPIERA

KOPIERA instruktion är ganska enkelt: den gör det möjligt för dig att fylla din Docker bild med data och konfiguration.

KOPIERA <källa> <destination>

Till exempel, om du hade en mapp i ditt projekt katalog som heter /config/nginx/ som innehöll din nginx.conf, sites-available/, och andra kataloger, kan du kopiera den till den förvalda nginx config plats i din behållare:

KOPIERA /config/nginx/ /etc/nginx/

Detta sätt, du kan hålla alla dina nginx config-filer i samma projekt katalog som allt annat, vilket innebär att de kommer att vara kontrollerad med git tillsammans med resten av din kod.

KÖR

KÖR instruktion kör ett kommando i din behållare, och sparar ändringar till behållaren s filsystem.

KÖR kommandot

Varje kör kommando skapar ett nytt “lager”, så du kommer förmodligen vill göra komplicerade inställningar inne i en installationsskriptet. Du måste kopiera detta skript över till bilden och sedan köra den:

KOPIERA install.sh .
KÖRA ./install.sh

Inuti detta script, du är fri att göra någon konfiguration du behöver, till exempel installera program från apt.

Om du vill skära ner på din container bygga gånger, kan du skapa en bas behållare med alla program du behöver för redan installerade, och sedan bygga din största container FRÅN behållaren, även om du då behöver för att hantera beroenden och konfiguration separat.

CMD

CMD definierar den körbara filen används av din container på start om inget annat anges. Detta är hur du kommer att läsa din app när allt är klar.

CMD körbar

Endast den sista CMD-kommando tar effekt. Du kan åsidosätta CMD på start med följande syntax:

docker köra behållare körbara [args]

ENTRYPOINT

ENTRYPOINT är en speciell version av CMD som gör att behållaren för att köra som en körbar. Till exempel, om alla behållaren gör är att köra nginx, kan du ange nginx som ENTRYPOINT:

ENTRYPOINT nginx

Och sedan köra den behållaren på kommandoraden, som går i argument som argument för att entrypoint:

docker köra behållare [args]

EXPONERA

Exponera varumärken vissa behållare hamnar som är öppna för att köra värd. Till exempel, om du kör en webbserver, kommer du förmodligen vill

EXPONERA 80

Detta spelar inte binda hamnen automatiskt, men det informerar Docker runtime att porten är tillgänglig. Att faktiskt binda det, kommer du vill använda-P flaggan (versaler) med inga argument för att binda alla utsatta hamnar.

Kör Din App

Först, du behöver för att bygga din bild:

docker bygga -t behållare .

Du kan köra din behållare med docker kör:

docker köra behållare

Detta är dock inte allt för bra på sin egen, becaue det finns inget sätt att interagera med det. För att göra det, du måste binda hamnar hjälp -p flaggan, så här:

docker kör -p 3000:80 nginx

Detta kör nginx behållare och binder container HTTP utgång till port 3000 på den lokala maskinen.

Men med en standard-setup måste du återskapa Docker behållaren varje gång du gör ändringar i din app. Detta är naturligtvis långt mindre än idealisk, men som tur är finns det vägar runt detta. Ett sätt är att montera en volym i din behållare för att bilda en realtid länk mellan din container och den mottagande OS (där du gör din utveckling). Till exempel, om din HTML-källkod är i src/html/ mapp i din Docker projekt katalog, kan du montera den till /usr/local/nginx/html/ med:

docker kör -p 80:80 -v ./src/html/:/usr/local/nginx/html:ro container

Den “ro” flagga ser detta samband är read-only, så Docker behållaren kan inte göra några ändringar till värd för OS. Detta kan också användas för att låta Docker behållare tillgång till persistent data som lagras på den mottagande OS.