Hoe Docker-containers werken

Voltooid

Eerder hebt u ontdekt dat de container de eenheid wordt die u gaat gebruiken om uw apps te distribueren. U hebt ook geleerd dat de container een gestandaardiseerde indeling heeft, zowel uw ontwikkelaars- als operationele teams gebruiken.

In uw voorbeeld ontwikkelt u een portal voor het bijhouden van bestellingen voor de verschillende kanalen van uw bedrijf die u kunt gebruiken. Nu de Docker-installatiekopie is gebouwd, is uw operations-team nu verantwoordelijk voor het implementeren, implementeren van updates en het beheren van uw portal voor het bijhouden van bestellingen.

In de vorige les hebt u gekeken hoe een Docker-installatiekopie wordt gebouwd. Nu gaat u een blik werpen op de levenscyclus van een Docker-container en hoe containers worden beheerd. U leert ook hoe u nadenkt over het configureren van gegevensopslag en de netwerkopties voor uw containers.

Docker-containers beheren

Een Docker-container heeft een levenscyclus die u kunt gebruiken om de status van de container te beheren en bij te houden.

Diagram met de levenscyclus van een container en de overgang tussen de fasen van de levenscyclus.

Als u een container in de uitvoeringsstatus wilt plaatsen, gebruikt u de opdracht Uitvoeren . U kunt ook een container die al wordt uitgevoerd, opnieuw opstarten. Bij het opnieuw opstarten van een container ontvangt de container een beëindigingssignaal om actieve processen correct af te sluiten voordat de kernel van de container wordt beëindigd.

Een container wordt beschouwd als een actieve container totdat deze wordt onderbroken, gestopt of beëindigd. Een container kan echter ook zelf de actieve status verlaten. Een container kan zichzelf afsluiten wanneer het actieve proces wordt voltooid of als het proces een foutstatus krijgt.

Gebruik de pause opdracht om een actieve container te onderbreken. Met deze opdracht worden alle processen in de container onderbroken.

Gebruik de stop opdracht om een actieve container te stoppen. Met de stop opdracht kan het werkproces probleemloos worden afgesloten door het een beëindigingssignaal te verzenden. De kernel van de container wordt beëindigd nadat het proces is afgesloten.

Als u de container wilt beëindigen, gebruikt u de kill opdracht om een kill-signaal te verzenden. De kernel van de container legt het kill-signaal vast, maar het actieve proces niet. Met deze opdracht wordt het werkproces in de container geforceerd beëindigd.

Als u ten slotte containers wilt verwijderen die een gestopte status hebben, gebruikt u de remove opdracht. Zodra een container is verwijderd, worden alle gegevens vernietigd die zijn opgeslagen in de container.

Beschikbare containers weergeven

Voer de opdracht docker ps uit om een lijst met actieve containers weer te geven. Als u alle containers met alle statussen wilt weergeven, voert u de opdracht -a in.

Hier volgt een voorbeeld:

docker ps -a

Dit is de uitvoer van die opdracht:

CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS           PORTS        NAMES
d93d40cc1ce9    tmp-ubuntu:latest  "dotnet website.dll …"  6 seconds ago    Up 5 seconds        8080/tcp      happy_wilbur
33a6cf71f7c1    tmp-ubuntu:latest  "dotnet website.dll …"  2 hours ago     Exited (0) 9 seconds ago            adoring_borg

Er zijn drie items die in de voorgaande uitvoer moeten worden bekeken:

  • De naam van de installatiekopie die wordt vermeld in de kolom IMAGE . In dit voorbeeld is tmp-ubuntu: latest. Zoals u ziet kunt u meer dan één container maken op basis van dezelfde installatiekopie. Dit is een krachtige beheerfunctie die u kunt gebruiken om schalen in uw oplossingen mogelijk te maken.

  • De containerstatus die wordt vermeld in de kolom STATUS . In dit voorbeeld hebt u één container die wordt uitgevoerd en één container die is afgesloten. De status van de container is meestal de eerste indicator van de status van de container.

  • De containernaam die wordt vermeld in de kolom NAMES . Naast de container-id in de eerste kolom ontvangen containers ook een naam. In dit voorbeeld hebt u niet expliciet elke container een naam gegeven, en als gevolg hiervan heeft Docker de container een willekeurige naam gegeven. Als u een container een expliciete naam wilt geven met behulp van de --name vlag, gebruikt u de run opdracht.

Waarom krijgen containers een naam?

Met deze functie kunt u meerdere containerinstanties van dezelfde installatiekopieën uitvoeren. Containernamen zijn uniek. Als u een naam opgeeft, kunt u die naam niet opnieuw gebruiken om een nieuwe container te maken. De enige manier om een specifieke naam opnieuw te gebruiken, is door de vorige container te verwijderen.

Een container uitvoeren

Gebruik de docker run opdracht om een container te starten. U hoeft alleen de naam of id van de installatiekopie op te geven die moet worden uitgevoerd om de container vanaf de installatiekopie te starten. Een container die op deze manier wordt gestart, biedt een interactieve ervaring.

Voeg de vlag -d toe om de container met onze website op de achtergrond uit te voeren.

docker run -d tmp-ubuntu

Met de opdracht wordt in dit geval alleen de id van de nieuwe container geretourneerd.

Nadat u een installatiekopieën hebt opgegeven die moet worden uitgevoerd, zoekt Docker de installatiekopieën, laadt de container uit de installatiekopieën en voert u de opdracht uit die is opgegeven als het toegangspunt. Vanaf dat moment is de container beschikbaar voor beheer.

Een container onderbreken

Voer de opdracht docker pause uit om een container te onderbreken. Hier volgt een voorbeeld:

docker pause happy_wilbur

Als u een container onderbreekt, worden alle processen onderbroken. Met deze opdracht is het mogelijk om de container processen in een later stadium te laten voortzetten. De docker unpause opdracht verwijdert alle processen in de opgegeven containers.

Een container opnieuw starten

Voer de opdracht docker restart uit om containers opnieuw op te starten. Hier volgt een voorbeeld:

docker restart happy_wilbur

De container ontvangt een stopopdracht gevolgd door een startopdracht. Als de container niet reageert op de stopopdracht, wordt een Kill-signaal verzonden.

Een container stoppen

Voer de opdracht docker stop uit om een container te stoppen. Hier volgt een voorbeeld:

docker stop happy_wilbur

De stopopdracht verzendt een beëindigingssignaal naar de container en de processen die in de container worden uitgevoerd.

Een container verwijderen

Voer de opdracht docker rm uit om een container te verwijderen. Hier volgt een voorbeeld:

docker rm happy_wilbur

Alle gegevens in de container worden vernietigd zodra u de container verwijdert. Het is van essentieel belang dat containers altijd als tijdelijk worden beschouwd wanneer u overweegt ze voor het opslaan van gegevens te gaan gebruiken.

Opslagconfiguratie voor Docker-container

Zoals we eerder hebben beschreven, moet u containers altijd beschouwen als tijdelijk wanneer de app in een container gegevens moet opslaan.

Stel dat uw trackingportal een logboekbestand maakt in een submap naar de hoofdmap van de app; dat wil gezegd, rechtstreeks naar het containerbestandssysteem. Wanneer de app gegevens naar het logboekbestand schrijft, schrijft het systeem de gegevens naar de beschrijfbare laag van de container.

Hoewel deze aanpak werkt, heeft het helaas verschillende nadelen.

  • Containeropslag is tijdelijk.

    Het logboekbestand blijft niet behouden tussen containerinstanties. Laten u bijvoorbeeld aannemen dat de container wordt gestopt en verwijderd. Wanneer u een nieuwe containerinstantie start, wordt het nieuwe exemplaar gebaseerd op de opgegeven installatiekopieën en ontbreken al uw eerdere gegevens. Vergeet niet dat alle gegevens in een container worden vernietigd als u de container verwijdert.

  • Containeropslag is gekoppeld aan de onderliggende hostcomputer.

    Het is moeilijk om het logboekbestand vanuit de container te openen of te verplaatsen, omdat de container is gekoppeld aan de onderliggende hostcomputer. U moet verbinding maken met het containerexemplaren om toegang te krijgen tot het bestand.

  • Containeropslagstations werken minder goed.

    Containers implementeren een opslagstuurprogramma zodat onze apps gegevens kunnen schrijven. Dit stuurprogramma introduceert een extra abstractie om te communiceren met de kernel van het host-besturingssysteem en is minder goed dan rechtstreeks naar een hostbestandssysteem schrijven.

Containers kunnen gebruikmaken van twee mogelijkheden voor het behouden van gegevens. De eerste mogelijkheid is om volumes te gebruiken en de tweede is om bindingskoppelingen te gebruiken.

Wat is een volume?

Een volume wordt op een specifieke maplocatie in het bestandssysteem van de host bewaard. Kies een map waarin u weet dat de gegevens niet worden gewijzigd door niet-Docker-processen.

Docker maakt en beheert het nieuwe volume met behulp van de opdracht docker volume create. Deze opdracht kan deel uitmaken van onze Dockerfile-definitie, wat betekent dat u volumes kunt maken als onderdeel van het proces voor het maken van containers. Docker maakt het volume als het niet bestaat wanneer u het volume de eerste keer probeert te koppelen aan een container.

Volumes worden opgeslagen in mappen op het hostbestandssysteem. Docker koppelt en beheert de volumes in de container. Nadat deze volumes zijn gekoppeld, worden ze geïsoleerd van de hostmachine.

Meerdere containers kunnen gelijktijdig van dezelfde volumes gebruikmaken. Volumes worden ook niet automatisch verwijderd wanneer een container geen gebruik meer maakt van het volume.

In dit voorbeeld kunt u een map maken op de containerhost en dit volume koppelen aan de container wanneer u de container tracking-portal maakt. Als er door uw portal voor het volgen van bestellingen gegevens worden geregistreerd, hebt u toegang tot deze gegevens via het bestandssysteem van de containerhost. U hebt toegang tot dit logboekbestand, zelfs als de container wordt verwijderd.

Docker biedt ook een manier voor externe bedrijven om invoegtoepassingen te bouwen die als volumes moeten worden gebruikt. Azure Storage biedt bijvoorbeeld een invoegtoepassing voor het koppelen van Azure Storage als volumes in Docker-containers.

Wat is een bindingskoppeling?

Een bindingskoppeling is conceptueel hetzelfde als een volume; In plaats van een specifieke map te gebruiken, kunt u echter elk bestand of elke map op de host koppelen. U verwacht ook dat de host de inhoud van deze koppelingen kan wijzigen. Net als bij volumes wordt de bindingskoppeling gemaakt als u deze koppelt en deze nog niet bestaat op de host.

Bindingskoppelingen hebben een beperkte functionaliteit vergeleken met volumes, en hoewel ze krachtiger zijn, zijn ze afhankelijk van een host met een specifieke mapstructuur.

Volumes worden beschouwd als de voorkeursstrategie voor gegevensopslag voor gebruik met containers.

Voor Windows-containers is een andere optie beschikbaar: u kunt een SMB-pad als volume koppelen en aan containers presenteren. Hierdoor kunnen containers op verschillende hosts dezelfde permanente opslag gebruiken.

Netwerkconfiguratie voor Docker-container

Met de standaardconfiguratie van het Docker-netwerk kunnen containers op de Docker-host worden geïsoleerd. Met deze functie kunt u apps bouwen en configureren die veilig met elkaar kunnen communiceren.

Docker biedt verschillende netwerkinstellingen voor Linux en Windows.

Voor Linux zijn er zes vooraf geconfigureerde netwerkopties:

  • Brug
  • Host
  • Overlay
  • IPvLan
  • MACvLan
  • Geen

Voor Windows zijn er zes vooraf geconfigureerde netwerkopties:

  • NAT (Network Address Translation)
  • Transparant
  • Overlay
  • L2Bridge
  • L2Tunnel
  • Geen

U kunt kiezen welke van deze netwerkconfiguraties u wilt toepassen op uw container, afhankelijk van de netwerkvereisten.

Wat is het brugnetwerk?

Het brugnetwerk is de standaardconfiguratie die wordt toegepast op containers wanneer het wordt gestart zonder een andere netwerkconfiguratie op te geven. Dit netwerk is een intern privénetwerk dat wordt gebruikt door de container en het isoleert het containernetwerk van het Docker-hostnetwerk.

Aan elke container in het brugnetwerk wordt een IP-adres en subnetmasker toegewezen, waarbij de hostnaam standaard wordt ingesteld op de containernaam. Containers die zijn verbonden met het standaardbrugnetwerk, hebben toegang tot andere containers die zijn verbonden met een brug via IP-adres. Het brugnetwerk staat geen communicatie toe tussen containers met behulp van hostnamen.

Standaard worden er door Docker geen containerpoorten gepubliceerd. Gebruik de vlag --publish voor de Docker-poort om het toewijzen van poorten tussen de containerpoorten en de Docker-hostpoorten in te schakelen.

Met de publicatievlag wordt effectief een firewallregel geconfigureerd waarmee de poorten worden toegewezen.

In dit voorbeeld is de portal voor het volgen van bestellingen toegankelijk voor clients die naar poort 80 bladeren. U moet poort 80 van de container toewijzen aan een beschikbare poort op de host. U hebt poort 8080 geopend op de host, zodat u de vlag als volgt kunt instellen:

--publish 8080:80

Elke client die naar het IP-adres van de Docker-host en poort 8080 bladert, heeft toegang tot de portal voor het volgen van bestellingen.

Afgezien van Linux-specifieke configuraties, werkt het NAT-netwerk op Windows-hosts hetzelfde als een brugnetwerk. Nat is ook het standaardnetwerk in Windows en alle containers maken er verbinding mee, tenzij anders is opgegeven.

Wat is het hostnetwerk?

Via het hostnetwerk kunt u de container rechtstreeks op het hostnetwerk uitvoeren. Met behulp van deze configuratie wordt de isolatie tussen de host en de container op netwerkniveau effectief verwijderd.

In dit voorbeeld gaan we ervan uit dat u de netwerkconfiguratie wilt wijzigen in de hostnetwerkoptie. Uw portal voor het volgen van bestellingen is nog steeds toegankelijk via het IP-adres van de host. U kunt nu de bekende poort 80 gebruiken in plaats van een toegewezen poort.

Houd er rekening mee dat de container alleen poorten kan gebruiken die de host nog niet gebruikt.

In Windows is het hostnetwerk niet beschikbaar. Op Windows-hosts is er geen optie om hetzelfde IP-adres (netwerkstack) te delen tussen de host en de container. Het NAT-netwerk werkt net als een brugnetwerk en de optie Overlay biedt een IP-adres aan de container van hetzelfde netwerk als de host, maar niet hetzelfde IP-adres.

Overlay en andere netwerkopties

Voor geavanceerdere scenario's bieden Linux en Windows extra netwerkopties. Met de overlayoptie maakt u bijvoorbeeld een virtuele switch van het hostnetwerk, zodat containers op dat netwerk IP-adressen van DHCP-servers kunnen ophalen of met IP-adressen uit dat netwerksegment kunnen werken. Bovendien kunnen externe leveranciers met Docker netwerkinvoegtoepassingen maken.

Wat is het geen-netwerk?

Als u netwerken voor containers wilt uitschakelen, gebruikt u de optie geen netwerk. Dit kan handig zijn als u een toepassing hebt die niet gebruikmaakt van het netwerk of als u alleen wilt valideren dat een toepassing wordt uitgevoerd zoals verwacht in een container.

Overwegingen bij het besturingssysteem

Houd er rekening mee dat er verschillen zijn tussen desktopbesturingssystemen voor de docker-netwerkconfiguratieopties. De Docker0-netwerkinterface is bijvoorbeeld niet beschikbaar in macOS wanneer u het brugnetwerk gebruikt en de configuratie van het hostnetwerk wordt niet ondersteund voor zowel Windows- als macOS-desktops.

Deze verschillen kunnen van invloed zijn op de manier waarop uw ontwikkelaars hun werkstroom configureren om zo de ontwikkeling van containers te beheren. Daarnaast kunnen containerorchestrators ook andere netwerkconfiguraties bieden boven op de Docker-installatie.

Kennis testen

1.

Er wordt een container gestart met de vlag --publish 8080:80. Welke van de volgende opties is de meest waarschijnlijke netwerkconfiguratie die wordt gebruikt voor de container?

2.

Welke opslagoptie is de beste keuze waarmee de host en container een bestand kunnen delen voor het beheren van naamserveromzetting; Bijvoorbeeld het bestand resolve.conf in Linux?