Een bestaande Docker-installatiekopie ophalen en deze lokaal implementeren

Voltooid

Docker is een technologie waarmee u snel en eenvoudig toepassingen en services kunt implementeren. Een Docker-app wordt uitgevoerd met behulp van een Docker-installatiekopie. Een Docker-installatiekopie is een voorverpakte omgeving die de code van de toepassing en de omgeving bevat waarin de code wordt uitgevoerd.

In het bedrijfsscenario dat we eerder hebben beschreven, wilt u de haalbaarheid van het verpakken en uitvoeren van een app met Docker onderzoeken. U hebt besloten een Docker-installatiekopie te bouwen en te implementeren waarop een testweb-app wordt uitgevoerd.

In deze eenheid wordt uitgelegd wat de belangrijkste concepten en processen zijn die betrokken zijn bij het uitvoeren van een in een container geplaatste app die in een Docker-installatiekopie is opgeslagen.

Overzicht van Docker

Docker is een hulpprogramma voor het uitvoeren van in containers geplaatste apps. Een app in een container bevat de app en het bestandssysteem die de omgeving vormen waarin deze wordt uitgevoerd. Een app in een container kan bijvoorbeeld bestaan uit een database en andere gekoppelde software- en configuratiegegevens die nodig zijn om de app uit te voeren.

Een in een container geplaatste app is doorgaans veel kleiner van omvang dan een virtuele machine die is geconfigureerd om diezelfde app uit te voeren. Deze kleinere footprint komt doordat een virtuele machine in het volledige besturingssysteem en de daaraan gekoppelde ondersteunende omgeving moet voorzien. Een Docker-container heeft deze overhead niet omdat Docker gebruikmaakt van de kernel van het besturingssysteem van de hostcomputer om de container te laten functioneren. Het downloaden en starten van een Docker-installatiekopieën is sneller en efficiënter dan het downloaden en uitvoeren van een virtuele machine die vergelijkbare functionaliteit biedt.

U maakt een container-app door een installatiekopieën te bouwen die een set bestanden bevat en een sectie met configuratiegegevens die Docker gebruikt. U kunt de app uitvoeren door Docker te instrueren om een container te starten op basis van de installatiekopie. Wanneer de container wordt gestart, maakt Docker gebruik van de configuratie van de installatiekopie om te bepalen welke toepassing in de container moet worden uitgevoerd. Docker biedt de besturingssysteemresources en de benodigde beveiliging. Het zorgt ervoor dat containers gelijktijdig worden uitgevoerd en relatief geïsoleerd blijven.

Belangrijk

Docker biedt niet het isolatieniveau dat beschikbaar is voor virtuele machines. Bij een virtuele machine wordt isolatie op hardwareniveau geïmplementeerd. Docker-containers delen onderliggende resources en bibliotheken van het besturingssysteem. Docker zorgt er echter voor dat de ene container geen toegang heeft tot de resources van een andere container, tenzij de containers hiervoor zijn geconfigureerd.

U kunt Docker lokaal op uw desktop of laptop uitvoeren als u lokaal ontwikkelt en test. Docker is voor productiesystemen beschikbaar voor serveromgevingen, waaronder veel varianten van Linux en Microsoft Windows Server 2016. Veel leveranciers bieden ook ondersteuning voor Docker in de cloud. U kunt bijvoorbeeld Docker-installatiekopieën in Azure Container Registry opslaan en containers uitvoeren met Azure Container Instances.

In deze module gebruikt u Docker lokaal om een installatiekopieën te bouwen en uit te voeren. Vervolgens uploadt u de installatiekopieën naar Azure Container Registry en voert u deze uit in een Azure Container Instance. Deze versie van Docker is geschikt voor het lokaal ontwikkelen en testen van Docker-installatiekopieën.

Docker-installatiekopieën voor Linux en Windows

Docker is in eerste instantie ontwikkeld voor Linux en is sindsdien uitgebreid ter ondersteuning van Windows. Afzonderlijke Docker-installatiekopieën zijn ofwel voor Windows ofwel voor Linux, maar niet tegelijkertijd voor beide. Het besturingssysteem van de installatiekopieën bepaalt welk type besturingssysteemomgeving in de container wordt gebruikt.

Auteurs van Docker-installatiekopieën die vergelijkbare functionaliteit voor Linux- en Windows-installatiekopieën willen kunnen aanbieden, kunnen die installatiekopieën afzonderlijk bouwen. Microsoft biedt bijvoorbeeld Windows- en Linux Docker-installatiekopieën met een ASP.NET Core-omgeving die u kunt gebruiken als basis voor in containers geplaatste ASP.NET Core-toepassingen.

Op Linux-computers waarop Docker is geïnstalleerd kunnen alleen Linux-containers worden uitgevoerd. Op Windows-computers waarop Docker is geïnstalleerd kunnen beide soorten containers worden uitgevoerd. Windows wordt beide uitgevoerd met behulp van een virtuele machine om een Linux-systeem uit te voeren en gebruikt het virtuele Linux-systeem om Linux-containers uit te voeren.

In deze module bouwt en voert u een op Linux gebaseerde installatiekopieën uit.

Docker-registers en Docker Hub

Docker-installatiekopieën worden opgeslagen en beschikbaar gemaakt in registers. Een register is een webservice waarmee Docker verbinding kan maken om containerinstallatiekopieën te uploaden en downloaden. Het meest bekende register is Docker Hub. Dit is een openbaar register. Veel mensen en organisaties publiceren installatiekopieën naar Docker Hub. U kunt deze installatiekopieën downloaden en uitvoeren met behulp van Docker die op uw desktop, een server of in de cloud wordt uitgevoerd. U kunt een Docker Hub-account maken en uw installatiekopieën er gratis naar uploaden.

Een register is ingedeeld als een reeks opslagplaatsen. Elke opslagplaats bevat meerdere Docker-installatiekopieën die een gemeenschappelijke naam delen en in het algemeen ook hetzelfde doel en dezelfde functionaliteit hebben. Deze installatiekopieën hebben normaal gesproken verschillende versies, geïdentificeerd met een tag. Door dit mechanisme is het mogelijk om meerdere versies van installatiekopieën te publiceren en bewaren, om tegemoet te kunnen komen aan compatibiliteitsvereisten. Wanneer u een installatiekopie downloadt en uitvoert, moet u het register-, de opslagplaats- en het versielabel van de installatiekopie opgeven. Tags zijn teksttags waarvoor u uw versienummeringssysteem kunt gebruiken (v1.0, v1.1, v1.2, v2.0 enzovoort).

Stel dat u de Docker-installatiekopie van ASP.NET Core Runtime wilt gebruiken. Deze installatiekopie is beschikbaar in twee versies:

  • 8.0 (langetermijnondersteuning): mcr.microsoft.com/dotnet/aspnet:8.0
  • 6.0 (langetermijnondersteuning): mcr.microsoft.com/dotnet/aspnet:6.0

Stel nu dat u de Docker-installatiekopieën van .NET Core-voorbeelden wilt gebruiken. Hier zijn vier versies beschikbaar waaruit u kunt kiezen:

  • mcr.microsoft.com/dotnet/samples:dotnetapp
  • mcr.microsoft.com/dotnet/samples:dotnetapp-chiseled
  • mcr.microsoft.com/dotnet/samples:aspnetapp
  • mcr.microsoft.com/dotnet/samples:aspnetapp-chiseled

Notitie

Aan één installatiekopie kunnen meerdere tags zijn toegewezen. Aan de meest recente versie van een installatiekopieën wordt standaard de meest recente tag toegewezen, naast een tag die het versienummer beschrijft. Als u een nieuwe versie van een installatiekopie vrijgeeft, kunt u het label nieuwste opnieuw toewijzen om te verwijzen naar de nieuwe installatiekopie.

Een opslagplaats is ook de eenheid waarmee de mate van privacy van een installatiekopie wordt bepaald. Als u een afbeelding niet wilt delen, kunt u de opslagplaats privé maken. U kunt toegang verlenen aan andere gebruikers met wie u de installatiekopie wilt delen.

Door Docker Hub bladeren en een installatiekopie ophalen

Notitie

U hoeft geen voorbeelden te voltooien of een van de code uit te voeren in de volgende secties. Dat doet u in de volgende les.

Vaak vindt u dat er een installatiekopie in Docker Hub is die nauw overeenkomt met het type app dat u in een container wilt opnemen. U kunt een dergelijke installatiekopie downloaden en deze uitbreiden met uw toepassingscode.

Docker Hub bevat vele duizenden installatiekopieën. U kunt met behulp van Docker zoeken en bladeren in een register vanaf de opdrachtregel of de Docker Hub-website. Met de website kunt u installatiekopieën zoeken, filteren en selecteren op type en uitgever. De afbeelding hieronder bevat een voorbeeld van de zoekpagina.

Schermopname van de Docker Hub-zoekpagina waarin verschillende containerinstallatiekopieën worden weergegeven.

U gebruikt de opdracht docker pull en de naam van de installatiekopie om een installatiekopie op te halen. Standaard wordt de installatiekopie met de tag latest uit die opslagplaats op Docker Hub gedownload als u alleen de naam van de opslagplaats opgeeft. Denk eraan dat u de opdracht zo kunt wijzigen dat verschillende tags worden opgehaald en uit verschillende opslagplaatsen. In dit voorbeeld wordt de afbeelding opgehaald met de tag aspnetapp uit de mcr.microsoft.com/dotnet/samples:aspnetapp opslagplaats. Deze installatiekopie bevat een eenvoudige ASP.NET Core-web-app.

Notitie

De voorbeelden in deze eenheid zijn bedoeld om de syntaxis van de verschillende Docker-opdrachten weer te geven. U hoeft deze opdrachten niet uit te voeren terwijl u deze les doorneemt. De oefeningen die op deze les volgen, leiden u door het rechtstreeks werken met Docker.

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp

Wanneer u een installatiekopie ophaalt, wordt deze lokaal opgeslagen door Docker en beschikbaar gemaakt voor het uitvoeren van containers. U kunt de installatiekopie in het lokale register bekijken met behulp van de opdracht docker image list.

docker image list

De uitvoer ziet eruit als in het volgende voorbeeld:

REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/samples   aspnetapp           6e2737d83726        6 days ago          263MB

U kunt de naam-id van de installatiekopieën gebruiken om te verwijzen naar de installatiekopieën in veel andere Docker-opdrachten.

Een Docker-container uitvoeren

Gebruik de opdracht docker run om een container te starten. Geef de installatiekopie op die moet worden uitgevoerd door de naam of id in te voeren. Als u docker pull nog niet voor de installatiekopie hebt gebruikt, doet Docker dit voor u.

docker run mcr.microsoft.com/dotnet/samples:aspnetapp

In dit voorbeeld reageert de opdracht met het volgende bericht:

warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
 No XML encryptor configured. Key {d8e1e1ea-126a-4383-add9-d9ab0b56520d} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

Deze installatiekopie bevat een web-app, er wordt dus naar aanvragen geluisterd die binnenkomen op HTTP-poort 80. Als u echter u een webbrowser opent en naar http://localhost:80 gaat, ziet u de app niet.

Standaard staat Docker niet toe dat inkomende netwerkaanvragen uw container bereiken. U moet Docker instrueren om een specifiek poortnummer van uw computer toe te wijzen aan een specifiek poortnummer in de container door de optie -p toe te voegen aan docker run. Met deze instructie kunnen netwerkaanvragen aan de container op de opgegeven poort worden gedaan.

Bovendien is het niet de bedoeling dat de web-app in deze installatiekopie interactief vanaf de opdrachtregel wordt gebruikt. Als we de app starten, willen we dat Docker deze op de achtergrond start en daar uitvoert. Gebruik de -d-markering om Docker te instrueren om de web-app op de achtergrond te starten.

Druk op Ctrl+C om de afbeelding te stoppen en de afbeelding opnieuw op te starten, zoals wordt weergegeven in het volgende voorbeeld:

docker run -p 8080:80 -d mcr.microsoft.com/dotnet/samples:aspnetapp

Met de opdracht wordt poort 80 in de container toegewezen aan poort 8080 op uw computer. Als u in een browser naar de pagina http://localhost:8080 gaat, ziet u de voorbeeld-web-app.

Schermopname van de voorbeeld-web-app die wordt uitgevoerd in een browser.

Containers en bestanden

Als door een actieve container de bestanden in de installatiekopie worden gewijzigd, komen deze wijzigingen alleen voor in de container waar de wijzigingen zijn aangebracht. Tenzij u specifieke stappen uitvoert om de status van een container te behouden, gaan deze wijzigingen verloren wanneer de container wordt verwijderd. Op dezelfde manier delen meerdere containers op basis van dezelfde installatiekopieën die tegelijkertijd worden uitgevoerd niet de bestanden in de afbeelding. Elke container heeft een eigen onafhankelijke kopie. Gegevens die door één container naar het bestandssysteem worden geschreven, zijn niet zichtbaar voor de andere container.

Het is mogelijk schrijfbare volumes aan een container toe te voegen. Een volume vertegenwoordigt een bestandssysteem dat de container kan koppelen en beschikbaar wordt gesteld aan de toepassing die wordt uitgevoerd in de container. De gegevens in een volume blijven behouden wanneer de container wordt beëindigd, en meerdere containers kunnen hetzelfde volume delen. De details voor het maken en gebruiken van volumes maken geen deel uit van deze module.

Het is een best practice om te voorkomen dat u wijzigingen moet aanbrengen in het bestandssysteem van de installatiekopie voor toepassingen die zijn geïmplementeerd met Docker. Gebruik dit alleen voor tijdelijke bestanden die verloren kunnen gaan.

Docker-containers beheren

U kunt actieve containers bekijken met de opdracht docker ps.

docker ps

De uitvoer bevat de containerstatus (Up if it's running, Exited if it's terminated), naast andere waarden zoals de opdrachtregelvlagken die zijn opgegeven toen de installatiekopie werd gestart en aanvullende informatie. Met Docker kunt u meerdere containers tegelijk vanuit dezelfde installatiekopieën uitvoeren, zodat aan elke container een unieke id en een unieke, door mensen leesbare naam wordt toegewezen. Voor de meeste Docker-opdrachten die worden gebruikt om afzonderlijke containers te beheren kan van de id of de naam gebruik worden gemaakt om naar een bepaalde container te verwijzen.

In de volgende uitvoer ziet u twee containers. Het veld POORTEN laat zien dat in de container met de id elegant_ramanujan de installatiekopie wordt uitgevoerd, waarbij poort 80 op de Docker-host is toegewezen aan poort 8080 op uw computer. De instantie youthful_heisenberg is de container voor de eerdere uitvoering van de installatiekopie. Het veld OPDRACHT bevat de opdracht die door de container is uitgevoerd om de toepassing in de installatiekopie te starten. In dit geval is het voor beide containers dotnet-aspnetapp.dll. De installatiekopieën-id voor de containers is ook hetzelfde omdat beide containers dezelfde installatiekopieën uitvoeren.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   42 seconds ago      Up 41 seconds       0.0.0.0:8080->80/tcp   elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   5 minutes ago      Up 5 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Notitie

docker container ls is een snelkoppeling voor docker ps. De namen van deze opdrachten zijn afkomstig van de Linux-hulpprogramma's ps en ls, waarmee respectievelijk processen en bestanden die worden uitgevoerd, worden weergegeven.

U kunt een actieve container stoppen met de docker stop opdracht en de container-id opgeven.

docker stop elegant_ramanujan

Als u docker ps opnieuw uitvoert, zult u zien dat de container elegant_ramanujan niet meer voorkomt in de uitvoer. De container bestaat nog steeds, maar het hosten van een actief proces niet meer. U kunt ervoor zorgen dat beëindigde containers worden opgenomen in de uitvoer van docker ps door de vlag -a op te nemen:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   2 minutes ago       Exited (0) 21 seconds ago                       elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   7 minutes ago      Up 7 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

U kunt een beëindigde container opnieuw starten met de opdracht docker start. Het belangrijkste proces van de container wordt opnieuw gestart.

docker start elegant_ramanujan

Wanneer een container is gestopt, moet u deze meestal ook verwijderen. Door een container te verwijderen worden alle resources opgeschoond die erdoor worden achtergelaten. Wanneer u een container verwijdert, gaan eventuele wijzigingen in het bestandssysteem van de installatiekopie permanent verloren.

docker rm elegant_ramanujan

U kunt een container die wordt uitgevoerd niet verwijderen, maar u kunt afdwingen dat een container wordt gestopt en verwijderd met de vlag -f aan de docker rm opdracht. Dit is een snelle manier om een container te stoppen en te verwijderen, maar moet alleen worden gebruikt als de app in de container geen probleemloos afsluiten hoeft uit te voeren.

docker container rm -f elegant_ramanujan

Docker-installatiekopieën verwijderen

U kunt een installatiekopie van de lokale computer verwijderen met de opdracht docker image rm. Geef de installatiekopie-id op van de installatiekopie die moet worden verwijderd. In het volgende voorbeeld wordt de afbeelding voor de voorbeeldweb-app verwijderd.

docker image rm mcr.microsoft.com/dotnet/core/samples:aspnetapp

Containers waarin de installatiekopie wordt uitgevoerd, moeten worden afgesloten voordat de installatiekopie kan worden verwijderd. Als de installatiekopieën nog steeds worden gebruikt door een container, krijgt u een foutbericht zoals de volgende afbeelding. In dit voorbeeld treedt de fout op omdat de youthful_heisenberg container nog steeds gebruikmaakt van de installatiekopieën.

Error response from daemon: conflict: unable to delete 575d85b4a69b (cannot be forced) - image is being used by running container c13165988cfe