The Hitchhiker's Guide till Docker och Modulus

I denna handledning kommer vi att se en historia av containerisering, Docker, dess komponenter och hur du börjar använda det i vårt dagliga arbete. Men innan vi dyker för djupt in i handledningen, låt oss ta en titt på vad Docker är så att vi får en förståelse för vad det är med vilket vi ska arbeta.

1. Introduktion

Docker är en öppen plattform för att bygga, transportera och köra distribuerade applikationer. Det ger programmerare, utvecklingsteam och operationsingenjörer den gemensamma verktygslådan som de behöver för att dra nytta av den distribuerade och nätverksbaserade naturen hos moderna applikationer.

Som det anges i den formella definitionen av Docker ovan, hjälper det utvecklare eller driftsingenjörer med automatisering av den infrastrukturmiljö som applikationer behöver. 

Låt oss säga att du har en ansökan skriven i Node.js som använder Express for RESTful service och MongoDB för data uthållighet. Låt oss göra det mer komplext och lägga till flera instanser av Node.js och Nginx Load Balancer framför Node.js instanser. 

Skulle det inte vara bättre om jag skriver ner installationsstegen i en textfil och låter någon installera hela miljön för mig? Docker hjälper dig att behålla alla komponenter i arkitekturen (Node.js-instans, Nginx Web Server, MongoDB-databas etc.) mycket enkelt.. 

Men vad är containerisering i alla fall? Låt oss ta en titt på historia av containeriseringsteknik.

2. Containeriseringshistoria

Det första containeriseringsprojekt som jag kan komma ihåg är OpenVZ, som är en containerbaserad virtualisering för Linux som släpptes första gången 2005. OpenVZ låter dig skapa flera isolerade, säkra Linux-behållare för att köra dem på samma fysiska server utan konflikter mellan applikationer.  

Samtidigt kom ett annat projekt av FreeBSD upp, kallad Jails. Det här låter dig placera appar och tjänster i ett fängelse (vi kan kalla detta en behållare) med hjälp av chroot. 

Det fanns andra projekt som Solaris Containers, men varför blev Docker populär trots att alla containeriseringsprojekt ovan är åtta år äldre än Docker? Fortsätt läsa för att jämföra din Docker-kunskap.

3. Hur fungerar Docker?

Innan jag förklarar hur Docker fungerar, låt mig förklara hur behållare fungerar. En behållare är något relaterad till operativsystem-nivå-virtualisering som gör att vi kan skapa flera isolerade användarutrymmen istället för bara en. Denna isolering görs genom att använda chroot

Huvudskillnaden mellan Containers och VMs är som följer. När du skapar flera virtuella maskiner med hjälp av VM dupliceras operativsystemen och virtualiserade hardwares för varje gäst. Om du skapar flera behållare skapas emellertid bara operativsystemets distributionsrelaterade mappar från början, medan de delar som är relaterade till Linux-kärnan delas mellan behållare. Du kan titta på bilden nedan för att se skillnaden på ett visuellt sätt.

Virtuell maskin

Hamnarbetare

Som du även kan se i schemat, om du skapar Ubuntu och Mint-gäster genom att använda VM, kommer deras Guest OS att dupliceras även om de använder samma Linux-kärna. Egentligen betyder distributionen differentiering av bins och libs mappar och Linux-kärnan är densamma. 

Om du tittar på den andra bilden ovan ser du att alla operativsystemnivåarkitekturer delas över behållare och endast bins och libs skapas från början för olika behållare. Docker Engine har namnområden, cgroups, och SELinux, och hjälper dig att orkestrera behållare. Om du behöver extra information om Docker Engine kan du titta på Dockers webbplats.

4. Docker-komponenter

Innan du fortsätter med att förklara komponenterna, kan du installera Docker på din dator. Det har ganska grundläggande steg att installera. 

Docker har huvudsakligen två komponenter: Docker Engine och Docker Hub. Docker Engine är för att orkestera behållare, som jag sa ovan, och Docker Hub är en SaaS-tjänst för hantering och delning av programstackar. Om du till exempel vill använda Redis med Docker kan du dra den till din lokala maskin genom att utföra följande kommando:

docker pull redis

Detta hämtar alla lager i behållarbilden och är redo att köras på din miljö. Du kan titta på Docker Hub för många förråd.

Docker har också ett särskilt filsystem som heter AUFS (endvanced Multi Layered Unification File Ssystemprogram). Med det här systemet hålls varje enskild bindningsförändring i lager, som versionskontroll. Om du ändrar din Docker-bild kommer den att hållas som ett annat engagemang, och det kommer inte att byggas om helt på byggnadsoperationen. Alla övriga lager är byggda förut. 

När du drar ett förråd till din lokala dator ser du dessutom att hämtningsoperationen är lagd efter lager. Låt oss säga att du har gjort en förändring och testar din nya behållare, men det misslyckas. Inget problem, du kan rulla tillbaka dina ändringar och bygga om som du alltid gör det i Git. 

5. Snabbstart

Om du antar att Docker redan är installerad på din dator kan vi komma igång med några ganska coola Docker-kommandon. 

docker dra ubuntu docker kör-en ubuntu bash

Som du kan gissa kommer kommandot ovan hämta ubuntu-bilden från Docker Hub och köra den följt av bash-kommandot. 

Du kommer att se att du är inne i behållaren efter att ha utfört ovanstående kommando. Du är nu i Ubuntu-skal och fri att utföra * nix-kommandon. Du kan skapa något, ta bort något, se processer, etc.. 

Var försiktig, för när du lämnar behållaren kommer dina data att gå vilse. Varför? Eftersom du behöver designa dina behållare som oföränderliga. 

Första utformningen vilka paket kommer att ingå, vilka applikationer klonas i behållaren, etc., och kör sedan din behållare. När du misslyckas med något, måste du kunna ändra konfigurationen och springa igen. Håll aldrig tillstånd i dina behållare. 

5,1. Springa

För att köra behållaren kan du använda följande format.

dockningsdrift [OPTIONS] IMAGE [: TAG | @DIGEST] [COMMAND] [ARG ...]

Det finns många parametrar tillgängliga i Docker för körningsoperationen. Du kan referera till dokumentationen för alla alternativ, men jag kommer att ge dig några exempel för verklig användning.

docker kör -d redis

Kommandot kommer att köra en Redis-bild i fristående läge. Det betyder att all I / O kommer att göras via nätverks eller delade anslutningar. Du kan anta att den körs i daemon-läge. Vi har sagt redis här, men du kan också ange bildförfattaren och taggen med hjälp av ett kommando som nedan.

docker kör -d huseyinbabal / mongodb: 1.0

Vi kör en mongodb bild som tillhör huseyinbabal med specifik version 1,0.

Du kan också köra din bild interaktivt så här:

docker kör-en huseyinbabal / ubuntu: 1,2 bash

När du kör kommandot ovan kommer det att springa ubuntu 1.2 och kör sedan a våldsamt slag kommando att sätta din prompten i terminal i behållaren.

5,2. Bygga

Vi har kört bilder som har dras från Docker Hub Repository. Vad sägs om att bygga vår egen bild? Vi kan göra det genom att använda kommandot Docker build, men vi måste ange a Dockerfile att låta Docker köra varje uttalande definierat i Dockerfile. 

FRÅN Ubuntu MAINTAINER Huseyin BABAL RUN apt-key advkeyserver keyserver.ubuntu.com --recv 7F0CEB10 RUN echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | tee -a /etc/apt/sources.list.d/10gen.list Kör apt-get update Kör apt-get -y installera apt-utils Kör apt-get -y installera mongodb-10gen RUN echo "some configs" >> /etc/mongodb.conf CMD ["/ usr / bin / mongod", "--config", "/etc/mongodb.conf") 

Det här är en mycket enkel Dockerfile-definition som hjälper oss att bygga vår bild. I den här Dockerfile-definitionen säger vi först och främst att vi kommer att ärva alla egenskaper från ubuntu-bilden. Den här bilden hämtas först från din lokala server. Om det inte kan hittas hämtas det från Docker Hub. 

På andra raden definierar vi författaren eller underhållaren av bilden. I följande filer kör vi enkelt * nix-kommandon med RUN-kommandot för att installera viktiga paket och MongoDB-relaterade paket. För att kunna starta MongoDB skriver vi mongodb.conf, och i det sista steget kör vi kommandot genom att använda CMD.

För att kunna köra vår bild borde vi bygga bilden med hjälp av den här Dockerfilen. Du kan använda följande för att bygga bilden.

docker build -t huseyinbabal / mongodb: 1.0 .

Det här kommer helt enkelt att bygga en bild med en tagg huseyinbabal / mongodb: 1,0 och kommer att använda Dockerfile i den aktuella mappen (se pricken i slutet av kommandot). För att testa om det är skapat eller inte, kan du använda följande kommando.

dockerbilder

Här listas alla bilder som finns på datorn enligt nedan.

Om du vill köra en inbyggd bild kan du helt enkelt springa:

docker kör -d huseyinbabal / mongodb: 1.0

Men vänta! Detta är daemon nod. Så, hur kan jag komma in i den här behållaren? Det är väldigt enkelt. Först får namnet på mongodb-behållarens namn med hjälp av följande kommando.

docker ps

Du får se en produktion som nedan.

Du kan se namnet i kolumnen NAMES. Nu är det dags att gå in i behållaren med följande kommando.

docker exec -i -t  våldsamt slag

Du kan se de löpande processerna i den här behållaren.

5,3. Delad mapp

Som jag sa tidigare, om du stänger den löpande behållaren kommer alla data relaterade till den behållaren att gå vilse. Detta är normalt i Docker World. 

I vår behållare skriver MongoDB all data i en sökväg som anges i mongodb.conf. Den här mappen finns i behållaren, och om du stänger behållaren kommer alla data att gå vilse. Om du fortsätter data i en mapp som delas med en värddatorn som Docker körs kan du använda -v alternativet inuti springa kommando. Till exempel:

docker kör -d -v / host / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1,0

Detta kommer att kartlägga /värd / mongo_db_path som finns i din värd maskin till /behållaren / mongo_data_path som finns i behållaren. När mongo skriver data till vägen inuti behållaren kommer den automatiskt att vara tillgänglig inom värdmaskinen. Även om du stänger behållaren stannar dataen i sökvägen inuti värdmaskinen.

5,4. Port Exposing

Låt säga att MongoDB löper inuti behållaren. Du kan exponera MongoDB-porten utanför behållaren på port 27017, och du kan använda följande kommando för att komma åt från behållaren med port 5000.

docker kör -d-P 5000: 27017 -v / värd / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1,0

Så du kan ansluta till MongoDB inuti behållaren från utsidan genom att använda port 5000.

5,5. Containerinspektion

Låt säga att du behöver nätverksinformation för den angivna behållaren. Du kan ta den där detaljerna med hjälp av docker inspektera kommando. Detta kommando kommer att skriva ut massor av metadata om behållaren. är den del som finns i CONTAINER IDdocker ps produktion. Utmatningen från inspektionen kommer att finnas i JSON-format. För att få behållarens IP-adress kan du använda:

docker inspect --format '.NetworkSettings.IPAddress' 

Ovanstående kommandon är de grundläggande medan du gör Docker saker. Om du behöver lära dig mycket om Docker-kommandon, se dokumentationen.

6. Tips och tricks

6,1. Container enda ansvar

Det är bästa praxis att bara ge ett ansvar till varje behållare. Vad jag menar här är, bör du inte installera MongoDB och Spring Boot-program i en container för att betjäna DB- och applikationslagren i en behållare. Istället för det kan du lägga en app i en behållare. Varje applikationsexempel, databassemedlem, meddelandekö etc. bör endast ange en behållare. 

Låt oss säga att du lägger applikations- och databaslagren i en behållare. Det blir mycket svårt att mäta prestanda eller diagnostik för applikationen eller databasen. På samma sätt kan du, om du vill skala din ansökan, inte kunna skala den behållaren, eftersom det också finns en databasapplikation installerad i den behållaren. 

6,2. Immutable Containers

När du kör din behållare, ssh aldrig in i den behållaren för att uppdatera eller ta bort något. Den främsta anledningen till att använda Docker är att historiskt hålla dina ändringar i Dockerfile. Om du vill ändra något ändrar du Dockerfile, bygger bilden och kör behållaren. Även om du byter något i behållaren manuellt, kommer den att raderas om den behållaren körs igen.

6,3. Dockerfile Lager

Normalt kan du skriva varje kommando på separata linjer som nedan.

FRÅN Ubuntu MAINTAINER Huseyin BABAL RUN apt-få uppdatering Kör apt-get install -y build-essential Kör apt-get install -y php5 Kör apt-get install -y nginx CMD ["nginx", "g", "demonen" "] EXPOSE 80

Detta innebär ett lager för varje rad. Det är inte ett sätt att konstruera Dockerfile. Du kan skilja dina kommandon med en backslash (\) för varje grupp av jobb, enligt nedan:

FRÅN Ubuntu: 15.04 HÄRMARE Huseyin BABAL RUN apt-get uppdatering \ -y build-essential -y php5 \ -y nginx = 1.7.9 \ apt-få ren CMD ["nginx", "g", "demon off;"] EXPOSE 80

I ovanstående Dockerfile har vi planerat att installera de nödvändiga paketen på en rad och utförde a rena drift för att göra miljön ren. Genom att göra detta skapade vi inte separata lager för varje kommando.

6,4. Container loggar

Att bygga och köra en behållare är mycket enkla saker. Efter två månader kan du sluta med 50 behållare för din applikationsarkitektur! Det kommer bli mycket svårt att hitta orsaken till ett problem om något fel uppstår i dina behållare. 

Det enkla sättet att hantera detta är att logga in din containeraktivitet i ett centralt loggsystem. Till exempel, omdirigera dina stdout-loggar till en loggfil i varje behållare. Och en agent kan strömma dessa logginnehåll till ett centralt logghanteringssystem som ELK, eller Splunk. Om du skickar containerspecifika uppgifter i loggar, till exempel container ID, blir det mycket enkelt att filtrera fel på logghanteringsdashboardet. 

Du kanske vill övervaka behållaren själv. Den här gången kan du titta på Google cadvisor. Detta låter dig övervaka din behållare via en REST-tjänst. För att se behållarinformation kan du till exempel göra en GET-förfrågan till http: // värdnamn/api/v1.0/containers/

6,5. Standardisering

Om du tillämpar standardprocedurer på din behållare livscykel, är det väldigt lätt att kontrollera din övergripande arkitektur. Till exempel kan du skapa en basbehållare för att erva vissa operationer i andra behållare. Å andra sidan kan du använda standardplatser för konfigurationsfiler, loggfiler och källfiler. Var försiktig med att använda en separat Dockerfil för varje behållare. Slutligen, använd versionering till alla dina behållare för att separera funktioner och använd olika versioner enligt dina behov.

6,6. säkerhet

Säkerhet är ett mycket viktigt ämne när det gäller behållare. Kör alltid behållarna i obehagligt läge. Jag föreslår att du använder Apparmor för att skydda din behållare från yttre trådar, till och med nolldagsangrepp. Jag föreslår också SELinux för dina behållare att tillämpa säkerhetsregler för åtkomstkontroll enligt dina behov. Fortsätt också med uppdateringarna av bilderna du använder inuti behållare för att tillämpa de senaste patcherna i behållaren. Medan du gör det, glöm inte att stifta bilden till en stabil version. 

7. Modulus

Modulus är en fullt stödd företagsinstallations- och orkestrationsplattform. De började först med en Node.js-fokuserad PaaS ovanpå LXC, och sedan bestämde de sig för att byta till Docker, vilket låter dem stödja flera språk som skiljer sig från Node.js, dvs PHP, Java, Python och Static-projekt. 

Vad jag menar med att stödja språk här är att du kan distribuera din ansökan som skrivs på ovanstående språk till modul med ett enda kommando med fördefinierade egenskaper. Låt säga att du kommer att distribuera Node.js-ansökan till modulen, och det enda du behöver göra är att utföra modulutnyttjande inuti din projektmapp. Modul består av följande komponenter.

7,1. Modul CLI

Modul CLI är för implementeringsoperationen för din applikation från kommandoraden och kan enkelt installeras med npm install-g modulus. Du kan skapa projekt, distribuera projekt, strömma loggar och göra några databasrelaterade operationer med Modulus CLI. Alternativt kan du distribuera ditt projekt genom att ladda upp men adminpanelen.

7,2. Spridning

Du kan skapa och distribuera din ansökan med några enkla steg. Du kan välja språk, servostorlek och plats. Gör sedan redo att distribuera ditt projekt.

Alternativt kan du skapa ett projekt på kommandoraden med modulprojekt skapa och då modulutnyttjande.

7,3. Databas

Du kanske vill lagra vissa data i din ansökan. Modulus låter dig också lägga till en databas i din ansökan. MongoDB används bakom kulisserna. Du kan gå och skapa en databas i instrumentpanelen, och du kan även skapa en databas på kommandoraden. Du kan se databasskärmen nedan.

Du kan ta tag i databasadressen på detaljskärmen och använda den i dina applikationer.

7,4. loggar

Du kan svänga applikationsloggar från kommandoraden med modul loggar svans, eller så kan du strömma loggar på instrumentbrädan enligt nedan.

När du klickar på STRÖMMA knappen, kan du se loggarna i realtid.

Det är huvudkomponenterna i Modulus. Du kan titta på andra komponenter som Metrik, Auto-Scaling, addons, anmälningar, och Administrering på Modulus Dashboard.

8. Slutsats

Vi har diskuterat behållare och fått en kort historia. I jämförelse med VM har Docker många alternativ för att hantera din applikationsinfrastruktur. 

Om du använder Docker för din arkitektur, måste du vara försiktig med vissa begrepp, som ensam ansvar, oskyddbara servrar, säkerhet, applikation och behållarövervakning. 

När ditt system blir större blir det väldigt lätt att kontrollera. Modulus är ett av de företag som använder Docker för sitt PaaS-system. Genom att använda Dockers kraft har Modulus utformat ett bra system för att hjälpa människor att använda sina applikationer skrivna i Node.js, PHP, Java och Python mycket enkelt.