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
- Zet een server op met Ubuntu 20.04 en Maak een non-root gebruiker aan met sudo-rechten. Log in met de non-root gebruiker om door te gaan met de volgende stappen.
- Installeer Docker - we hebben een tutorial over Hoe Docker te installeren en te gebruiken op Ubuntu, je moet stappen 1, 2, 3 en 4 volgen. Dit zou moeten werken voor elke Ubuntu-distributie.
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 :
|
1 |
docker volume maken --naam Step1DataVolume |
Je zou de volgende uitvoer moeten zien die aangeeft dat het aanmaken van het volume succesvol was:
![]()
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:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
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:
|
1 |
echo "Stap één voorbeeldtekst" > /Step1DataVolume/StepOne.txt |
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:
|
1 |
docker volume inspect Step1DataVolume |
U zou de volgende uitvoer moeten zien:

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:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
Voer in de container de volgende opdracht uit om te controleren of het StepOne.txt bestand bestaat:
|
1 |
cat /Step1DataVolume/StepOne.txt |
Je zou een vergelijkbare uitvoer moeten zien:

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:
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
Voer in de container de volgende opdracht uit om gegevens naar het volume te schrijven en te controleren of de gegevens er zijn:
|
1 2 3 |
echo "Voorbeeldtekst stap twee" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
Hieronder staat de uitvoer van de drie opdrachten:

Verlaat vervolgens de container. Wanneer u de container opnieuw opstart met de volgende opdracht, wordt het volume automatisch gekoppeld:
|
1 |
docker start -ai Step2Container1 |
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:
|
1 |
cat /Step2DataVolume/StepTwo.txt |
Hier is de uitvoer:

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:
|
1 |
docker volume rm Stap2DataVolume |
Je zou de foutmelding in de uitvoer moeten zien:
![]()
Laten we de container verwijderen met behulp van de container-id die in de uitvoer wordt getoond met de docker rm opdracht:
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
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:
|
1 |
docker volume ls |
Hier is de output:

Om de container te verwijderen die is gemaakt in Stap 2, voer je het volgende commando in:
|
1 |
docker volume rm Step2DataVolume |
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:
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
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:

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:
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
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:

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:
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
Voer in de container de volgende opdracht uit om een tekstbestand aan te maken en wat tekst toe te voegen:
|
1 |
echo "Stap vier voorbeeldtekst" > /Step4DataVolume/StepFour.txt |
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:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
Gebruik in de container de cat opdracht om de persistentie van gegevens te verifiëren:
|
1 |
cat /Step4DataVolume/StepFour.txt |
U zou de volgende uitvoer moeten zien:

We kunnen nog wat meer tekst aan het bestand toevoegen vanaf Step4Container2 door de volgende opdracht in te voeren:
|
1 |
echo "We voegen tekst toe terwijl we in Step4Container2 zijn" >> /Step4DataVolume/StepFour.txt |
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:
|
1 |
docker start -ai Step4Container1 |
Controleer op wijzigingen met het commando:
|
1 |
cat /Stap4DataVolume/StapVier.txt |
U zou een uitvoer moeten zien die lijkt op de onderstaande schermafbeelding:

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:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
Eenmaal in de container kun je het tekstbestand in het volume lezen door de volgende opdracht in te voeren:
|
1 |
cat /Step4DataVolume/StepFour.txt |

Als je echter probeert het bestand te verwijderen met het commando:
|
1 |
rm /Step4DataVolume/StepFour.txt |
Je krijgt een foutmelding in je terminal zoals:
![]()
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:
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Stap4DataVolume |
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:
- Hoe je gegevens deelt tussen een Docker-container en een host
- Docker-bronnen opschonen – Images, containers en volumes
- Laravel, Nginx en MySQL implementeren met Docker Compose
- Docker installeren en configureren op CentOS 7
Veel computerplezier!
Reacties
Nog geen reacties. Wees de eerste.