Hoe maak je een Docker-afbeelding van een draaiende container

0
163

Docker-containers zijn over het algemeen kortstondige applicatie-instanties die geen interne status hebben. Dat is de beste manier om ermee om te gaan, zodat u uw containers op elk moment kunt stoppen of herstarten.

Soms zijn wijzigingen aan het bestandssysteem van een container echter onvermijdelijk. Misschien probeert u software uit en wilt u een momentopname om later op terug te komen. Een ander gebruiksscenario kan situaties zijn waarin de software in een container niet meer werkt en u een replica wilt opslaan die u in de toekomst kunt opsporen.

Hier leest u hoe u een nieuwe Docker-image maakt van een bestaande container. U kunt dan vanuit die afbeelding een andere container starten die wordt gevuld met het bestandssysteem van de eerste.

Containers vastleggen

De opdracht docker commit wordt gebruikt om een ​​container te nemen en er een nieuwe afbeelding van te maken. Het werkt met gestopte of actieve containers.

De basissyntaxis is als volgt:

docker commit example-container example-image:latest

Hiermee wordt een afbeelding gemaakt van de container met de naam voorbeeldcontainer. U kunt de container desgewenst ook op ID identificeren. Beide stukjes informatie zijn beschikbaar via de uitvoer van docker ps die alle containers op uw host vermeldt.

Advertentie

De resulterende afbeelding krijgt de tag toegewezen als de tweede parameter van de opdracht. Dit is voorbeeld-afbeelding:laatste in het bovenstaande voorbeeld. Net als bij een normale bewerking voor het taggen van afbeeldingen, vervangt de nieuwe afbeelding de referentie van de tag als deze al bestaat.

Nu kunt u uw afbeelding gebruiken om het bestandssysteem te herstellen van example-container naar een nieuwe containerinstantie:

docker run -d example-image:latest

De inhoud van het bestandssysteem komt overeen met de voorbeeldcontainercontainer op het moment dat het docker-commit-commando werd uitgevoerd. Er is één belangrijk voorbehoud: de inhoud van gekoppelde volumes zal niet worden opgenomen, dus hun aangekoppelde locaties zullen leeg zijn in de gemaakte containerafbeelding. Als u een nieuwe container met intacte volumegegevens wilt uitvoeren, gebruikt u de vlag -v om de volumes uit de eerste container opnieuw te koppelen wanneer u de tweede instantie start met docker-run.

Een ander opmerkelijk knelpunt is hoe Docker omgaat met het uitvoeren van containers. Voor het grootste deel zou dit naadloos moeten werken, maar standaard wordt de doelcontainer gepauzeerd voordat de vastlegging wordt gemaakt. Alle processen in de container worden onderbroken en vervolgens hervat nadat het maken van de afbeelding is voltooid. Dit verbetert de gegevensconsistentie in de nieuwe afbeelding, maar maakt de container tijdelijk ontoegankelijk. U kunt dit gedrag uitschakelen door –pause false op te nemen in uw docker-commit-commando.

Commit-berichten toevoegen

Het docker-commit-commando ondersteunt commit-berichten op een vergelijkbare manier als versiebeheersoftware zoals Git. Door een bericht toe te voegen wanneer je een afbeelding van een container maakt, kun je documenteren wat er is veranderd en de reden achter je vastlegging.

Gebruik de –message of -m vlag om een ​​vastleggingsbericht toe te passen:< /p>docker commit -m “Example commit” example-container example-image:latest Advertisement

Je kunt ook auteurschapsinformatie toevoegen met een speciale vlag. Geef een string op in de algemene voornaam <email@example.com> formaat naar de –author of -a vlag. Het zal naast het commit-bericht worden opgeslagen.

docker commit -a “Example Author <example@example.com>” -m “Voorbeeld commit” voorbeeld-container voorbeeld-afbeelding:laatste

Commit-berichten worden weergegeven wanneer u de opdracht Docker-geschiedenis gebruikt om de lagen in een afbeelding te bekijken. Ze verschijnen in de COMMENT-kolom helemaal rechts.

Een andere manier om toegang te krijgen tot deze informatie is om docker inspect samen met grep te gebruiken om auteurschaps- en commentaarwaarden te extraheren uit de JSON-representatie van een afbeelding:

docker inspect <image-id> | grep 'Gemaakt|Auteur|Commentaar'

Hiermee worden de gegevens weergegeven die zijn gekoppeld aan de bovenste laag in de afbeelding.

Het wijzigen van Dockerfile-instructies

Als u een afbeelding vastlegt, krijgt u een kans om enkele van zijn Dockerfile-instructies te muteren. U kunt de volgende waarden in uw nieuwe afbeelding overschrijven:

  • CMD
  • ENTRYPOINT
  • ENV
  • EXPOSE
  • LABEL
  • ONBUILD
  • USER
  • VOLUME
  • WORKDIR

Gebruik de vlag –change of -c om een ​​instructie in te stellen:

docker commit –change 'ENTRYPOINT [“sh”]' example-container example-image:latest Advertisement

Je kunt herhalen de vlag zo vaak als nodig is om al uw beoogde wijzigingen toe te passen.

Alleen instructies die van invloed zijn op de bovenste bestandssysteemlaag worden ondersteund. U kunt een vastgelegde afbeelding niet naadloos uitbreiden met nieuwe lagen via instructies zoals RUN en COPY. Je zou echter het resultaat van een commit kunnen nemen en een nieuw Docker-bestand kunnen schrijven dat indien nodig nieuwe inhoud toevoegt:

# Gemaakt via `docker commit` FROM example-image:latest RUN apt install example-package

Als je dat doet Dockerfile-instructies tijdens het commit wijzigen, is het de moeite waard om een ​​commit-bericht toe te voegen dat uitlegt wat je aan het wijzigen bent en waarom. Dit zal iedereen met toegang tot de afbeelding helpen om eventuele gedragsverschillen te begrijpen in vergelijking met de container waaruit deze is gemaakt.

Samenvatting

Docker-images worden meestal opgebouwd uit Dockerfiles en gebruikt om wegwerpcontainers te starten. Wijzigingen in de status van het bestandssysteem van een container worden aangebracht door de afbeelding opnieuw op te bouwen, de bestaande container te vernietigen en een nieuwe te starten. In een ideale wereld hebben containers geen interne status, maar dit is in de praktijk niet altijd het geval.

Door een container te committen krijg je een manier om het huidige bestandssysteem in de toekomst te herstellen. Commits zijn handig voor het maken van replica's van lastige containers, zodat u fouten kunt opsporen in een aparte omgeving terwijl u toegang behoudt tot eerder gegenereerde logs en tijdelijke bestanden.

Hoewel container-commits vaak lijken op VM-snapshots, zijn ze " t helemaal hetzelfde. VM's besturen virtuele hardware en de status van die hardware zal aanwezig zijn in de momentopname. Docker-containers zijn slechts een reeks processen die op de host worden uitgevoerd; een commit is een nieuwe Docker-image die het bestandssysteem van de container vertegenwoordigt, maar die noodzakelijkerwijs geen gegevens bevat over de status van processen, de kernel en je hardware.