Trăim într-o eră în care stocarea devine din ce în ce mai ieftină în fiecare zi. Putem pur și simplu să trimitem totul în cloud și să nu plătim aproape nimic.

Deci, de ce ar trebui să ne facem griji cu privire la ștergerea imaginilor Docker?

În primul rând, există încă unele sarcini de muncă critice pentru misiune, care nu pot fi mutate în cloud, în special cele din industrii puternic reglementate, precum legea sau asistența medicală.

Dar pentru a răspunde mai bine la această întrebare, aș spune că noi, ca dezvoltatori, ne găsim adesea în afara spațiului pe mașinile noastre locale.

Să facem o analiză rapidă a acestui lucru Set de date public StackOverflow pentru a explora asta mai departe:

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

Rezultatele interogării:

Docker Remove Image Cum se sterg imaginile Docker explicate cu

Deci nu se întâmplă doar cu mine, nu? Uită-te la câte vizualizări avem despre acele postări StackOverflow. Dacă vă întrebați, numărul este 465687 vizualizări pentru postări care corespund interogării de căutare.

Din fericire pentru noi, astăzi vom vedea câteva ușor de folosit exemple despre cum să ștergem imaginile noastre docker suspendate și neutilizate pentru a ne ajuta.

Ce sunt imaginile Docker suspendate și neutilizate?

desen

Care este diferența dintre imaginile suspendate și cele neutilizate, s-ar putea să întrebați?

O imagine suspendată înseamnă că ați creat o nouă versiune a imaginii, dar nu i-ați dat un nume nou. Gândiți-vă la acele imagini vechi, uitate, cu care nimeni nu mai știe ce să facă – acestea sunt „imagini suspendate”.

Acestea sunt lăsate neetichetate și afișate <none> pe numele lor când alergi docker images.

Pe de altă parte, o imagine neutilizată înseamnă că nu a fost atribuită sau nu este utilizată într-un container.

De exemplu, când rulezi docker ps -a – va afișa toate containerele care rulează în prezent, plus containerele ieșite. Orice imagine utilizată în interiorul oricărui container este afișată ca „imagini folosite”, iar orice altele sunt neutilizate.

Ștergeți imaginile Docker

Acum să vedem câteva exemple despre cum să ștergeți imaginile Docker.

Studiul nostru de caz

desen

Busy Cat Corp este o companie fictivă care captează date despre comportamentul pisicilor și oferă recomandări proprietarilor de pisici cu privire la modul de a-și face animalele de companie mai ocupate și mai fericite.

Toate încărcăturile lor de lucru sunt containerizate și utilizează următoarele imagini din baza de date:
cassandra, postgres, mysql și mongo.

Dezvoltatorii lor rămân în mod constant fără spațiu pe mașinile lor și sunt utilizatori de top ai StackOverflow – nu suntem cu toții?

Așa că ne-au cerut câteva exemple rapide despre cum să ștergem câteva imagini și să le recuperăm spațiul.

Mai întâi să aruncăm o privire la mașina unuia dintre dezvoltatorii lor.

docker images

Ieșire

REPOSITORY  TAG          IMAGE ID            CREATED              SIZE
<none>       <none>      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

E grozav, au descărcate toate imaginile din sarcinile lor de lucru. Dar uitați-vă la spațiul pe disc – este mai mult decât 2 GB! Să vedem ce putem face pentru ei.

Ștergeți imaginile suspendate Docker

Vom începe prin a căuta imagini suspendate.

docker images -qf "dangling=true"

Ieșire

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

Avem una, așa că o vom lămuri.

Ștergeți imaginea suspendată

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

desen

Ștergeți imaginile neutilizate Docker

În continuare, căutăm imagini neutilizate.

docker ps -a

Ieșire

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

Avem un singur container care rulează mysql imagine, deci toate celelalte imagini sunt neutilizate.

Pentru a nu fi nevoie să o facem manual, putem pune împreună un script care să arate toate imaginile neutilizate pentru a le verifica.

# 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
bazat pe acest răspuns stackoverflow

Ieșire

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.

Apoi șterge imaginile neutilizate.

# 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
bazat pe acest răspuns stackoverflow

După ștergerea atât a imaginilor atârnate, cât și a celor neutilizate, ne putem uita la ce ne-a mai rămas.

docker images

Ieșire

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

Deci avem doar mysql imaginea rămasă, asta e minunat!

desen

Ștergeți toate imaginile Docker învechite cu prune

Aceste comenzi sună grozav, dar un al doilea dezvoltator a spus că nu le pasă de diferențele dintre imaginile suspendate și cele neutilizate.

Tot ce își doreau era să șteargă imagini învechite și să-și recupereze spațiul pe disc.

Personal asta este ceea ce fac de obicei.

Deci, putem folosi doar comenzile de curățare ale lui Docker.

# First delete all stopped containers
docker container prune

# Then delete both dangling and unused images
docker image prune --all

Aceasta va șterge atât imaginile nefolosite, cât și imaginile suspendate. Sau, cu alte cuvinte, imagini fără cel puțin un container asociat.

Notă: de aceea a trebuit să ștergem mai întâi containerele oprite din codul de mai sus.

Ambalaj sus

În acest articol am văzut cum să ștergem imagini Docker și am folosit o companie fictivă pentru a o explica cu câteva exemple ușor de utilizat.

Este important să subliniem că nu ar trebui să utilizați Docker pentru a păstra un istoric al imaginilor dvs. vechi. Pentru un mediu de dezvoltator care este în regulă, puteți chiar automatiza imaginea pentru a curăța volumul de lucru, dacă aveți de-a face cu multe dintre ele.

Dar pentru o sarcină de lucru de producție, ar trebui să utilizați o soluție Container Registry pentru a gestiona imaginile Docker.

Există multe soluții de Container Registry acolo, cum ar fi Google Cloud Platform cu Registrul artefactelor și Docker Enterprise cu Registrul de încredere Docker. Și dacă vă aflați în lumea open source, puteți doar să utilizați Docker Hub :).

Mulțumesc pentru lectură!

* Ilustrații de Icoane 8 din Icoane8

Dacă vi s-a părut util acest lucru sau doriți să contestați sau să extindeți orice a fost ridicat aici, nu ezitați să mă contactați Stare de nervozitate sau Linkedin. Să ne conectăm!