‫Deze sectie gaat zich uitsluitend richten op Docker Compose, een combinatie
‫van een opdrachtregelprogramma en een configuratiebestand. Vereisten voor deze sectie zijn dat je
‫echt veel van de basisprincipes van de laatste paar secties over afbeeldingen en containers moet kennen.
‫Terwijl we deze cursus doornemen, zul je me waarschijnlijk steeds enthousiaster gaan
‫horen worden, omdat de dingen alleen maar beter worden.
‫Rechts?
‫Terwijl je één component leert, denk je, 'man, bind mounts en volumes zijn echt cool. Dat gaat me wat tijd
‫schelen. Ik kan me voorstellen hoe ik dat ga gebruiken. Blah blah blah blah.
‫Dan kom ik met het volgende dat nog beter zal zijn dan wat je net hebt geleerd.
‫In dit geval kan het niet meer waar zijn.
‫Docker Componeren. Dus wat is het? En waarom maakt het ons uit? Er zijn dus maar weinig softwarediensten die echt op zichzelf staan.
‫Als u aan uw containers denkt, is het een oplossing met één proces, en we zullen zelden slechts één container
‫gebruiken om een probleem op te lossen of een service aan onze klanten te verlenen.
‫Onze containers hebben vaak andere containers nodig, zoals SQL of een sleutelwaarde. En andere applicaties die we
‫in containers moeten draaien, zoals proxy's of webfrontends of backend-workers, enzovoort.
‫Wat als we een manier hadden om al die delen van onze oplossing met elkaar
‫te verbinden, waarbij we niet al onze docker-run-opties hoefden te onthouden, en ze vervolgens in discrete, virtuele netwerken met onderlinge
‫relaties te krijgen, en alleen het publiek bloot te stellen poorten, en draai ze dan allemaal op en breek ze af met
‫één commando.
‫Nou, dat is Docker Compose.
‫Voordat we erin duiken, moeten we duidelijk maken dat
‫Docker Compose uit twee delen bestaat. Het eerste deel is het YAML-bestand en het is supereenvoudig te begrijpen.
‫Het is geschreven in YAML, en als je nog nooit met YAML te maken hebt gehad, is dat een heel gemakkelijke configuratietaal.
‫Het is bijna net zo eenvoudig als een INI-bestand zou zijn.
‫Ik denk eigenlijk dat het makkelijker is omdat het hiërarchie laat zien.
‫Daar duiken we in. In dat bestand zou je alle containers specificeren die
‫je nodig hebt om te draaien, de netwerken die je nodig hebt, alle volumes die je nodig hebt, omgevingsvariabelen, afbeeldingen en allerlei
‫andere configuratie-opties.
‫Dan is het tweede deel van Docker Compose een CLI-tool, die docker -compose is, die we
‫normaal gebruiken voor alleen lokale ontwikkeling en tests, waarbij we dat YAML-bestand gebruiken dat we hebben gemaakt om onze Docker-commando's te vereenvoudigen.
‫Laten we het hebben over dat Docker Compose-bestand.
‫Er zijn eigenlijk versies van de dingen die je in het opstelbestand kunt zetten. Dus toen Docker Compose jaren geleden werd gemaakt, heette het eigenlijk
‫"Fig" en werd aangenomen dat het versie 1 was. Het vermeldde niet eens
‫een versie in het bestand. Naarmate het volwassener is geworden en nieuwe functies heeft
‫toegevoegd aan wat het bestand erin kan hebben, zoals netwerken en volumes, hebben ze de versieverklaring gemaakt, die eigenlijk
‫de eerste regel in het bestand is. Dit bestand kan daadwerkelijk worden gebruikt met een Docker Compose CLI, waar we het
‫zo over hebben.
‫Dit is, nogmaals, voornamelijk voor lokaal ontwikkelingsbeheer en maakt het gewoon gemakkelijker om in uw omgevingen
‫op uw lokale computer te navigeren.
‫Nu, vanaf begin 2017, hebben we versie 1. 13 en alles daarbuiten, deze bestanden kunnen nu rechtstreeks worden
‫gebruikt met de docker-opdrachtregel in productie met swarm. Natuurlijk is er grote hulp op
‫de opdrachtregel met de --help.
‫Als we naar enkele voorbeelden kijken, weet dan dat het Docker Compose-bestand een standaardnaam is, maar dat u eigenlijk
‫elke gewenste bestandsnaam kunt gebruiken, zolang het maar de juiste YAML is en dat u de -f gebruikt om aan te geven welk bestand
‫u' opnieuw proberen te gebruiken.
‫Als ik mijn editor open en naar de sjabloon hier kijk, wil ik alleen een beetje laten zien hoe dit
‫eruit zou moeten zien.
‫We hebben de versiewaarde in het begin.
‫De nieuwste versie in het eerste kwartaal van 2017 is 3. 1.
‫Maar ik maak er altijd minimaal versie 2 van. Als je die regel daar niet toevoegt, wordt altijd aangenomen dat het versie 1
‫is.
‫Maar dat raad ik niet aan, omdat je veel functies verliest.
‫Dus ik begin meestal met versie 2. Als ik dan specifieke functies van versie 3 en 3 nodig heb. 1, ik
‫typ daar het versienummer in. Je zult zien dat de andere drie hoofdsecties
‫services, volumes en netwerken zijn, toch?
‫Dit is dus hiërarchisch.
‫Onder services kan alles twee of vier ruimtes zijn, maar het moet wel consistent zijn.
‫Als u YAML gewoon op internet opzoekt, vindt u enkele sites die u helpen met de details van het
‫formatteren van dit bestand.
‫Als je een moderne editor gebruikt, zal deze de YAML-taal spreken en weten hoe om te gaan met
‫deze bestanden en hun opmaak.
‫Meestal heb je hier op zijn minst diensten, wat eigenlijk alleen maar containers zijn.
‫De reden dat ze ze eigenlijk services noemen, is omdat je voor elke container die je hier maakt, meerdere
‫van die containers zou kunnen hebben voor redundantie. Dus moesten ze een ander woord
‫bedenken.
‫Ik vind services geweldig, want dat is eigenlijk wat je doet. Rechts?
‫Elke container, of containers, die identiek zijn, die u gebruikt, levert meestal een service aan
‫iets.
‫Onder de servicenaam, en nogmaals, je kunt het noemen zoals je wilt.
‫Het hoeft niet de naam van de afbeelding te zijn of het hoeft helemaal niets met elkaar te maken te hebben.
‫Het zou Barney kunnen zijn voor de servicenaam, maar het zal de DNS-naam zijn, die we later zullen
‫ontdekken, wordt gebruikt binnen uw Docker-netwerken.
‫Vergelijkbaar met wanneer je de --name geeft aan een docker run-commando.
‫Hier heb ik laten zien dat we de afbeelding optioneel kunnen specificeren. We kunnen de alternatieve opdracht specificeren
‫die moet worden uitgevoerd. Als we de daadwerkelijke opdracht die in de afbeelding was opgegeven toen we deze uitvoerden,
‫wilden overschrijven, kunnen we dat hier doen.
‫Kortom, alle dingen die we doen met de opdracht docker run, kunnen we hier opslaan. Want dat is waar dit
‫echt over gaat, is al het werk uit het onthouden van alle verschillende dingen in het
‫docker run-commando voor die dingen die je constant uitvoert.
‫Als u uw eigen ontwikkelomgevingen of uw eigen tools hebt, wilt u die opdrachten
‫waarschijnlijk niet steeds opnieuw typen. En shellscripts kunnen maar zoveel.
‫Rechts?
‫Dit bestand zou dus eigenlijk een shellscript vervangen dat uw docker-uitvoeringsopdrachten zou automatiseren.
‫Dit is een veel betere manier om het te doen.
‫Het is gemakkelijker te lezen en het is beter gedocumenteerd.
‫U zult merken dat spaties hier zijn toegestaan.
‫U kunt spaties in opmerkingen plaatsen waar u maar wilt.
‫Als u meerdere services had, hoeft u alleen maar te controleren of het unieke namen zijn.
‫De andere onderdelen die we specificeren zijn volumes en netwerken. En nogmaals, deze zijn ook optioneel.
‫Het zijn in principe dezelfde regels als wanneer u vanaf de opdrachtregel rent.
‫Als u ooit de docker-volume create of de docker network create-commando's zou moeten gebruiken, en nogmaals, u hoeft
‫dat niet altijd te doen.
‫Het hangt gewoon af van uw situatie.
‫Je kunt ze hier ook neerzetten.
‫Laten we eens kijken naar een echte wereld, een eenvoudig voorbeeld.
‫Weet je nog, in het laatste gedeelte hadden we een lezing waarin we Jekyll heel snel gebruikten om gewoon een
‫bind-mount-voorbeeld te doen.
‫Dus dit is hoe het samenstellingsbestand eruit zou zien voor dat docker-run-commando, en je zult zien dat ik
‫de afbeelding hier heb gespecificeerd.
‫Ik heb het Jekyll genoemd.
‫Ik heb het een volume gegeven. Je zult merken dat in plaats van de pwd te gebruiken, Compose de punt echt begrijpt,
‫wat betekent dat dit de huidige werkdirectory is waarin ik me bevind.
‫Gebruik gewoon deze map van waaruit ik het opstelbestand uitvoer. Dan de poorten of de -p optie.
‫Je zult een paar kleine dingen opmerken over YAML, waar als iets maar één optie heeft,
‫bijvoorbeeld als er maar één afbeelding voor elke service zal zijn, het meestal een sleutel- en waardeformaat als dit is.
‫Als het een lijst met items wordt, zoals volumes en poorten waar je meerdere kunt hebben, zul je
‫merken dat het opstelbestand meestal een meervoud heeft. In plaats van volume zijn het volumes. En in plaats van poort zijn het poorten.
‫En dan is er een lijstformaat met een -.
‫Als we heel snel naar een ander voorbeeld springen.
‫Je zult zien dat dit in
‫deze een voorbeeld is van een WordPress-setup waarbij je de databaseservice hier beneden hebt die
‫een databasecontainer draait.
‫En dan de WordPress-webservercontainer bovenaan.
‫Je zult merken dat een klein ding dat hier anders aan is, is dat we de omgevingsvariabelen
‫gebruiken, wat hetzelfde zou zijn als een -e op de opdrachtregel. Maar in plaats van een lijstformaat waar
‫we een -
‫hebben, is dit opnieuw een sleutel- en waardestatement.
‫In dit formaat gebruiken we de - niet, we vermelden alleen de sleutel en de waarde.
‫Als ik er nog een zou moeten toevoegen, zou ik dat hier doen. Al deze zouden worden doorgegeven aan de
‫container, wanneer deze wordt uitgevoerd, met behulp van de compose-opdrachtregel.
‫Tot slot hebben we nog een voorbeeld. Deze is iets ingewikkelder. Het is er
‫een waar ik onlangs aan werkte om een servercluster met drie databases op te zetten achter een Ghost-webserver.
‫Ghost is eigenlijk een blogsysteem vergelijkbaar met WordPress. U zult zien dat ik
‫meerdere omgevingsvariabelen heb voor elk van deze containers.
‫Dus ik heb mijn Ghost-container bovenaan. Dan heb ik eigenlijk dit ding dat bekend
‫staat als een SQL-proxy, die voor MySQL-servers zit en fungeert als een load balancer en een failover-oplossing.
‫Dan heb ik elk van mijn twee MySQL-servers. Je zult hier een andere optie zien die zegt: 'hangt af van'
‫en hangt af van is een vrij algemene optie.
‫Het helpt Compose in feite de relatie tussen deze services te begrijpen. Het weet dat als ik
‫mijn Ghost-één moet starten, ik ook andere moet starten.
‫Je kunt hier boven zien dat mijn Ghost eigenlijk hiervan afhangt. We zullen in latere colleges ingaan op
‫de details van hoe dit werkt.
‫Maar voor nu is dit waarschijnlijk veel om te verwerken, en al deze verschillende commando's en zo, maar
‫vertrouw erop dat Docker geweldige documentatie op hun website heeft staan. Als u alleen naar het Docker Compose-bestand op Google
‫zoekt, vindt u dit waarschijnlijk bij de eerste paar hits.
‫Het zal onder de documenten staan. havenarbeider. com-website, zoals gewoonlijk, en
‫het zal documentatie zijn over elke kleine sleutel en waarde-optie die je hebt.
‫Je zult zien dat het afhangt van wat ik net noemde. U ziet hier de omgeving waar het verschillende manieren laat zien
‫om omgevingsvariabelen in te voeren. Het mooie van deze documentatie is dat je
‫genoeg voorbeelden krijgt.
‫Persoonlijk ben ik elke dag op deze site, net zoals ik op de docker run command options-pagina of de compose
‫command options-pagina ben.
‫Ik verwijs er constant naar omdat er tegenwoordig eerlijk gezegd zoveel functies zijn dat ik ze niet
‫allemaal kan onthouden.
‫Dus ik bewaar ze dicht in mijn bladwijzers.
‫Nu we een algemeen idee hebben van hoe het compose-bestandsformaat eruit zou kunnen zien, gaan we naar
‫de opdrachtregel en leren we meer over de Docker Compose CLI-tool.