Een volume toevoegen aan een bestaande Docker-container

Hoewel Docker een handig hulpmiddel is voor het verpakken en beheren van applicaties, biedt het ook veel unieke uitdagingen, zoals het omgaan met opgeslagen gegevens. Meestal voegt u volumes toe aan containers in het aanmaakscript, maar wat als u nieuwe moet maken?

Een volume toevoegen aan een actieve Docker-container

Helaas is het niet zo eenvoudig als het toevoegen van een nieuw volume. Voor containers moeten hun volumes zijn geconfigureerd bij het opstarten, wat betekent dat u de container opnieuw moet starten om een ​​nieuw volume toe te voegen. Hoewel er een hack-oplossing is (meer info hieronder), wordt het toch ten zeerste aanbevolen om de container opnieuw op te starten.

Dit is om verschillende redenen. Het herstarten van de container is vrij eenvoudig en de meeste code-updates vereisen sowieso een herstart van de service. Een andere belangrijke overweging is het bijhouden van updates in Git, vooral als je Docker Compose gebruikt, en het aanpassen van het opstartscript is veel beter dan het handmatig toevoegen van het volume aan een draaiende container.

Als uw service groot genoeg is dat u zich zorgen maakt over enkele minuten (maximaal) geplande downtime om de container opnieuw te starten, moet u waarschijnlijk een schaalbare implementatie uitvoeren met meerdere instanties die onafhankelijk kunnen worden bijgewerkt. Moderne systemen voor automatisch schalen moeten hiervoor worden ontworpen, aangezien code-implementaties vaak voorkomen.

Als u een volume wilt toevoegen, moet u de actieve container stoppen:

 docker stop my_container

Maak een nieuw volume aan als u:

docker volume create nginx-config

En voer het vervolgens uit met een bijgewerkt startcommando, waarbij de vlag –mount wordt toegevoegd om het bronvolume en de doelbestemming te configureren.

docker run -d --name devtest --mount source = nginx-config, target = / etc / nginx nginx: latest

Als u Docker Compose gebruikt, kunt u dit proces gemakkelijker automatiseren en volgen, aangezien de volumeconfiguratie wordt afgehandeld via een instellingenbestand. u moet volume toevoegen aan de aanbetaling van docker-compose.yml:

version: "3.0" services: web: image: nginx: latest ports: - "80:80" volumes: - / docker / nginx-config /: / etc / nginx /

Vervolgens kunt u de Docker Compose-services opnieuw starten. Compose heeft een “restart”-opdracht, maar het vernieuwt eigenlijk alleen de actieve service zonder enige configuratiewijzigingen. Als u de afbeeldingen wilt bijwerken, moet u docker-compose uitvoeren met de vlag –build:

docker-compose up -d --build

U kunt docker-compose vooraf ook handmatig uitvoeren om de services te stoppen, maar dit is in de meeste gevallen niet nodig, tenzij u het wilt uitvoeren met de vlag -v om bestaande volumes te vernietigen.

VERWANT: Wat is Docker Compose en hoe gebruik je het?

Klonen vanuit een bestaande container

In bijna alle gevallen moet u niet afhankelijk zijn van de huidige status van een container. Alles wat u interesseert, zoals toepassingsgegevens, moet op een volume worden opgeslagen, zodat het kan worden bewaard tijdens het opnieuw opstarten en opnieuw opbouwen van de container.

Deze methode is waarschijnlijk geen goed idee voor de meeste mensen, omdat je elke keer dat je dit wilt doen een nieuwe afbeelding moet maken en er nog steeds downtime voor nodig is. Maar als u volume aan een actieve container moet toevoegen, kunt u docker-commit gebruiken om een ​​nieuwe afbeelding te maken op basis van deze container en deze vervolgens te klonen met het nieuwe volume.

Haal de container-ID op van docker ps:

ps docker

En kloon het dan met commit:

docker commit f88f33c918d2 imagename

Vervolgens kunt u de nieuwe afbeelding uitvoeren en de oude afbeelding vervangen door de gekloonde.

docker run -d --name devtest --mount source = nginx-config, target = / etc / nginx imagename

De hackoplossing

Docker-volumes zijn eigenlijk gewoon een truc die de Docker-runtime gebruikt om hostmappen bloot te stellen aan containers, en het hangt allemaal af van de configuratie. Om deze reden kunt u deze configuratie rechtstreeks wijzigen en de hele Docker-daemon opnieuw opstarten, zodat uw systeem deze wijzigingen toepast zonder helemaal opnieuw op te starten.

Het is natuurlijk een stuk ingewikkelder dan alleen het opnieuw opstarten van een container, dus als je een minuut downtime aankunt, raden we je ten zeerste aan dat te doen.

U moet naar de Docker-opslagmap navigeren:

cd / var / lib / docker / containers

Er zullen hier veel mappen zijn die overeenkomen met Docker-container-ID’s, die u kunt vinden met docker ps. Open de container die u wilt wijzigen.

Het configuratiebestand is config.v2.json, maar het heeft een compact en moeilijk te bewerken formaat. Je kunt jq installeren om JSON netjes af te drukken op de opdrachtregel en het omleiden naar een nieuw bestand om te bewerken:

jq. config.v2.json> tmp.json

U moet naar beneden scrollen om “MountPoints” te vinden, die de configuratie van alle volumes en koppelingskoppelingen bevat. U kunt hier een nieuwe toevoegen, die in het volgende formaat moet zijn:

  "MountPoints": {"/ home / container": {"Source": "/ var / lib / pterodactyl / volumes / c7fb3a04-e540-48a7-9704-13987f52e933", "Destination": "/ home / container", " RW ": true," Name ":" "," Driver ":" "," Type ":" bind "," Propagation ":" rprivate "," Spec ": {" Type ":" bind "," Source ":" / var / lib / pterodactyl / volumes / c7fb3a04-e540-48a7-9704-13987f52e933 "," Target ":" / home / container "}," SkipMountpointCreation ": true}},

Als het klaar is, kun je de JSON opnieuw samenvouwen in het configuratiebestand:

jq -c. tmp.json> config.v2.json

jq is een krachtig hulpprogramma, dus als je dit proces volledig wilt automatiseren, dan kan dat.

VERWANT: Hoe te werken met JSON op de opdrachtregel

Start vervolgens de Docker-service opnieuw om de wijzigingen toe te passen:

sudo service docker restart
0 Shares:
You May Also Like