Terug naar blog

Data delen tussen Docker-containers

Data delen tussen Docker-containers

Introductie

Docker is een containerplatform dat een lichtgewicht, gevirtualiseerde, draagbare, softwaregedefinieerde gestandaardiseerde omgeving is waarmee de software geïsoleerd kan draaien van andere software die op de fysieke hostmachine draait. Docker is een bepalend onderdeel van het Continuous Development and Integration-aspect van softwareontwikkeling. Door een consistente runtime-omgeving te bieden, zorgt Docker ervoor dat software zich hetzelfde gedraagt, ongeacht de fysieke hostmachine waarop deze is geïmplementeerd. Voor een grondig overzicht van het Docker-ecosysteem, bekijk dit artikel.

Hoewel Docker-containers op zichzelf staan, moeten ze soms toegang tot gegevens delen of gegevens op schijf bewaren nadat de container is gestopt. Gegevens kunnen de vorm hebben van databases, logbestanden of door gebruikers gegenereerde gegevens. Dergelijke gegevens kunnen onmogelijk worden opgenomen in een configuratiebestand van een Docker-image, maar ze moeten wel beschikbaar zijn om uw applicatie naar verwachting te laten werken. Het delen en behouden van gegevens in Docker-containers wordt afgehandeld door Docker Volumes. Docker Volumes kunnen worden gemaakt tijdens het maken van de container of later worden gemaakt en aan containers worden gekoppeld. In deze tutorial bespreken we de vier verschillende manieren om gegevens te delen tussen containers.

Vereisten

Houd er rekening mee dat, hoewel we met Ubuntu 20.04 werken, de instructies en commando's voor Docker zullen werken op elk ander besturingssysteem waarop Docker is geïnstalleerd en de sudo-gebruiker is toegevoegd aan de docker-groep, zoals uitgelegd in de vereisten hierboven.

Stap 1: Onafhankelijke Docker-volumes maken

We beginnen met het maken van onafhankelijke volumes die niet gerelateerd zijn aan een Docker-container. Om dit te bereiken, hebben we het commando docker volume create dat werd geïntroduceerd in Docker-versie 1.9. Voer het volgende commando in om een volume te maken met de naam Step1DataVolume :

Je zou de volgende uitvoer moeten zien die aangeeft dat het aanmaken van het volume succesvol was:

Docker Volume Create

Nu we een onafhankelijk volume hebben, kunnen we als voorbeeld een nieuwe container maken van de officiële Ubuntu-image om er gebruik van te maken. Voer de volgende opdracht uit om de container te maken en het volume te koppelen:

In dit commando zal de --rm vlag de container automatisch verwijderen na het afsluiten. De -v vlag wordt gebruikt om het volume te specificeren en te koppelen. De -v vlag verwacht de naam van het volume, een dubbele punt, en het absolute pad binnen de container waar het volume moet verschijnen. Houd er rekening mee dat wanneer de opdracht wordt uitgevoerd, de opgegeven mappen in het pad worden gemaakt als ze nog niet bestaan. Als ze al bestaan, zal het gekoppelde volume de bestaande inhoud verbergen. Voor de -ti-vlag, geeft de -t toegang tot de terminal, en de -i stelt ons in staat om via de terminal met de container te communiceren.

Voer, terwijl je in de container bent, de volgende opdracht uit om gegevens naar het volume te schrijven:

Typ exit en druk op enter om de container te verlaten. Zoals uitgelegd wordt de container automatisch verwijderd wanneer u deze verlaat, dankzij de --rm-vlag, maar het volume zal nog steeds toegankelijk zijn.

Om te controleren of het volume nog bestaat, kunt u het docker volume inspect commando gebruiken:

U zou de volgende uitvoer moeten zien:

Docker Volume Inspect

Vervolgens gaan we een nieuwe container maken. Koppel eerst het volume en kijk of we toegang hebben tot de tekst die we in de vorige container hebben gemaakt. Voer de volgende opdracht in om de container te maken en uit te voeren met behulp van de ubuntu image:

Voer in de container de volgende opdracht uit om te controleren of het StepOne.txt bestand bestaat:

Je zou een vergelijkbare uitvoer moeten zien:

Docker Volume Content 1

Typ vervolgens exit en druk op enter om de container te verlaten. In deze stap hebt u geleerd hoe u omgaat met gegevenspersistentie met behulp van onafhankelijke Docker-volumes en hoe u volumes aan containers koppelt.

Stap 2: Een Docker-volume maken dat gegevens behoudt wanneer u een container verwijdert

In deze stap gebruiken we een enkele opdracht om tegelijkertijd met het maken van een container een volume te maken. Vervolgens verwijderen we de container en koppelen we het volume aan een nieuwe container. De opdracht is vergelijkbaar met die in Stap 1, we voegen echter één flag toe --name, om een naam voor de container op te geven:

Voer in de container de volgende opdracht uit om gegevens naar het volume te schrijven en te controleren of de gegevens er zijn:

Hieronder staat de uitvoer van de drie opdrachten:

Persistent Docker Volume

Verlaat vervolgens de container. Wanneer u de container opnieuw opstart met de volgende opdracht, wordt het volume automatisch gekoppeld:

Controleer in de container of het volume is gekoppeld door te controleren op het bestaan van het StepTwo.txt bestand met behulp van de opdracht:

Hier is de uitvoer:

Docker Volume After Restart

U kunt de container nu verlaten. Docker voorkomt het verwijderen van een volume waarnaar een andere container verwijst. U kunt proberen het volume te verwijderen met de opdracht:

Je zou de foutmelding in de uitvoer moeten zien:

Error Response

Laten we de container verwijderen met behulp van de container-id die in de uitvoer wordt getoond met de docker rm opdracht:

Vervang de gemarkeerde container id door de id van je container die in je terminal wordt getoond. De opdracht verwijdert de container, maar verwijdert niet het volume dat we hebben gemaakt. Je kunt de beschikbare volumes weergeven met de docker volume ls opdracht om te controleren:

Hier is de output:

Docker Volume List

Om de container te verwijderen die is gemaakt in Stap 2, voer je het volgende commando in:

In deze stap kon je een Docker-volume maken op hetzelfde moment dat je een container maakte. Laten we kijken hoe we een volume kunnen maken van een bestaande directory met data.

Stap 3: Een Docker-volume maken van een bestaande directory met data

Als je gegevens naar een volume wilt kopiëren, kun je een volume maken tijdens het maken van een container en het pad opgeven naar een map die de gegevens in de basis-image bevat. In de onderstaande opdracht maken we een container en voegen we een gegevensvolume toe op /var, wat een map is die gegevens bevat in de basis-image:

Wanneer de opdracht wordt uitgevoerd, zal de inhoud van de /var -map van de basis-image naar het volume worden gekopieerd. Het volume kan aan een nieuwe container worden gekoppeld. Verlaat vervolgens de container:

Create Docker Volume

Voer de volgende opdracht uit om de container te maken, het volume te koppelen en de inhoud van het volume weer te geven met behulp van de ls-opdracht:

U zou vergelijkbare uitvoer van de opdracht moeten zien, wat een kopie is van de inhoud van de /var-map van de basis-image die nu beschikbaar is in de Step3DataVolume:

Copy Docker Volume

Tijdens het koppelen van de /var directory zoals we in dit voorbeeld deden onpraktisch kan zijn, helpt het ons te begrijpen dat u elke directory die in uw aangepaste images is gemaakt kunt mounten aan een Docker-volume om de gegevens beschikbaar te maken voor andere containers.

Stap 4: Gegevens delen tussen meerdere Docker-containers

In de meeste gevallen wilt u dat meerdere containers toegang hebben tot gegevens van één Docker-volume. In de vorige voorbeelden hebben we een volume slechts aan één container gekoppeld. Nu leert u hoe u een volume aan meerdere containers koppelt. Hoewel u dit eenvoudig kunt bereiken, regelt Docker geen bestandsvergrendeling. Voor meerdere containers die naar hetzelfde volume schrijven, moet u de applicaties die in die containers draaien afzonderlijk ontwerpen om het schrijven naar gedeelde gegevensopslag te beheren om gegevenscorruptie te voorkomen.

  • Maak Step4Container1 en Step4DataVolume

Gebruik het docker run-commando met de --naam flag om een benoemde container te maken:

Voer in de container de volgende opdracht uit om een tekstbestand aan te maken en wat tekst toe te voegen:

Verlaat daarna de container en ga terug naar de hostomgeving. Nu willen we een andere container maken en de volumes koppelen van Step4Container1 daaraan.

  • Maak Step4Container2 en koppel de volumes van de container Step4Container1

Voer de volgende opdracht uit om te maken Step4Container2 en koppel volumes aan van Step4Container1:

Gebruik in de container de cat opdracht om de persistentie van gegevens te verifiëren:

U zou de volgende uitvoer moeten zien:

Container Data Sharing

We kunnen nog wat meer tekst aan het bestand toevoegen vanaf Step4Container2 door de volgende opdracht in te voeren:

Verlaat hierna de container en we gaan terug naar Step4Container1 om te controleren of de gegevens nog aanwezig zijn.

  • Verifieer de wijzigingen die in het Docker-volume zijn aangebracht tussen verschillende containers

Om de wijzigingen te bekijken, start je eerst de Step4Container1 met het commando:

Controleer op wijzigingen met het commando:

U zou een uitvoer moeten zien die lijkt op de onderstaande schermafbeelding:

Copied Container Data

Zodra u verifieert dat beide containers gegevens kunnen lezen en schrijven naar hetzelfde volume, kunt u de container nu verlaten. Zoals vermeld, regelt Docker geen bestandsvergrendeling; het is de taak van uw applicatielogica die binnen de containers draait om lees-schrijftoegang tot gedeelde gegevensopslag te beheren. Docker maakt het mogelijk om volumes als alleen-lezen te koppelen om onbedoelde gegevensbeschadiging te voorkomen door containers die alleen lees-toegang nodig hebben, door het toevoegen van :ro zoals getoond in het volgende voorbeeld.

  • Een volume als alleen-lezen koppelen aan een Docker-container

Voor dit voorbeeld maken we een container met de naam Step4Container3. In de create-opdracht koppelen we volumes van Step4Container1 en voegen we :ro toe om te specificeren dat deze container alleen-lezen toegang heeft maar niet naar het volume kan schrijven. Voer de volgende opdracht uit in je terminal:

Eenmaal in de container kun je het tekstbestand in het volume lezen door de volgende opdracht in te voeren:

Read Only Mount

Als je echter probeert het bestand te verwijderen met het commando:

Je krijgt een foutmelding in je terminal zoals:

Read Only Error

Zodra je de lees-schrijfrechten hebt geverifieerd, kun je de container verlaten. Als je de containers en het volume die in deze tutorial zijn gemaakt wilt opruimen, voer dan de volgende commando's uit:

In deze stap hebt u geleerd hoe u gegevens kunt delen tussen meerdere containers met behulp van Docker-volumes, en hoe u datavolumes als alleen-lezen aan containers kunt koppelen.

Conclusie

In deze tutorial hebt u enkele Docker-volumes gemaakt en geleerd hoe u gegevens kunt delen tussen Docker-containers. Bij het delen van gegevens tussen containers hebben we opgemerkt dat de individuele applicatielogica binnen de container bestandsvergrendeling moet afhandelen om gegevenscorruptie te voorkomen bij het schrijven naar gedeelde gegevensopslag, aangezien Docker geen implementatie heeft voor het afhandelen van bestandsvergrendeling.

Voor meer informatie over het gebruik van Docker kun je meer handleidingen bekijken op onze blog:

Veel computerplezier!

author

Pranay Kapgate

Auteur · CloudSigma

Preslav Dobrev is een creatief ontwerper bij CloudSigma, met de nadruk op een consistente bedrijfsidentiteit door middel van traditionele en innovatieve marketingkanalen. Hij is bedreven in het samenvoegen van artistieke visie met strategische marketing om impactvolle merkverhalen te creëren.

Reacties

Nog geen reacties. Wees de eerste.