
Hej, Habr! Jag presenterar översÀttningen av artikeln författare .
Idag ska vi prata om hur Docker anvÀnder diskutrymmet pÄ vÀrdmaskinen och ocksÄ gÄ igenom hur man kan frigöra detta utrymme frÄn skrÀp som onödiga bilder och containrar.

Total anvÀndning
Docker Àr en fantastisk grej, idag Àr det nog fÄ som tvivlar pÄ detta. För bara nÄgra Är sedan gav denna produkt oss ett helt nytt sÀtt att bygga, leverera och köra vilken miljö som helst, vilket gör att vi kan spara betydligt pÄ processor- och minnesresurser. Utöver detta (och för vissa Àr det kanske det viktigaste) har Docker lÄtit oss förenkla och standardisera hanteringen av livscykeln för de arbetsmiljöer vi anvÀnder.
Men för allt detta moderna liv mÄste man betala. NÀr vi kör containrar, laddar ner eller skapar egna bilder, rullar ut komplexa ekosystem, sÄ betalar vi. Och vi betalar ocksÄ med diskutrymme.
Om du aldrig har funderat pÄ hur mycket plats som faktiskt Àr upptagen pÄ din Docker-maskin kan du bli obehagligt överraskad av resultatet frÄn detta kommando:
$ docker system df 
HÀr visas Docker-anvÀndningen av disk i olika aspekter:
- bilder (images) â den totala storleken av bilder som har laddats ner frĂ„n bildförrĂ„d och skapats i ditt system;
- containrar (containers) â den totala mĂ€ngden diskytan som anvĂ€nds av aktiva containrar (det handlar om den totala mĂ€ngden lĂ€s- och skrivlager av alla containrar);
- lokala volymer (local volumes) â mĂ€ngden lokala lagringsutrymmen som Ă€r monterade pĂ„ containrar;
- byggcache (build cache) â tillfĂ€lliga filer som genereras av processen att bygga bilder (vid anvĂ€ndning av verktyget BuildKit, tillgĂ€ngligt frĂ„n och med Docker version 18.09).
Jag kan slÄ vad om att efter denna enkla upprÀkning brinner du av lÀngtan att rensa disken frÄn skrÀp och ÄterfÄ dina vÀrdefulla gigabyte (anm. övers.: sÀrskilt om du betalar hyra för dessa gigabyte varje mÄnad).
DiskanvÀndning av containrar
Varje gÄng en container skapas pÄ vÀrdmaskinen skapas flera filer och kataloger i katalogen /var/lib/docker, bland vilka följande Àr vÀrda att notera:
- Katalogen /var/lib/docker/containers/ID_kontainer â nĂ€r standard logg-drivrutinen anvĂ€nds, sparas loggarna i JSON-format hĂ€r. Alltför detaljerade loggar, samt loggar som ingen lĂ€ser eller behandlar pĂ„ andra sĂ€tt, blir ofta en orsak till att diskarna fylls.
- Katalogen /var/lib/docker/overlay2 â innehĂ„ller skriv- och lĂ€slager för containrar (overlay2 â den föredragna drivrutinen i de flesta Linux-distributioner). Om containern sparar data i sitt filsystem kommer de att placeras i denna katalog.
LÄt oss förestÀlla oss ett system dÀr Docker Àr helt nyinstallerad, utan att ha deltagit i att köra containrar eller bygga bilder. Dess rapport om diskusage skulle se ut sÄ hÀr:
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 0 0 0B 0B
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0BLÄt oss köra en container, till exempel NGINX:
$ docker container run --name www -d -p 8000:80 nginx:1.16Vad hÀnder med disken:
- bilder (images) tar upp 126 MB, det Àr just den NGINX vi har startat i containern;
- containrar (containers) tar upp löjliga 2 byte.
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 1 126M 0B (0%)
Containers 1 1 2B 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0BEnligt utskriften har vi fortfarande inget utrymme som vi kan frigöra. Eftersom 2 byte Àr helt oseriöst, lÄt oss förestÀlla oss att vÄr NGINX ovÀntat har skrivit 100 Megabyte data nÄgonstans och skapat en fil test.img av just den storleken.
$ docker exec -ti www
dd if=/dev/zero of=test.img bs=1024 count=0 seek=$[1024*100]Vi undersöker igen anvÀndningen av diskutrymme pÄ vÀrden. Vi kommer att se att containern (containers) tar upp 100 Megabyte dÀr.
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 1 126M 0B (0%)
Containers 1 1 104.9MB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0BJag tror att din nyfikna hjÀrna redan undrar var vÄr fil test.img finns. LÄt oss leta efter den:
$ find /var/lib/docker -type f -name test.img
/var/lib/docker/overlay2/83f177...630078/merged/test.img
/var/lib/docker/overlay2/83f177...630078/diff/test.imgUtan att gÄ in pÄ detaljer kan vi konstatera att filen test.img Àr bekvÀmt placerad pÄ lÀs- och skrivnivÄer som hanteras av overlay2-drivern. Om vi stoppar vÄr container kommer vÀrden att meddela oss att detta utrymme i princip kan frisÀttas:
# Stopping the www container
$ docker stop www
# Visualizing the impact on the disk usage
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 1 126M 0B (0%)
Containers 1 0 104.9MB 104.9MB (100%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0BHur kan vi Ästadkomma detta? Genom att ta bort containern, vilket kommer att rensa det motsvarande utrymmet pÄ lÀs- och skrivnivÄ.
Med följande kommando kan du ta bort alla installerade containrar pÄ en gÄng och rensa din disk frÄn alla filer som de skapat pÄ lÀs- och skrivnivÄ:
$ docker container prune
WARNING! Detta kommer att ta bort alla stoppade containrar.
Ăr du sĂ€ker pĂ„ att du vill fortsĂ€tta? [y/N] y
Borttagna containrar:
5e7f8e5097ace9ef5518ebf0c6fc2062ff024efb495f11ccc89df21ec9b4dcc2
Totalt Ätervunnen plats: 104.9MBSÄ, vi har frigjort 104,9 megabyte genom att ta bort containern. Men eftersom vi inte lÀngre anvÀnder den nedladdade bilden, blir Àven den kandidat för borttagning och frigör vÄra resurser:
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 0 126M 126M (100%)
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0BObservera: sÄ lÀnge som bilden anvÀnds av minst en container kan du inte anvÀnda detta trick.
Undersubkommandot prune, som vi anvÀnde ovan, ger effekt endast pÄ stoppade containrar. Om vi vill ta bort inte bara stoppade utan Àven körande containrar, bör vi anvÀnda nÄgot av dessa kommandon:
# Historical command
$ docker rm -f $(docker ps âaq)
# More recent command
$ docker container rm -f $(docker container ls -aq)Noter pÄ sidlinjen: om du anvÀnder parametern --rm vid start av containern, kommer allt diskutrymme som den anvÀnde att frigöras vid nedstÀngning.
DiskanvÀndning av bilder
För nĂ„gra Ă„r sedan var storleken pĂ„ en bild pĂ„ flera hundra megabyte helt normal: Ubuntu-bilden vĂ€gde 600 megabyte och Microsoft .Net-bilden flera gigabyte. PĂ„ den tiden kunde nedladdningen av bara en bild orsaka stor skada pĂ„ ditt fria utrymme pĂ„ disken, Ă€ven om du delade nivĂ„er mellan bilder. Idag â tack och lov â vĂ€ger bilderna mycket mindre, men Ă€ven i detta fall kan du snabbt fylla upp befintliga resurser om du inte vidtar vissa försiktighetsĂ„tgĂ€rder.
Det finns flera typer av bilder som inte syns direkt för slutanvÀndaren:
- intermediĂ€ra bilder, som andra bilder Ă€r baserade pĂ„ â de kan inte tas bort om du anvĂ€nder containrar baserade pĂ„ dessa "andra" bilder;
- hĂ€ngande bilder â dessa Ă€r sĂ„dana intermediĂ€ra bilder som ingen av de körande containrarna refererar till â de kan tas bort.
- Med följande kommando kan du kontrollera om det finns hÀngande bilder i ditt system:
$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
none none 21e658fe5351 12 minutes ago 71.3MBDe kan tas bort pÄ följande sÀtt:
$ docker image rm $(docker image ls -f dangling=true -q)Vi kan ocksÄ anvÀnda subkommandot prune:
$ docker image prune
WARNING! Detta kommer att ta bort alla hÀngande bilder.
Ăr du sĂ€ker pĂ„ att du vill fortsĂ€tta? [y/N] y
Raderade bilder:
raderad: sha256:143407a3cb7efa6e95761b8cd6cea25e3f41455be6d5e7cda
raderad: sha256:738010bda9dd34896bac9bbc77b2d60addd7738ad1a95e5cc
raderad: sha256:fa4f0194a1eb829523ecf3bad04b4a7bdce089c8361e2c347
raderad: sha256:c5041938bcb46f78bf2f2a7f0a0df0eea74c4555097cc9197
raderad: sha256:5945bb6e12888cf320828e0fd00728947104da82e3eb4452f
Totalt Ätervunnen plats: 12.9kBOm vi plötsligt vill ta bort alla bilder (inte bara hÀngande) med ett kommando kan vi göra sÄ hÀr:
$ docker image rm $(docker image ls -q)AnvÀndning av disk med volymer
Volymer anvÀnds för att lagra data utanför containerns filsystem. Till exempel, om vi vill spara resultaten frÄn ett program för att anvÀnda dem pÄ nÄgot annat sÀtt. Ett vanligt exempel Àr databaser.
LÄt oss starta en MongoDB-container, montera en extern volym till den, och ÄterstÀlla en databasbackup frÄn en fil (bck.json):
# Running a mongo container
$ docker run --name db -v $PWD:/tmp -p 27017:27017 -d mongo:4.0
# Importing an existing backup (from a huge bck.json file)
$ docker exec -ti db mongoimport
--db 'test'
--collection 'demo'
--file /tmp/bck.json
--jsonArrayData kommer att befinna sig pÄ vÀrdmaskinen i katalogen /var/lib/docker/volumes. Men varför inte pÄ nivÄ med lÀs- och skrivÄtkomst hos containern? För att i Dockerfile för MongoDB-bilden definieras katalogen /data/db (dÀr MongoDB vanligtvis lagrar sina data) som en volym.

Noter i marginalen: mÄnga bilder, vars resultat ska skapa data, anvÀnder volymer för att spara dessa data.
NÀr vi Àr klara med MongoDB och stoppar (eller kanske till och med raderar) containern, kommer volymen inte att tas bort. Den kommer att fortsÀtta ta upp vÄrt vÀrdefulla diskutrymme tills vi uttryckligen tar bort den med följande kommando:
$ docker volume rm $(docker volume ls -q)Eller sÄ kan vi anvÀnda det redan bekanta subkommandot prune:
$ docker volume prune
VARNING! Detta kommer att ta bort alla lokala volymer som inte anvÀnds av Ätminstone en behÄllare.
Ăr du sĂ€ker pĂ„ att du vill fortsĂ€tta? [y/N] y
Borttagna volymer:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da
Totalt Ätervunnen utrymme: 25.82GB
luc@saturn:~$AnvÀndning av disk för cache av bildbyggen
I Docker 18.09 har processen för skapande av bilder genomgÄtt vissa förÀndringar tack vare verktyget BuildKit. Med hjÀlp av detta ökar hastigheten pÄ processen, och hantering av datalagring och sÀkerhet optimeras. HÀr kommer vi inte att gÄ in pÄ alla detaljer om detta fantastiska verktyg, utan fokuserar istÀllet pÄ hur det berör anvÀndningen av diskutrymme.
Anta att vi har en helt enkel Node.Js-applikation:
- filen index.js startar en enkel HTTP-server som svarar med en strÀng pÄ varje mottagen begÀran:
- filen package.json definierar beroenden, dÀr endast expressjs anvÀnds för att köra HTTP-servern:
$ cat index.js
var express = require('express');
var util = require('util');
var app = express();
app.get('/', function(req, res) {
res.setHeader('Content-Type', 'text/plain');
res.end(util.format("%s - %s", new Date(), 'Got Request'));
});
app.listen(process.env.PORT || 80);$ cat package.json
{
"name": "testnode",
"version": "0.0.1",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.14.0"
}
}Dockerfile för att bygga bilden ser ut sÄ hÀr:
FROM node:13-alpine
COPY package.json /app/package.json
RUN cd /app && npm install
COPY . /app/
WORKDIR /app
EXPOSE 80
CMD ["npm", "start"]LÄt oss bygga bilden pÄ det vanliga sÀttet, utan att anvÀnda BuildKit:
$ docker build -t app:1.0 .Om vi kontrollerar anvÀndningen av diskutrymme kommer vi att se att platsen endast tas av basbilden (node:13-alpine) och den slutgiltiga bilden (app:1.0):
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 2 0 109.3MB 109.3MB (100%)
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0BLÄt oss bygga den andra versionen av vÄr applikation, nu med anvÀndning av BuildKit. För detta behöver vi bara stÀlla in variabeln DOCKER_BUILDKIT till vÀrdet 1:
$ DOCKER_BUILDKIT=1 docker build -t app:2.0 .Om vi nu kontrollerar diskutrymmet kommer vi att se att byggcache (build-cache) nu ocksÄ deltar:
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 2 0 109.3MB 109.3MB (100%)
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 11 0 8.949kB 8.949kBFör att rensa det, anvÀnd följande kommando:
$ docker builder prune
WARNING! Detta kommer att ta bort all överflödig byggcache.
Ăr du sĂ€ker pĂ„ att du vill fortsĂ€tta? [y/N] y
Raderade byggcache-objekt:
rffq7b06h9t09xe584rn4f91e
ztexgsz949ci8mx8p5tzgdzhe
3z9jeoqbbmj3eftltawvkiayi
Totalt Ätervunnen plats: 8.949kBRensa allt!
SÄ vi har sett pÄ att rensa diskhantering utlÄnat av containrar, bilder och volymer. Detta görs med hjÀlp av subkommandot prune. Men det kan ocksÄ anvÀndas pÄ systemnivÄ av Docker, och det kommer att rensa allt som det kan:
$ docker system prune
WARNING! Detta kommer att ta bort:
- alla stoppade containrar
- alla nÀtverk som inte anvÀnds av minst en container
- alla överflödiga bilder
- all överflödig byggcache
Ăr du sĂ€ker pĂ„ att du vill fortsĂ€tta? [y/N]Om du av nĂ„gon anledning sparar diskutrymme pĂ„ en maskin med Docker, Ă€r det vĂ€rt att göra det till en vana att köra detta kommando regelbundet.
KĂ€lla: habr.com
