‫Nu je de basis begrijpt van het maken van een zwerm met meerdere knooppunten en het maken van overlay-netwerken en Docker-services,
‫gaan we het volgende echt coole ding over Swarm behandelen, namelijk stapels. Geen stapels pannenkoeken, maar
‫stapels diensten. In 1. 13, heeft Docker deze geweldige functie
‫toegevoegd die een extra laag abstractie bovenop stapels toevoegt. Eigenlijk zijn het Compose-bestanden voor de productie van Swarm. Nu accepteren stapels
‫Compose-bestanden.
‫Binnenin is er wat we een declaratieve definitie zouden noemen, waar we stellen dat dit is wat ik
‫wil dat het eindresultaat is.
‫En het is de taak van de zwerm om dat allemaal uit te zoeken. Nu zijn het niet alleen diensten; het zijn ook netwerken
‫en volumes.
‫En een klein voorproefje.
‫Het gaat eigenlijk geheimen bevatten, waar we het in de komende lezingen over zullen hebben.
‫We mogen een nieuwe opdracht gebruiken, namelijk docker stack deploy om dit Compose-bestand te importeren en de opdracht uit te voeren die we
‫erin hebben geplaatst.
‫De stack regelt dit allemaal.
‫We hoeven niet eerst netwerken te creëren, of eerst volumes te creëren, maar we kunnen dat volledig doen.
‫We kunnen iets genaamd External in ons Compose-bestand gebruiken om te zeggen hey, dit zijn al dingen die
‫in mijn zwerm bestaan. Ga je gang en gebruik die, doe geen moeite om ze te maken.
‫Maar meestal heb je uiteindelijk je stacks die het allemaal voor je doen, omdat het op die manier gemakkelijker is.
‫We gaan een aantal nieuwe functies in ons Compose-bestand opnemen, dus we beginnen met
‫degenen die erg lijken op wat we eerder hadden. Maar we gaan deze nieuwe geïmplementeerde sleutel daar krijgen,
‫of woordenboek, waarmee we de dingen kunnen specificeren die specifiek zijn voor Swarm.
‫Hoeveel replica's willen we?
‫Wat willen we doen als we een failover uitvoeren? Hoe willen we rollende updates doen, en al
‫dat soort dingen waar we niet om zouden geven op onze lokale ontwikkelmachine.
‫Maar daar hangt een prijskaartje aan, namelijk dat we het bouwcommando nog niet kunnen uitvoeren. Dat is misschien iets dat nooit zal
‫gebeuren in Swarm, omdat de mentaliteit hier is dat bouwen niet zou moeten gebeuren op
‫je productiezwerm. Bouwen is iets dat uw CI-systeem zou moeten doen.
‫Misschien Jenkins of iets anders zoals Codeship.
‫Zodra u uw afbeeldingen hebt gebouwd en ze in uw repository hebt geplaatst, is deze stapel eigenlijk degene
‫die die afbeeldingen naar beneden haalt en ze implementeert met de implementatieopties.
‫Het goede nieuws is echter dat ze het echt met elkaar kunnen vinden.
‫Op uw lokale computer zal Compose feitelijk negeren wanneer u de opdracht docker-compose uitvoert.
‫Het negeert eigenlijk alle implementatie-informatie.
‫Het zal eigenlijk zeggen: 'Hé, je hebt hier implementatie-informatie.
‫Ik kan het niet echt gebruiken, dus ik ga het negeren. ' Evenzo,
‫wanneer je op Swarm bent en je een nieuwe stapel of een update voor een stapel implementeert, zal het
‫eigenlijk zeggen 'hey, je hebt hier build-commando's.
‫Ik doe geen builds, dus ik ga ze negeren en doorgaan. 'Het leuke is dat
‫je je dossier niet hoeft te wijzigen. We zullen later zien hoe we daadwerkelijk
‫een enkel Compose-bestand kunnen hebben dat alles doet wat we nodig hebben aan de ontwikkelingskant en
‫aan de productie-implementatiekant.
‫Het is best cool.
‫Ten slotte heb je de Docker Compose CLI, het binaire bestand, niet echt nodig. Dat hoeft niet in je
‫zwerm te zijn. Want nogmaals componeren, het eigenlijke commando, is geen productietool.
‫Het was niet ontworpen om te worden geproduceerd.
‫Het is ontworpen als een hulpmiddel voor ontwikkelaars en systeembeheerders.
‫Het is echt het beste voor lokaal werk aan onze machines.
‫De zwerm, die eigenlijk de Docker Engine is. De Docker Engine kan
‫nu Compose-bestanden accepteren met die stapelopdracht. Het leest de Compose-bestanden zonder dat Docker Compose ergens op de server nodig is.
‫Laten we snel terugkijken als we terugkijken op onze diensten.
‫Zo ziet onze dienstverlening eruit.
‫We zouden een dienst creëren...
‫laten we zeggen dat het Nginx is. En laten we zeggen dat we er drie replica's van hebben gespecificeerd.
‫Dus het zou dan drie taken in de orchestrator gaan maken, en die taken zouden bepaalde servers of knooppunten vinden
‫om ze op te zetten en ze zouden containers maken.
‫In de nieuwe stapels hebben we het over meerdere services, een of meer, toch. Je kunt daar tientallen services
‫hebben. In dat ene YAML-bestand.
‫Ze werken net als de services die we eerder hadden, alleen kunnen we nu volumes en overlay-netwerken in
‫dat Compose-bestand doen. En dat resulteert
‫in wat we een stapel zouden noemen. Een stapel regelt al die dingen.
‫En het zal zijn naam correct op alle objecten plaatsen, zodat u gemakkelijk kunt zien
‫welke verband houden met welke stapel. Het zal daar ook labels plaatsen, wat we
‫later zullen behandelen, wat meer metadata is om te kunnen bepalen uit welke stack dit specifieke ding kwam.
‫Dit is dus echt geweldig.
‫We kunnen nu een YAML-bestand gebruiken om al die dingen te doen die we niet in
‫de serviceopdrachten wilden typen. Omdat de servicecommando's al een beetje onpraktisch en lang werden. En toen maakten we uiteindelijk
‫Bash-scripts om die commando's uit te voeren, en toen werd het gewoon vervelend, toch.
‫Dus nu we Swarm al acht maanden hebben, krijgen we nu deze stapelfunctie die deze
‫services beheert.
‫Merk op dat de stapel slechts voor één zwerm is.
‫Rechts? Het kan niet veel zwermen aan.
‫Het zal maar op één zwerm draaien, zodat het alle knooppunten kan besturen en al deze
‫services, netwerken en volumes kan implementeren.
‫Ik moet zeggen dat dit diagram nog één ding kan bevatten, namelijk geheimen, omdat
‫de stapel die ook kan besturen. We zullen dat zien in een latere lezing in deze sectie. OKE.
‫Laten we eens kijken naar de stapels en hoe ze werken.
‫Ik ben terug in mijn zwerm met 3 knooppunten die we eerder hebben gebouwd. Ik ga het venster op knooppunt1 maximaliseren omdat ik
‫de andere twee knooppunten niet echt nodig heb.
‫Ik heb tenminste hun ssh-opdrachtregel niet nodig.
‫We gaan het voorbeeld van de stemapp gebruiken dat we in eerdere lezingen voor deze sectie hebben gedaan.
‫Als je je ons ontwerp daarvoor herinnert, waren het vijf verschillende services, en ze waren allemaal afhankelijk
‫van elkaar.
‫En het leverde ons uiteindelijk twee verschillende websites op.
‫Je ging door en ik weet zeker dat je de beste dienstenlijst hebt gemaakt met alle waarden en opties die het
‫nodig had en het was perfect, toch?
‫Ik ben hier om je te vertellen dat dat nu niet meer nodig is.
‫Het was erg belangrijk voor ons om ze te gebruiken en niet alles heeft een stapelbestand nodig.
‫Maar nu heb ik een stapelbestand.
‫Laten we er snel een kijkje nemen, want je zult merken dat het erg veel
‫op een Compose-bestand lijkt, omdat het dat ook is. Het enige echte belangrijkste dat u hoeft te veranderen, is dat het minimaal versie 3 of
‫hoger moet zijn.
‫De nieuwste versie op dit moment is versie 3. 1, maar ik weet zeker dat dat zal veranderen naarmate het
‫blijft veranderen en volwassener wordt.
‫Maar je hebt versie 3 nodig om stacks te gebruiken.
‫Je zult merken dat we onze redis hebben, en onze db, en onze stem, en al deze dingen
‫die waarschijnlijk erg op jou lijken uit je eigen werk. Je bent waarschijnlijk erg bekend met die en de afbeeldingen die ze nodig
‫hebben, en de poorten die ze moeten openen en zo.
‫Maar in dit geval zult u deployment opmerken.
‫Hier implementeren is een nieuwe optie. Je zult hier zien dat ik aan het specificeren was hoeveel
‫replica's ik wil, dat is hoeveel exemplaren van die afbeelding er tegelijk moeten worden uitgevoerd.
‫En wat er gebeurt als ik een update doe.
‫Dus wanneer ik een echte stack-update doe, die dan service-updates zal doen.
‫Hoe wil ik dat dat uitpakt?
‫Rechts?
‫Wil ik allemaal tegelijk naar beneden? Wil ik er maar één tegelijk?
‫Hoeveel vertraging zit er tussen?
‫Er zijn hier allerlei opties.
‫We zijn gewoon een beetje aan het oppervlak, maar je kunt zien dat ik hier een herstartbeleid
‫heb dat als de container faalt, deze automatisch opnieuw start.
‫Je kunt hier onder de database
‫zien, ik heb eigenlijk beperkingen ingevoerd om er zeker van te zijn dat het op een specifiek knooppunt staat.
‫We hebben nog niet veel over beperkingen gesproken, maar er zijn manieren waarop
‫we objecten kunnen labelen, dat wil zeggen containers of afbeeldingen of echt alles wat we kunnen maken of vernietigen in Swarm of in Docker zelf.
‫We kunnen eigenlijk aan elk van deze labels toewijzen, inclusief knooppunten, en een knooppunt dat een manager is, krijgt zijn
‫eigen labels.
‫Dit is heel gemakkelijk voor ons om gewoon te zeggen, hey, deze container moet draaien op een knooppunt dat
‫deze specifieke rol heeft.
‫Mooi voorbeeld daar. Terwijl we naar beneden scrollen, hebben we enkele parallellisme-opties die we eerder hebben gezien.
‫Deze vertragingsoptie is best cool. Als je een soort van opwarmtijd hebt
‫als je containers hebt die draaien. Misschien zijn ze begonnen, maar ze gaan niet echt live voor misschien 60 seconden of zoiets.
‫U kunt daar vertragingen toevoegen. We zullen daar later
‫naar kijken tijdens blauwgroene productie-implementaties. Voor nu kun je zien dat die allemaal vrij standaard zijn.
‫We hebben hier nog meer opties. Je kunt eigenlijk zien dat ik hier een specifiek label aan toeken.
‫Ik heb een venster en een maximumpoging voor herstartbeleid.
‫Dus als het probeert opnieuw op te starten en het blijft mislukken, zal het het niet meer dan drie keer proberen.
‫Laten we het bekijken.
‫Het enige wat ik moet doen is een docker-stack deploy -c voor compose doen. Dus ik ga een Compose-bestand gebruiken.
‫Nu ga ik het stemapp noemen. En daar gaan we. Het heeft niet echt alles gecreëerd en zo
‫snel opgevoerd.
‫Het enige dat het deed, was die objecten in de planner maken, die vervolgens het proces van het maken
‫van de services doorloopt, die vervolgens de taken maken, die vervolgens de containers maken.
‫Het moet ook de netwerken maken, zoals je hier zult zien. Onthoud dat we de frontend en
‫de backend hadden, dus het creëerde die, evenals een standaardnetwerk, dat dat specifieke stapelbestand dat ik had
‫een standaardnetwerk gebruikte.
‫En dan zie je deze optie voor visualizer, een nieuwe die we nog niet eerder hebben gebruikt.
‫Dat zullen we zo zien.
‫Dus laten we de docker-stackopdracht wat meer bekijken.
‫Je zult zien dat we kunnen inzetten. Dat hebben we al gedaan.
‫Dan hebben
‫we een ls, een ps, een rm en services.
‫Dus deze opdracht heeft niet heel veel functies.
‫Het is vrij eenvoudig omdat alle functionaliteit echt in het Compose-bestand zit en echt in de
‫objecten die het maakt.
‫Omdat we dat allemaal al hebben gedaan, kunnen we dingen doen zoals ls, die ons al onze stapels laat zien.
‫Het is een vrij basiscommando. We hebben alleen die ene. Als ik dan een ps doe, laat het me zien... oeps, ik
‫moet de naam opgeven.
‫stemmen.
‫Het heet stemapp.
‫Ik moet dat goed krijgen.
‫OKE.
‫Laat me dat even onderbouwen, zodat je dat wat beter kunt zien. Precies daar.
‫Dit zijn de eigenlijke taken. Dan kun je zien op welke node ze draaien.
‫Het zijn niet echt de containers. Het is eigenlijk de taak die we hier zien. Want als het de eigenlijke container
‫was, zouden we een grote, lange naam zien. Want als je je herinnert, de services die we eerder hebben gemaakt,
‫hadden deze hele lange namen
‫als we het echt gingen doen docker ps. Rechts? Als ik een docker-container ls
‫deed, of een docker ps, krijg je deze hele lange namen. En dat komt omdat ze allemaal een GUID krijgen, omdat elke
‫container een unieke naam moet hebben.
‫Zo garanderen ze dat ze altijd uniek zijn en nooit botsen.
‫Dan is de laatste
‫hier docker stack services voteapp.
‫Ik vind deze eigenlijk het leukst, omdat hij me mijn replica's laat zien.
‫Het is net
‫zoiets als een service ls doen. Het laat me zien hoeveel replica's ik heb gestart, zodat ik weet of
‫ik het juiste aantal containers al heb gestart. Als ik dan dieper wil
‫duiken, kan ik een docker-stack ps doen. We krijgen hier de taaknamen en we zien op welke knooppunten ze draaien.
‫Deze twee samen geven je eigenlijk een compleet beeld van hoe deze hele applicatie draait.
‫Als ik me in het netwerk wilde verdiepen, zou ik een docker-netwerk kunnen doen,
‫net zoals we normaal zouden doen.
‫En je kunt deze drie nieuwe overlay-netwerken zien die voor deze app zijn gemaakt. En merk op dat de
‫app-naam altijd aan het begin staat. De stapel gaat altijd vooraf aan de naam van de service.
‫Dus elke stapel zorgt ervoor dat zijn naam vooraan staat.
‫En laten we dan gaan kijken.
‫Laat me mijn browser openen.
‫Oke.
‫We kunnen ze zien op poort 5000.
‫Ik heb de stemsite draaiende.
‫Ik ga naar 5001.
‫Ik heb de resultatensite, dus ik kan hier klikken en dan het resultaat zien.
‫Dan wordt deze nieuwe die we hebben een Visualizer genoemd.
‫Hij staat op 8080. De Visualizer is eigenlijk een behoorlijk nette tool voor demonstratiedoeleinden.
‫Dat is eigenlijk gemaakt... dit alles is trouwens gemaakt door Docker, en
‫dit zijn allemaal open source repo's die je kunt zien in de sectie Bronnen van deze sectie.
‫Daarom hebben we voor elke service verschillende kleuren.
‫Het resultaat van de voteapp is groen.
‫En dan is de redis een beetje mosterd, en de stem is roze. Je kunt zien dat er twee stemmen zijn en
‫twee redises.
‫Het is best geweldig om te laten zien wat er gebeurt als dingen rond de zwerm bewegen.
‫Als ik daadwerkelijk in mijn dossier ben gegaan en een wijziging heb aangebracht.
‫Laten we naar de stem-app gaan en laten we zeggen dat we de replica's willen veranderen in vijf.
‫We kunnen de service gaan updaten. Maar dat is een soort AntiPattern. Als we naar binnen gaan en
‫handmatig opdrachten in de service typen, zoals
‫docker-service-update, zou dat betekenen dat de volgende keer dat ik dit YAML-bestand opnieuw toepas, het die wijzigingen gaat overschrijven.
‫Als je ooit een cloudformatie in AWS of een ander configuratiebeheer hebt gedaan, weet je dat als je eenmaal
‫een configuratiebestand als dit gebruikt om je infrastructuur te beheren, je dit bestand echt altijd wilt gebruiken
‫omdat het de bron wordt van de waarheid.
‫Dus het zou waarschijnlijk, in productie, een soort bestand zijn dat je bewaart in een Git Repository waar je
‫versiebeheer op hebt staan, en je beheert wijzigingen, en op die manier kun je wijzigingen terugdraaien.
‫In dit geval ga ik dat bestand heel snel veranderen, en we gaan hetzelfde commando uitvoeren, docker
‫stack deploy.
‫Merk op dat we geen update hebben. Omdat we naar dezelfde stack gaan implementeren en het
‫zal herkennen dat het bestaat, en dat we het gaan updaten op basis van deze wijzigingen.
‫Om het bij te werken, moeten we ervoor zorgen dat we de juiste naam gebruiken.
‫Dus het is stemapp. En merk dan op dat het updates van services zegt, maar erkent dat het deze moet wijzigen.
‫Als we dan naar onze visualizer gaan, kun je zien dat we het al hebben.
‫We zijn gewoon te traag vandaag, nietwaar.
‫We kunnen de zwerm niet bijhouden. We hebben nu al vijf van deze stemapps draaien.
‫Als het een tijdje duurde om te starten en te lanceren, zouden we hun status hier zien veranderen toen ze
‫online kwamen.
‫Maar het is een eenvoudige web-app, dus het zal vrij snel opstarten.
‫Oke.
‫Dat zijn stapels.
‫Laten we nu de geheimen aan onze stapels toevoegen.