Docker Remove Image: Hogyan lehet törölni a Docker képeket, példákkal magyarázva

Olyan korszakban élünk, amikor a tárolás mindennap olcsóbbá válik. Mindent elküldhetünk a felhőbe, és szinte semmit sem fizetünk.

Miért kellene tehát aggódnunk a Docker-képek törlése miatt?

Először is, még mindig vannak olyan misszió szempontjából kritikus munkaterhelések, amelyeket nem lehet felhőbe helyezni, különösen azokban a szigorúan szabályozott iparágakban, mint a jog vagy az egészségügy.

De hogy jobban megválaszoljam ezt a kérdést, azt mondanám, hogy fejlesztőként gyakran nincs hely a helyi gépeinken.

Gyorsan elemezzük ezt a StackOverflow nyilvános adatkészletet annak további feltárása érdekében:

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

Lekérdezés eredménye:

Tehát nem csak velem történik, igaz? Nézze meg, hány nézettségünk van ezeken a StackOverflow bejegyzéseken. Ha kíváncsi, a keresési lekérdezésnek megfelelő bejegyzések száma 465687 .

Szerencsénkre ma láthatunk néhány könnyen használható példát arra vonatkozóan, hogyan lehet törölni lógó és fel nem használt dokkoló képeinket, hogy segítsünk magunkon.

Mik a lógó és fel nem használt Docker képek?

rajz

Mi a különbség a lógó és a fel nem használt képek között, kérdezheti?

A lógó kép azt jelenti, hogy a kép új felépítését létrehozta, de nem adott új nevet. Gondoljon azokra a régi, elfeledett képekre, amelyekkel már senki sem tud mit kezdeni - ezek "lógó képek".

Nincsenek címkézve, és a nevükön jelennek meg, amikor fut docker images.

Másrészt a fel nem használt kép azt jelenti, hogy nem rendelték hozzá, vagy nem használják tárolóban.

Például futás közben docker ps -a- felsorolja az összes jelenleg futó tárolót és a kilépett tárolókat. A tárolók bármelyikében használt képek "használt képekként" jelennek meg, a többi kép pedig fel nem használt.

Docker Images törlése

Most nézzünk meg néhány példát a Docker képek törlésére.

Esettanulmányunk

rajz

A Busy Cat Corp egy kitalált vállalat, amely rögzíti a macskák viselkedési adatait, és ajánlásokat nyújt a macskatulajdonosoknak, hogyan tehetnék mozgalmasabbá és boldogabbá kedvenceiket.

Minden terhelésük konténerbe kerül, és a következő adatbázis-képeket használják:

cassandra, postgres, mysql és mongo.

Fejlesztőiknek folyamatosan fogy a hely a gépeiken, és ők a StackOverflow legfőbb felhasználói - nem vagyunk valamennyien?

Ezért kértek tőlünk néhány gyors példát arra, hogyan törölhetünk néhány képet, és visszakaphatjuk a helyüket.

Először vessünk egy pillantást egyik fejlesztőjük gépére.

docker images

Kimenet

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

Ez klassz, letöltötték az összes képet a terhelésükről. De nézze meg a lemezterületet - ez több mint 2 GB ! Lássuk, mit tehetünk értük.

Törölje a Docker lógó képeit

Kezdjük lógó képek keresésével.

docker images -qf "dangling=true"

Kimenet

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

Van ilyenünk, ezért tisztázni fogjuk.

Törölje a lógó képet

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

Törölje a Docker fel nem használt képeit

Ezután fel nem használt képeket keresünk.

docker ps -a

Kimenet

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

Csak egy tárolónk futtatja a   mysql  képet, így az összes többi kép fel nem használt.

Annak érdekében, hogy ne kelljen manuálisan elvégeznünk, összeállíthatunk egy szkriptet, amely az összes fel nem használt képet megmutatja azok ellenőrzéséhez.

# 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

Kimenet

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.

Ezután törli a fel nem használt képeket.

# 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

A lógó és a fel nem használt képek törlése után megnézhetjük, mi maradt.

docker images

Kimenet

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

Tehát csak a mysql  képünk maradt, ez nagyszerű!

rajz

Törölje az összes elavult Docker képet metszéssel

Ezek a parancsok remekül hangzanak, de egy második fejlesztő szerint nem érdekli őket a lógó és a fel nem használt képek közötti különbség.

Csak annyit akartak, hogy töröljék az elavult képeket és visszakapják a lemezterületüket.

Személy szerint ezt szoktam csinálni.

Tehát egyszerűen használhatjuk a Docker szilva parancsait.

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

Ez törli a fel nem használt és lógó képeket is. Vagy másképpen: képek, amelyekhez legalább egy tároló nincs társítva.

Megjegyzés: ezért kellett először törölnünk a leállított tárolókat a fenti kódból.

Csomagoló fel

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

Ha hasznosnak találta ezt, vagy ha az itt felvetett dolgokat szeretné megtámadni vagy kibővíteni, forduljon hozzám bizalommal a Twitteren vagy a Linkedinen. Csatlakozzunk!