Docker is softwarecontainerisatietechnologie die developers helpt bij het maken en inzetten van applicaties op verschillende platforms, van de desktop tot de cloud.

Een momentopname – of blauwdruk – van de broncode, dependencies en tools die nodig zijn om een applicatie in een Docker container te bouwen wordt een image genoemd. Docker applicaties die persistente gegevens nodig hebben kunnen vertrouwen op opslag, volumes genaamd, die onafhankelijk zijn van het onderliggende besturingssysteem.

Effectieve organisatie van images, volumes en containers is belangrijk bij het gebruik van Docker. Ongebruikte incarnaties van deze assets kunnen zich ophopen, waardoor ze kostbare schijfruimte in beslag nemen en uiteindelijk de systeemprestaties aantasten.

Dit artikel onderzoekt verschillende manieren om de systeemorganisatie te handhaven door images (zowel afzonderlijk als allemaal tegelijk), volumes en containers op te ruimen. En we gebruiken de docker commandoregelinterface (CLI) om deze taken snel uit te voeren.

Zo verwijder je Docker images

Het verwijderen van verouderde of onnodige images uit Docker is essentieel om een schoon en georganiseerd systeem te behouden. Laten we kijken hoe je met de CLI bepaalde images kan verwijderen.

Laten we eerst eens kijken naar de images in een Docker omgeving met het commando docker image ls:

$ docker image ls
REPOSITORY       TAG       IMAGE ID       CREATED              SIZE
my_image         latest    2cbc27836df4   60 seconds ago       7.05MB
<none>           <none>    85b412789704   2 days ago           7.05MB
demo             latest    26d80cd96d69   15 months ago        28.5MB

De bovenstaande lijst met images laat images zien met de namen my_image en demo, beide getagd latest. Een derde image heeft geen naam of tag. In dit geval is het een “bungelende” (Engels: dangling) image: eentje die momenteel niet door een container wordt gebruikt. Deze bungelende image is het resultaat van een herbouw van my_image (een veel voorkomend scenario). De vorige versie van de image staat nog op het bestandssysteem, maar is nu niet in gebruik.

De lijst toont ook de eerste 12 tekens van de 64-karakter ID van elke image, de aanmaakdata en de opslagruimte die de images innemen.

Alle ongebruikte images verwijderen

In het bovenstaande voorbeeld hebben we een bungelende image. Het is echter mogelijk dat een image zonder naam of tag actief is. Het kan bijvoorbeeld gebruikt zijn om een container te starten door naar zijn ID te verwijzen.

Om alle images die daadwerkelijk bungelen veilig te verwijderen, kun je het commando docker image prune gebruiken:

$ docker image prune

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y

Deleted Images:
deleted: sha256:85b412789704c17e9c5e7edc97b2f64c748bbdae7eaa44d3fe2cc21a87acad3d

Total reclaimed space: 7.05MB

We zetten onze images nog eens op een rijtje om het resultaat van ons werk te zien:

$ docker image ls
REPOSITORY       TAG       IMAGE ID       CREATED              SIZE
my_image         latest    2cbc27836df4   70 seconds ago       7.05MB
demo             latest    26d80cd96d69   15 months ago        28.5MB

Na pruning is de image zonder naam of tag verdwenen.

Een specifieke image op naam verwijderen

Je kunt een image gericht verwijderen door naar de naam te verwijzen:

$ docker image rm <image_name>

Opmerking: Je kunt niet eenvoudig images verwijderen die nog in gebruik zijn. Je moet de draaiende containers die de images gebruiken stoppen of verwijderen. Hoewel het meestal niet wordt aanbevolen, kun je de verwijdering van een actief image forceren met de flag-f:

$ docker image rm <image_name> -f

De rmi steno gebruiken voor het verwijderen van images

De Docker CLI heeft een stenografische aanpak voor het verwijderen van images in de alias rmi. Het gebruik ervan om een image op naam te verwijderen ziet er als volgt uit:

$ docker rmi demo
Untagged: demo:latest
Deleted: sha256:2cbc27836df4a7707e746e28368f1fdecfefbfb813aae06611ca6913116b80b4

We zullen rmi gebruiken voor de volgende imageverwijderingsvoorbeelden.

Alle ongetagde images verwijderen

Ongetagde images nemen nog steeds kostbare schijfruimte in beslag, waardoor je systeem na verloop van tijd steeds trager wordt.

Om alle ongelabelde images in Docker te verwijderen, gebruik je het commando docker rmi met een filter. Je kunt filters geven op basis van specifieke criteria met de optie -f (niet te verwarren met de flag -f die beschikbaar is voor image rm om een actie te forceren).

Het filter dangling=true wordt gebruikt om ongemerkte images te identificeren:

$ docker rmi $(docker images -f "dangling=true" -q)

De optie -q in het bovenstaande commando toont de image ID’s van alle ongemerkte images. Al deze ID’s worden dan als argumenten doorgegeven aan docker rmi om ze te verwijderen.

Dit filter gebruikt het sleutelwoord “dangling”, maar zoals hierboven opgemerkt kunnen sommige images zonder tags wel degelijk actief zijn. Je krijgt een waarschuwing als een door dit filter geselecteerde image niet echt “bungelt”.

Een specifieke afbeelding op ID verwijderen

Je kunt het commando docker rmi gebruiken om een specifieke image te verwijderen op basis van zijn ID:

$ docker rmi <image_id>

Verwijder een specifieke image op naam en label

Je kunt een specifieke image met naam en label verwijderen met het commando docker rmi.

Als je bijvoorbeeld meerdere images hebt met dezelfde naam maar verschillende tags, kun je een bepaalde image verwijderen met dit format:

$ docker rmi <image_name>:<tag>

Deze methode is handig als je een specifieke versie van een image wilt verwijderen in plaats van alle images te verwijderen die betrekking hebben op een archief.

Alle images met de latest tag verwijderen

In Docker verwijst de “latest” tag naar de meest recente versie van een bepaald Docker image. De latest tag wordt vaak gebruikt als de standaard tag voor Docker images. Het wordt automatisch toegewezen aan de meest recente build van een image, tenzij expliciet een andere tag wordt opgegeven.

Docker biedt een commando om alle images met de “latest” tag te verwijderen:

$ docker rmi $(docker images | grep "latest" | awk '{print $3}')

Het bovenstaande commando bestaat uit 2 delen. Eerst krijgt het de lijst met image ID’s, en dan geeft het deze lijst door als argument aan het commando docker rmi.

Images verwijderen uit een extern archief

Om een image te verwijderen uit een remote repository, zoals Docker Hub, moet je eerst inloggen op het account met de Docker CLI.

Als je eenmaal bent ingelogd, hoef je alleen maar het commando docker rmi te gebruiken om de image te verwijderen. Het docker rmi commando kan zowel lokale als remote images verwijderen:

docker rmi my_repo/my_image_tag

Je kunt alleen images verwijderen die naar het archief zijn gepushed. Ook kun je geen images verwijderen die gebruikt worden door draaiende containers.

Meerdere images uit een remote archief verwijderen

Om meerdere images uit een extern archief te verwijderen, kun je het commando docker rmi gebruiken, gevolgd door de image ID’s of tags. Bijvoorbeeld:

docker rmi my_repo/image_tag_1 my_repo/image_tag_2 my_repo/image_tag_3

Dit zal de drie images met de tags image_tag_1, image_tag_2, en image_tag_3 verwijderen uit de repository my_repo.

Zo verwijder je Docker volumes

Docker volumes kunnen veel schijfruimte in beslag nemen, vooral als ze grote hoeveelheden gegevens of meerdere backups bevatten. Door volumes die niet langer nodig zijn te verwijderen, verminder je het risico op datalekken en zorg je ervoor dat gevoelige gegevens niet toegankelijk zijn voor onbevoegde gebruikers. Het regelmatig verwijderen van volumes kan de Docker omgeving ook up-to-date houden en problemen door verouderde gegevens voorkomen.

Deze commando’s vernietigen permanent alle gegevens die in een volume zijn opgeslagen, dus gebruik ze met voorzichtigheid.

Alle ongebruikte volumes verwijderen

In Docker is het verwijderen van ongebruikte volumes net zo cruciaal als het verwijderen van images of containers.

Om schijfruimte vrij te maken kun je het commando docker volume prune gebruiken.

Een specifiek volume op naam verwijderen

Het verwijderen van een specifiek volume in Docker is handig voor het verwijderen van ongebruikte volumes. Hier is het commando om een volume te verwijderen:

docker volume rm my_volume_name

Met het bovenstaande commando wordt het volume my_volume_name verwijderd. Docker produceert een fout als je een gebruikt volume probeert te verwijderen. Je kunt beschikbare volumes controleren met het commando docker volume ls.

Zo verwijder je Docker containers

Naarmate je meer met Docker werkt, kun je veel ongebruikte containers verzamelen die de schijfresources in beslag nemen. Als je ze niet verwijdert, kunnen ze zich na verloop van tijd ophopen en kostbare schijfresources in beslag nemen, waardoor je systeem vertraagt en je mogelijk gevaar loopt.

Alle gestopte containers verwijderen

Het commando docker container prune kan alle gestopte containers in Docker verwijderen. Hierbij maakt het commando een lijst van alle gestopte containers die verwijderd zullen worden en vraagt om bevestiging voordat het verder gaat. Dit helpt om schijfruimte terug te winnen en een schone en georganiseerde Docker omgeving te houden, terwijl je dubbel kunt controleren of je niets belangrijks verliest:

$ docker container prune

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

Deleted Containers:
4df4c47c4df4
d35bcec20bce

Merk op dat alleen gestopte containers met dit commando kunnen worden verwijderd. Als je draaiende containers wilt verwijderen, moet je ze eerst stoppen of een ander commando gebruiken.

Een specifieke container op ID verwijderen

In Docker kun je een specifieke container per ID verwijderen met behulp van de docker rm command samen met de container ID. Verkrijg eerst alle container ID met behulp van de docker ps command:

$ docker ps -a -q
1ce3cdeb4035
06b79541e25c
fa98f1804e3e

$ docker rm 1ce3cdeb4035

Het bovenstaande commando werkt alleen als de container zich in een gestopte toestand bevindt. Als de container draait, dan moet je hem geforceerd verwijderen met de -f flag:

$ docker rm -f 1ce3cdeb4035

Een specifieke container op naam verwijderen

Docker biedt een veelzijdig docker rm commando om zowel containers op naam als op ID te verwijderen.

Als je bijvoorbeeld een container hebt met de naam web_server, kun je die verwijderen met het volgende commando:

$ docker rm web_server

Eerst is het belangrijk om de container te stoppen. Docker biedt het commando docker stop om een specifieke container te stoppen.

Alle draaiende containers verwijderen

Om alle draaiende containers te verwijderen, kun je het commando docker rm gebruiken:

$ docker rm $(docker ps -q)

Met behulp van docker ps -q worden de ID’s van draaiende containers opgesomd. Daarna worden de ID’s doorgegeven aan het commando docker rm, dat alle containers verwijdert.

Let op dat dit commando alleen draaiende containers verwijdert. Als je alle containers wilt verwijderen, ook de gestopte, kun je in plaats daarvan het volgende commando gebruiken:

$ docker rm $(docker ps -a -q)

Samenvatting

In dit artikel is uitgelegd hoe je Docker images, volumes en containers kunt verwijderen. Je leerde verschillende methoden om een schoon en georganiseerd systeem te onderhouden. Het behandelde commando’s om alle ongebruikte, ongemerkte of specifieke images op ID of naam te verwijderen. Je leerde ook commando’s om alle gestopte containers of een specifieke container op ID of naam te verwijderen.

Het verwijderen van Docker images, volumes en containers is een eenvoudig proces dat je kan helpen ongebruikte componenten te beheren, waardoor waardevolle schijfruimte wordt teruggewonnen en de systeemprestaties vaak verbeteren.

Het is deze eenvoud die developers aantrekt tot Docker, en er is geen eenvoudiger manier om een in Docker ontwikkelde applicatie te deployen dan met Kinsta’s Applicatie Hosting platform. Je kunt het nu gratis uitproberen.

Salman Ravoof

Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.