In deze zelfstudie gaan we een kijkje nemen in de geschiedenis van containerization, Docker, de componenten ervan en hoe we ermee aan de slag kunnen gaan in ons dagelijks werk. Maar voordat we te diep in de tutorial duiken, laten we eens kijken naar wat Docker is, zodat we begrijpen wat het is waarmee we zullen werken.
Docker is een open platform voor het bouwen, verzenden en uitvoeren van gedistribueerde applicaties. Het geeft programmeurs, ontwikkelteams en operationele engineers de gebruikelijke toolbox die ze nodig hebben om te profiteren van de gedistribueerde en genetwerkte aard van moderne applicaties.
Zoals vermeld in de formele definitie van Docker hierboven, helpt het ontwikkelaars of bedieningsingenieurs met het automatiseren van de infrastructuuromgeving die applicaties nodig hebben.
Stel dat u een toepassing heeft geschreven in Node.js die Express voor RESTful-service gebruikt en MongoDB voor gegevenspersistentie. Laten we het complexer maken en meerdere instanties toevoegen van Node.js en Nginx Load Balancer voor de Node.js-instanties.
Zou het niet beter zijn als ik de installatiestappen in een tekstbestand noteer en iemand de hele omgeving voor mij laat installeren? Docker helpt u bij het containeriseren van alle componenten van de architectuur (Node.js-instantie, Nginx Web Server, MongoDB-database, enz.) Zeer eenvoudig.
Maar wat is containerisatie eigenlijk? Laten we de geschiedenis van containatietechnologie eens bekijken.
Het eerste containerisatieproject dat ik kan onthouden is OpenVZ, wat een container-gebaseerde virtualisatie is voor Linux die voor het eerst werd uitgebracht in 2005. OpenVZ laat je meerdere geïsoleerde, beveiligde Linux-containers maken om ze op dezelfde fysieke server te gebruiken zonder conflict tussen applicaties.
Tegelijkertijd kwam er een ander project van FreeBSD op de markt, genaamd Jails. Hiermee kun je apps en services in één gevangenis plaatsen (we kunnen dit een container noemen) door chroot te gebruiken.
Er waren andere projecten zoals Solaris Containers, maar waarom werd Docker populair, hoewel alle containeriseringsprojecten hierboven acht jaar ouder zijn dan Docker? Lees verder om uw Docker-kennis te verbeteren.
Voordat ik uitleg over de werking van Docker, kan ik u uitleggen hoe containers werken. Een container is iets dat gerelateerd is aan Virtualisatie op besturingssysteemniveau, waardoor we meerdere geïsoleerde gebruikersruimten kunnen maken in plaats van slechts één. Deze isolatie wordt gemaakt met behulp van de chroot
.
Het grootste verschil tussen containers en VM's is als volgt. Wanneer u meerdere virtuele machines maakt met VM, worden de besturingssystemen en gevirtualiseerde hardware voor elke gast gedupliceerd. Als u echter meerdere containers maakt, worden alleen de mappen die betrekking hebben op de distributie van het besturingssysteem vanuit het niets gemaakt, terwijl de onderdelen die betrekking hebben op de Linux-kernel worden gedeeld tussen containers. U kunt de onderstaande afbeelding bekijken om het verschil op een visuele manier te zien.
Zoals je ook in het schema kunt zien, als je gasten van Ubuntu en Mint creëert met VM, wordt hun gast-besturingssysteem gedupliceerd, zelfs als ze dezelfde Linux-kernel gebruiken. Eigenlijk betekent distributie differentiatie van de bins en libs mappen en de Linux-kernel is hetzelfde.
Als u de tweede afbeelding hierboven bekijkt, ziet u dat alle architectuur op het niveau van het besturingssysteem wordt gedeeld door alle containers, en alleen de bins en libs zijn helemaal opnieuw gemaakt voor verschillende containers. Docker Engine heeft naamruimten, cgroups
, en SELinux, en helpt je met het orkestreren van containers. Als u extra informatie nodig hebt over Docker Engine, kunt u een kijkje nemen op de Docker-website.
Voordat u doorgaat met het uitleggen van de componenten, kunt u Docker op uw computer installeren. Het heeft vrij basisstappen om te installeren.
Docker bestaat hoofdzakelijk uit twee componenten: Docker Engine en Docker Hub. Docker Engine is bedoeld voor het orkestreren van containers, zoals ik hierboven al zei, en Docker Hub is een SaaS-service voor het beheren en delen van applicatiestacks. Als u bijvoorbeeld Redis met Docker wilt gebruiken, kunt u het naar uw lokale computer slepen door de volgende opdracht uit te voeren:
koppelaar trek opnieuw
Hiermee worden de alle lagen van de containerafbeelding opgehaald en zijn ze klaar om in uw omgeving te worden uitgevoerd. U kunt Docker Hub bekijken voor veel opslagplaatsen.
Docker heeft ook een speciaal bestandssysteem genaamd AUFS (EENGeavanceerde Multi Layered Unification File Systeem). Met dit systeem wordt elke commit-wijziging in lagen bewaard, zoals versiebeheer. Als u een wijziging aanbrengt in uw Docker-afbeelding, wordt deze behouden als een andere commit en wordt deze niet opnieuw opgebouwd tijdens de build-bewerking. Alle andere lagen zijn eerder gebouwd.
Wanneer u een repository naar uw lokale computer sleept, ziet u bovendien dat de ophaalbewerking laag voor laag wordt uitgevoerd. Laten we zeggen dat u een wijziging hebt aangebracht en dat u uw nieuwe container test, maar deze mislukt. Geen probleem, je kunt je wijzigingen terugdraaien en opnieuw opbouwen zoals je dat altijd doet in Git.
Ervan uitgaande dat Docker al op uw computer is geïnstalleerd, kunnen we aan de slag met enkele behoorlijk coole Docker-opdrachten.
havenarbeider trek ubuntu havenarbeiderloop -it ubuntu bash
Zoals je kunt raden, haalt de bovenstaande opdracht de ubuntu-afbeelding op van Docker Hub en voert deze uit gevolgd door de bash-opdracht.
U ziet dat u zich in de container bevindt nadat u de bovenstaande opdracht hebt uitgevoerd. Je bevindt je nu in de Ubuntu-shell en kunt * nix-opdrachten uitvoeren. U kunt iets maken, iets verwijderen, processen bekijken, enzovoort.
Wees echter voorzichtig, want wanneer u de container afsluit, gaan uw gegevens verloren. Waarom? Omdat je je containers als onveranderlijk moet ontwerpen.
Eerste ontwerp welke pakketten worden opgenomen, welke toepassingen in de container worden gekloond, enzovoort, en voer vervolgens uw container uit. Wanneer u ergens niet in slaagt, moet u de configuratie kunnen wijzigen en opnieuw kunnen uitvoeren. Bewaar nooit de staat in uw containers.
Als u de container wilt uitvoeren, kunt u de volgende indeling gebruiken.
Docker-run [OPTIONS] IMAGE [: TAG | @DIGEST] [COMMAND] [ARG ...]
Er zijn veel parameters beschikbaar in Docker voor de run-bewerking. U kunt de documentatie voor alle opties raadplegen, maar ik zal u een aantal voorbeelden geven voor gebruik in de praktijk.
Docker-run -d-redis
Deze opdracht voert een Redis-afbeelding uit in de losgekoppelde modus. Dit betekent dat alle I / O wordt uitgevoerd via netwerk- of gedeelde verbindingen. Je kunt ervan uitgaan dat het in daemon-modus draait. We hebben gezegd redis
hier, maar u kunt ook de auteur en tag van de afbeelding opgeven door een commando zoals hieronder te gebruiken.
docker-run -d huseyinbabal / mongodb: 1.0
We hebben een MongoDB
afbeelding die bij hoort huseyinbabal
met specifieke versie 1.0
.
Je kunt je afbeelding ook interactief op deze manier uitvoeren:
havenarbeiderloop -it huseyinbabal / ubuntu: 1.2 bash
Wanneer u de bovenstaande opdracht uitvoert, wordt deze uitgevoerd ubuntu 1.2
en voer dan a uit bash
opdracht om uw prompt in de terminal in de container te plaatsen.
We hebben afbeeldingen uitgevoerd die zijn opgehaald uit Docker Hub Repository. Hoe zit het met het bouwen van ons eigen beeld? We kunnen dat doen met de opdracht Docker build, maar we moeten een a opgeven Dockerfile
om Docker elke instructie te laten uitvoeren die is gedefinieerd in Dockerfile.
VAN ubuntu ONDERHOUD Huseyin BABAL RUN apt-key adv - keyserver 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 RUN apt-get update RUN apt-get -y installeren apt-utils RUN apt-get -y installeren mongodb-10gen RUN echo "some configs" >> /etc/mongodb.conf CMD ["/ usr / bin / mongod", "--config", "/etc/mongodb.conf"]
Dit is een zeer eenvoudige Dockerfile-definitie die ons helpt ons imago te vergroten. In deze Dockerfile-definitie zeggen we allereerst dat we alle eigenschappen van de ubuntu-afbeelding zullen erven. Deze afbeelding wordt eerst van uw lokale server opgehaald. Als het niet kan worden gevonden, wordt het opgehaald van Docker Hub.
Op de tweede regel definiëren we de auteur of onderhouder van de afbeelding. In de volgende bestanden voeren we eenvoudig enkele * nix-opdrachten uit met de opdracht RUN om essentiële pakketten en aan MongoDB gerelateerde pakketten te installeren. Om MongoDB te starten, schrijven we mongodb.conf
, en in de laatste stap gebruiken we het commando door te gebruiken CMD
.
Om onze afbeelding te kunnen gebruiken, moeten we de afbeelding bouwen met behulp van dit Docker-bestand. U kunt het volgende gebruiken om de afbeelding te bouwen.
docker build -t huseyinbabal / mongodb: 1.0 .
Simpel gezegd, hiermee wordt een afbeelding met een tag gemaakt huseyinbabal / MongoDB: 1.0
en zal Dockerfile gebruiken in de huidige map (zie de punt aan het einde van de opdracht). Om te testen of het is gemaakt of niet, kunt u de volgende opdracht gebruiken.
docker-afbeeldingen
Dit zal een lijst maken van alle afbeeldingen die op uw computer staan, zoals hieronder.
Als u een ingebouwde afbeelding wilt uitvoeren, kunt u gewoon het volgende uitvoeren:
docker-run -d huseyinbabal / mongodb: 1.0
Maar wacht! Dit is een daemonknooppunt. Dus, hoe kan ik deze container betreden? Het is erg makkelijk. Krijg eerst de naam van de naam van de mongodb-container met behulp van de volgende opdracht.
koppelaar ps
U ziet een uitvoer zoals hieronder.
U kunt de naam zien in de kolom NAMES. Nu is het tijd om de container in te gaan met het volgende commando.
docker exec -i -tbash
U kunt de lopende processen in deze container bekijken.
Zoals ik al eerder zei, als u de actieve container sluit, gaan alle gegevens met betrekking tot die container verloren. Dit is normaal in de Docker-wereld.
In onze container schrijft MongoDB bijvoorbeeld alle gegevens in een pad dat is opgegeven in mongodb.conf. Deze map bestaat in de container en als u de container sluit, gaan alle gegevens verloren. Als u de gegevens voortzet in een map die wordt gedeeld met een hostcomputer die Docker uitvoert, kunt u de -v
optie binnen de rennen
commando. Bijvoorbeeld:
Docker-run -d -v / host / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1.0
Dit zal in kaart brengen /host / mongo_db_path
welke zich in je hostmachine bevindt naar /container / mongo_data_path
die zich in de container bevindt. Wanneer mongo gegevens naar het pad in de container schrijft, wordt deze automatisch toegankelijk op de hostcomputer. Zelfs als u de container sluit, blijven de gegevens in het pad binnen de hostcomputer.
Laten we zeggen dat MongoDB in de container loopt. U kunt de MongoDB-poort buiten de container op poort 27017 plaatsen, en u kunt de volgende opdracht gebruiken om met container 5000 van buiten de container te openen.
docker-run -d-P 5000: 27017 -v / host / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1.0
U kunt dus met behulp van poort 5000 verbinding maken met MongoDB in de container van buitenaf.
Stel dat u de netwerkinformatie van de opgegeven container nodig heeft. Je kunt dat detail vastleggen met behulp van de havenarbeider inspecteren
commando. Met deze opdracht worden veel metagegevens over de container afgedrukt.
is het deel dat bestaat CONTAINER ID
in de koppelaar ps
output. De uitvoer van de inspectie zal in JSON-formaat zijn. Om het IP-adres van de container te krijgen, kunt u het volgende gebruiken:
docker inspect - format '.NetworkSettings.IPAddress'
De bovenstaande commando's zijn de basiscommando's terwijl je Docker-dingen aan het doen bent. Als u veel wilt leren over Docker-opdrachten, raadpleegt u de documentatie.
Het is een goede gewoonte om aan elke container maar één verantwoordelijkheid te geven. Wat ik hiermee bedoel, is dat u geen MongoDB- en Spring Boot-toepassingen in één container moet installeren om de DB- en toepassingslagen in één container te verwerken. In plaats daarvan kunt u één app in één container plaatsen. Elke toepassingsinstantie, databaselid, berichtenwachtrij, enzovoort, moet slechts één container vermelden.
Laten we zeggen dat u de applicatie- en databaselagen in één container plaatst. Het zal erg moeilijk zijn om de prestaties of diagnostiek voor de applicatie of database te meten. Op dezelfde manier, als u uw applicatie wilt schalen, kunt u die container niet schalen omdat er ook een databasetoepassing in die container is geïnstalleerd.
Wanneer u uw container uitvoert, sla dan nooit in die container om iets bij te werken of te verwijderen. De belangrijkste reden voor het gebruik van Docker is om uw wijzigingen in Dockerfile historisch te bewaren. Als u iets wilt wijzigen, wijzigt u Dockerfile, bouwt u de afbeelding en voert u de container uit. Zelfs als u iets in de container handmatig wijzigt, wordt het verwijderd als die container opnieuw wordt uitgevoerd.
Normaal gesproken wilt u misschien elke opdracht op afzonderlijke regels schrijven, zoals hieronder.
FROM ubuntu ONDERHOUD Huseyin BABAL RUN apt-get update RUN apt-get installeer -y build-essential RUN apt-get installeer -y php5 RUN apt-get installeer -y nginx CMD ["nginx", "g", "daemon off; "] EXPOSEREN 80
Dit betekent één laag voor elke regel. Het is geen voorgestelde manier om Dockerfile te bouwen. U kunt uw opdrachten scheiden met een backslash (\) voor elke groep taken, zoals hieronder:
FROM ubuntu: 15.04 ONDERHOUD Huseyin BABAL RUN apt-get update \ -y build-essential -y php5 \ -y nginx = 1.7.9 \ apt-get clean CMD ["nginx", "g", "daemon off;"] EXPOSE 80
In het bovenstaande Dockerfile hebben we gepland om de vereiste pakketten op één regel te installeren en een schoon
operatie om de omgeving schoon te maken. Door dit te doen, hebben we geen afzonderlijke lagen gecreëerd voor elke opdracht.
Het bouwen en uitvoeren van een container is heel eenvoudig. Na twee maanden kunt u eindigen met 50 containers voor uw toepassingsarchitectuur! Het zal erg moeilijk zijn om de oorzaak van een probleem te vinden als er een fout optreedt in uw containers.
De eenvoudige manier om dit aan te pakken, is door uw containeractiviteiten in een centraal logboeksysteem te loggen. Stuur uw stdout-logboeken bijvoorbeeld door naar een logboekbestand in elke container. En een agent kan die logboekinhoud naar een centraal logboekbeheersysteem zoals ELK of Splunk streamen. Als u containerspecifieke gegevens in logboeken verzendt, bijvoorbeeld container-ID, kunt u zeer eenvoudig fouten filteren op het dashboard voor logbeheer.
Misschien wilt u de container zelf controleren. Deze keer kunt u een kijkje nemen bij Google cadvisor. Hiermee kunt u uw container volgen via een REST-service. Als u bijvoorbeeld containergegevens wilt bekijken, kunt u een GET-verzoek indienen bij http: // host_name
/api/v1.0/containers/
.
Als u standaardprocedures toepast op de levenscyclus van uw container, kunt u uw algemene architectuur eenvoudig beheren. U kunt bijvoorbeeld een basiscontainer maken die sommige bewerkingen binnen andere containers overneemt. Aan de andere kant kunt u standaardlocaties gebruiken voor configuratiebestanden, logbestanden en bronbestanden. Wees voorzichtig met het gebruik van een afzonderlijk Docker-bestand voor elke container. Ten slotte past u versioning toe op al uw containers om functies te scheiden en verschillende versies te gebruiken op basis van uw behoeften.
Beveiliging is een zeer belangrijk onderwerp in het geval van containers. Voer uw containers altijd uit in de onbevoorrechte modus. Ik stel voor dat u Apparmor gebruikt om uw container te beschermen tegen externe threads, zelfs zero-day-aanvallen. Ik raad SELinux ook aan om uw containers toe te passen voor het beveiligingsbeleid van toegangsbeveiliging volgens uw behoeften. Houd ook de updates bij van de afbeeldingen die u in containers gebruikt om de nieuwste patches op de container toe te passen. Vergeet hierbij niet om uw afbeelding vast te zetten op een stabiele versie.
Modulus is een volledig ondersteund implementatie- en orkestratieplatform voor ondernemingen. Ze zijn eerst begonnen met een op Node.js gerichte PaaS bovenop LXC en vervolgens besloten ze over te schakelen naar Docker, en dit liet hen meer talen ondersteunen dan Node.js, d.w.z. PHP, Java, Python en Static-projecten.
Wat ik bedoel met het ondersteunen van talen hier, is dat je je applicatie geschreven in de bovenstaande talen naar Modulus kunt implementeren met een enkele opdracht met vooraf gedefinieerde eigenschappen. Laten we zeggen dat u een Node.js-toepassing op Modulus implementeert, en het enige dat u hoeft te doen is uitvoeren modulus deploy
in de hoofdmap van uw project. Modulus bestaat uit de volgende componenten.
Modulus CLI is voor de implementatiebewerking voor uw toepassing vanaf de opdrachtregel en kan eenvoudig worden geïnstalleerd met npm install-g modulus
. U kunt projecten maken, projecten implementeren, logboeken streamen en enkele databasegerelateerde bewerkingen uitvoeren met Modulus CLI. Als alternatief kunt u uw project implementeren door het te uploaden via het admin-paneel.
U kunt uw toepassing maken en gebruiken met een paar eenvoudige stappen. U kunt taal, servoformaat en locatie selecteren. Maak je dan klaar om je project in te zetten.
U kunt ook een project op de opdrachtregel maken met modulus project creëren
en dan modulus deploy
.
Misschien wilt u wat gegevens opslaan in uw applicatie. Modulus laat je ook een database toevoegen aan je applicatie. MongoDB wordt achter de schermen gebruikt. U kunt binnen het dashboard een database maken en ook kunt u een database maken op de opdrachtregel. U kunt het databasescherm hieronder bekijken.
U kunt de database-URL pakken op het detailscherm en deze gebruiken in uw toepassingen.
U kunt applicatielogboeken naaien vanaf de opdrachtregel met modulus logt staart
, of u kunt logs streamen op het dashboard zoals hieronder.
Wanneer u op klikt STROOM knop, kunt u de logs in realtime bekijken.
Dat zijn de belangrijkste componenten van Modulus. Je kunt andere componenten bekijken zoals metriek, Auto-Scaling, addons, meldingen, en Toediening op het Modulus-dashboard.
We hebben containers besproken en een korte geschiedenis gegeven. In vergelijking met VM's heeft Docker veel alternatieven om uw applicatie-infrastructuur te beheren.
Als u Docker gebruikt voor uw architectuur, moet u voorzichtig zijn met sommige concepten, zoals Single Responsibility, Immutable Servers, Security, Application and Container Monitoring..
Wanneer uw systeem groter wordt, zal het zeer eenvoudig te bedienen zijn. Modulus is een van de bedrijven die Docker gebruikt voor zijn PaaS-systeem. Door de kracht van Docker te gebruiken, heeft Modulus een geweldig systeem ontworpen om mensen te helpen hun applicaties, geschreven in Node.js, PHP, Java en Python, heel gemakkelijk te implementeren..