Docker Fjern billede: Sådan slettes Docker-billeder forklaret med eksempler

Vi lever i en æra, hvor opbevaring bliver billigere hver dag. Vi kan bare sende alt til skyen og næsten ikke betale noget.

Så hvorfor skulle vi bekymre os om at slette Docker-billeder?

Først og fremmest er der stadig nogle missionskritiske arbejdsbelastninger, der ikke kan flyttes til skyen, især dem i stærkt regulerede industrier som lov eller sundhedspleje.

Men for bedre at kunne besvare dette spørgsmål vil jeg sige, at vi som udviklere ofte befinder os uden plads på vores lokale maskiner.

Lad os lave en hurtig analyse af dette StackOverflow offentlige datasæt for at udforske det yderligere:

SELECT tag, title, answer_count, favorite_count, score, view_count VIEWS FROM (SELECT title, answer_count, favorite_count, view_count, score, SPLIT(tags, '|') tags FROM `bigquery-public-data.stackoverflow.posts_questions` posts_questions), UNNEST(tags) tag WHERE tag = 'docker' AND title LIKE '%space left%' ORDER BY VIEWS DESC

Forespørgselsresultater:

Så det sker ikke bare med mig, ikke? Se på hvor mange visninger vi har på disse StackOverflow-indlæg. Hvis du undrer dig over, er antallet 465687 visninger for indlæg, der matcher søgeforespørgslen.

Heldigvis for os vil vi i dag se nogle brugervenlige eksempler på, hvordan vi sletter vores dinglende og ubrugte dockerbilleder for at hjælpe os selv ud.

Hvad er dinglende og ubrugte Docker-billeder?

tegning

Hvad er forskellen mellem dinglende og ubrugte billeder, spørger du måske?

Et dinglende billede betyder, at du har oprettet en ny opbygning af billedet, men ikke har givet det et nyt navn. Tænk på de gamle, glemte billeder, som ingen ved, hvad de skal gøre med længere - det er "dinglende billeder".

De efterlades umærket og vises på deres navn, når du løber docker images.

På den anden side betyder et ubrugt billede, at det ikke er tildelt eller ikke bruges i en container.

For eksempel, når du kører docker ps -a- viser den alle dine aktuelt kørende containere plus forladte containere. Alle billeder, der bruges i en af ​​containerne, vises som "brugte billeder", og andre er ubrugte.

Slet Docker-billeder

Lad os nu se nogle eksempler på, hvordan du sletter Docker-billeder.

Vores casestudie

tegning

The Busy Cat Corp er et fiktivt firma, der registrerer katteopførselsdata og giver anbefalinger til katteejere om, hvordan de gør deres kæledyr travlere og lykkeligere.

Alle deres arbejdsbelastninger er containeriserede, og de bruger følgende databasebilleder:

Cassandra, postgres, mysql og mongo.

Deres udviklere løber konstant tør for plads på deres maskiner, og de er topbrugere af StackOverflow - er vi ikke alle?

Så de bad os om nogle hurtige eksempler på, hvordan man sletter nogle billeder og får deres plads tilbage.

Lad os først se på maskinen til en af ​​deres udviklere.

docker images

Produktion

REPOSITORY TAG IMAGE ID CREATED SIZE   9c872a6119cc About a minute ago 384MB mysql latest 5ac22cccc3ae 43 hours ago 544MB cassandra 3 9fab0c92a93d 4 days ago 384MB adoptopenjdk 8-jre... 2bf0172ac69b 4 days ago 210MB mongo latest 6d11486a97a7 2 weeks ago 388MB postgres latest b97bae343e06 6 weeks ago 313MB

Det er sejt, de har downloadet alle billederne fra deres arbejdsbelastning. Men se på diskpladsen - den er mere end 2 GB ! Lad os se, hvad vi kan gøre for dem.

Slet Docker-dinglende billeder

Vi starter med at kigge efter dinglende billeder.

docker images -qf "dangling=true"

Produktion

REPOSITORY TAG IMAGE ID CREATED SIZE   9c872a6119cc About a minute ago 384MB

Vi har en, så vi vil rydde den op.

Slet det dinglende billede

docker rmi $(docker images -qf "dangling=true") 
tegning

Slet ubrugte billeder fra Docker

Dernæst leder vi efter ubrugte billeder.

docker ps -a

Produktion

CONTAINER ID IMAGE CREATED NAMES b6387b343b81 mysql 16 minutes ago some-mysql

Vi har kun en container, der kører   mysql  billedet, så alle de andre billeder er ubrugte.

For at vi ikke behøver at gøre det manuelt, kan vi sammensætte et script, der viser alle de ubrugte billeder for at bekræfte dem.

# Get all the images currently in use USED_IMAGES=($( \ docker ps -a --format '{{.Image}}' | \ sort -u | \ uniq | \ awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \ )) # Get all the images currently available ALL_IMAGES=($( \ docker images --format '{{.Repository}}:{{.Tag}}' | \ sort -u \ )) # Print the unused images for i in "${ALL_IMAGES[@]}"; do UNUSED=true for j in "${USED_IMAGES[@]}"; do if [[ "$i" == "$j" ]]; then UNUSED=false fi done if [[ "$UNUSED" == true ]]; then echo "$i is not being used." fi done

Produktion

adoptopenjdk:8-jre-hotspot-bionic is not being used. cassandra:3 is not being used. mongo:latest is not being used. postgres:latest is not being used.

Derefter slettes de ubrugte billeder.

# Get all the images currently in use USED_IMAGES=($( \ docker ps -a --format '{{.Image}}' | \ sort -u | \ uniq | \ awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \ )) # Get all the images currently available ALL_IMAGES=($( \ docker images --format '{{.Repository}}:{{.Tag}}' | \ sort -u \ )) # Remove the unused images for i in "${ALL_IMAGES[@]}"; do UNUSED=true for j in "${USED_IMAGES[@]}"; do if [[ "$i" == "$j" ]]; then UNUSED=false fi done if [[ "$UNUSED" == true ]]; then docker rmi "$i" fi done

Efter at have slettet både dinglende og ubrugte billeder kan vi se på, hvad vi har tilbage.

docker images

Produktion

REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest 5ac22cccc3ae 43 hours ago 544MB

Så vi har kun mysql  billedet tilbage, det er fantastisk!

tegning

Slet alle forældede Docker-billeder med beskær

Disse kommandoer lyder godt, men en anden udvikler sagde, at de ikke var ligeglade med forskellene mellem dinglende og ubrugte billeder.

Alt, hvad de ønskede var at rydde forældede billeder og få deres diskplads tilbage.

Personligt er det, hvad jeg normalt gør.

Så vi kan bare bruge Dockers beskærekommandoer.

# First delete all stopped containers docker container prune # Then delete both dangling and unused images docker image prune --all

Dette sletter både ubrugte og dinglende billeder. Eller med andre ord billeder uden mindst en beholder tilknyttet.

Bemærk: dette er grunden til, at vi først skulle slette de stoppede containere i koden ovenfor.

Indpakning op

In this article we saw how to delete Docker Images, and we used a fictional company to explain it with some easy-to-use examples.

It's important to point out that you shouldn't use Docker to keep a history of your old images. For a developer environment that's fine, and you can even automate the image clean up workload if you have to deal with a lot of them.

But for a production workload, you should be using a Container Registry solution to handle your Docker images.

There are many Container Registry solutions out there, like Google Cloud Platform with Artifact Registry and Docker Enterprise with Docker Trusted Registry. And if you are in the open source world, you can just use Docker Hub :).

Thanks for reading!

* Illustrations by Icons 8 from Icons8

Hvis du fandt dette nyttigt eller ønsker at udfordre eller udvide noget, der er rejst her, er du velkommen til at kontakte mig på Twitter eller Linkedin. Lad os forbinde!