
Tere, Habr! Esitlen teile tÔlget artiklist autor .
TÀna rÀÀgime sellest, kuidas Docker kasutab hostmasina kettaruumi, ning vaatame, kuidas vabastada seda ruumi kasutamata image'ite ja konteinerite jÀÀkidest.

Kogutarbimine
Docker on suurepĂ€rane tööriist ja ilmselt kahtlevad selles tĂ€napĂ€eval vĂ€hesed. Vaid mĂ”ni aasta tagasi tĂ”i see toode meieni tĂ€iesti uue viisi mis tahes keskkonna loomiseks, juurutamiseks ja kĂ€ivitamiseks, aidates mĂ€rgatavalt sÀÀsta protsessori- ja RAM-ressursse. Lisaks sellele â ja mĂ”ne jaoks on see isegi kĂ”ige olulisem â muutis Docker kasutatavate töökeskkondade elutsĂŒkli halduse uskumatult lihtsaks ja ĂŒhtseks.
Kuid kĂ”igi nende tĂ€napĂ€evaste mugavuste eest tuleb maksta. Kui kĂ€ivitame konteinereid, laadime alla vĂ”i loome oma image'eid vĂ”i juurutame keerukaid ökosĂŒsteeme, maksame selle eest muu hulgas kettaruumiga.
Kui te pole kunagi mĂ”elnud, kui palju ruumi Docker teie masinas tegelikult hĂ”ivab, siis vĂ”ib selle kĂ€su vĂ€ljund teid ebameeldivalt ĂŒllatada:
$ docker system df 
Siin on nÀidatud Dockeri kettakasutus eri lÔigetes:
- image'id (images) â image'ite kogumaht, mis on image-hoidlatest alla laaditud vĂ”i teie sĂŒsteemis loodud;
- konteinerid (containers) â töötavate konteinerite kasutatav kettaruumi kogumaht (st kĂ”igi konteinerite lugemis-kirjutamiskihi kogumaht);
- kohalikud köited (local volumes) â konteineritesse ĂŒhendatud kohalike andmemahtude maht;
- build cache â image'ite loomise protsessi kĂ€igus genereeritud ajutised failid (BuildKit tööriista kasutamisel, mis on saadaval alates Dockeri versioonist 18.09).
VĂ”in kihla vedada, et juba pĂ€rast seda lihtsat loetelu tahate ketta prĂŒgist puhastada ja vÀÀrtuslikud gigabaidid tagasi saada.
Konteinerite kettakasutus
Iga kord, kui konteiner luuakse, tekitatakse hostmasinas kataloogi /var/lib/docker mitu faili ja kataloogi, millest tasub esile tÔsta jÀrgmisi:
- Kataloog /var/lib/docker/containers/ID_ĐșĐŸĐœŃĐ”ĐčĐœĐ”Ńа â standardse logidraiveri kasutamisel salvestatakse sĂŒndmuste logid JSON-vormingus just siia. Liiga detailsed logid, samuti logid, mida keegi ei loe ega töötle muul viisil, pĂ”hjustavad sageli ketaste tĂ€itumist.
- Kataloog /var/lib/docker/overlay2 â sisaldab konteinerite kirjutatavaid kihte (overlay2 on enamikus Linuxi distributsioonides eelistatud draiver). Kui konteiner salvestab andmeid oma failisĂŒsteemi, paigutatakse need just sellesse kataloogi.
Kujutame ette sĂŒsteemi, kuhu on paigaldatud tĂ€iesti puhas Docker, mida pole kordagi kasutatud konteinerite kĂ€ivitamiseks ega image'ite ehitamiseks. Selle kettakasutuse aruanne nĂ€eb vĂ€lja selline:
$ 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 0BKÀivitame mÔne konteineri, nÀiteks NGINX-i:
$ docker container run --name www -d -p 8000:80 nginx:1.16Mis kettaga toimub:
- Image'id (images) vĂ”tavad enda alla 126 MB â see on seesama NGINX, mille konteineris kĂ€ivitasime;
- Konteinerid (containers) vÔtavad enda alla naeruvÀÀrsed 2 baiti.
$ 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 0BVĂ€ljundi jĂ€rgi otsustades pole meil veel ruumi, mida saaks vabastada. Kuna 2 baiti pole ĂŒldse tĂ”siseltvĂ”etav, kujutame ette, et meie NGINX kirjutas tĂ€iesti ootamatult kuhugi 100 megabaiti andmeid ja lĂ”i enda sisse tĂ€pselt sellise suurusega faili test.img.
$ docker exec -ti www
dd if=/dev/zero of=test.img bs=1024 count=0 seek=$[1024*100]Uurime uuesti kettakasutust hostis. NÀeme, et konteiner (containers) vÔtab seal enda alla 100 megabaiti.
$ 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 0BArvan, et teie uudishimulik mĂ”istus kĂŒsib juba, kus meie fail test.img asub. Otsime selle ĂŒles:
$ 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.imgĂksikasjadesse laskumata vĂ”ib mĂ€rkida, et fail test.img paikneb mugavalt overlay2 draiveri hallataval lugemis-kirjutamiskihil. Kui aga konteineri peatame, annab host meile mĂ€rku, et selle ruumi saab pĂ”himĂ”tteliselt vabastada:
# 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 0BKuidas seda teha? Kustutades konteineri, mille tulemusel puhastatakse vastav ruum lugemis-kirjutamiskihil.
JĂ€rgmise kĂ€suga saate kĂ”ik installitud konteinerid ĂŒhe korraga eemaldada ja puhastada ketta kĂ”igist nende loodud lugemis-kirjutamiskihi failidest:
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
5e7f8e5097ace9ef5518ebf0c6fc2062ff024efb495f11ccc89df21ec9b4dcc2
Total reclaimed space: 104.9MBNiisiis vabastasime konteineri kustutamisega 104,9 megabaiti. Kuid kuna me varem allalaaditud imageâit enam ei kasuta, on ka see nĂŒĂŒd eemaldamise ja ressursside vabastamise kandidaat:
$ 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 0BTĂ€helepanu: seni kuni image on kasutusel vĂ€hemalt ĂŒhe konteineri poolt, ei saa te seda vĂ”tet kasutada.
AlamkĂ€sk prune, mida eespool kasutasime, toimib ainult peatatud konteinerite puhul. Kui soovime eemaldada mitte ainult peatatud, vaid ka töötavad konteinerid, tuleks kasutada ĂŒht neist kĂ€skudest:
# Historical command
$ docker rm -f $(docker ps âaq)
# More recent command
$ docker container rm -f $(docker container ls -aq)MĂ€rkus: kui kasutada konteineri kĂ€ivitamisel parameetrit ârm, vabastatakse selle peatamisel kogu kettaruum, mida see hĂ”ivas.
Imageâite kettakasutus
MĂ”ni aasta tagasi oli mitmesaja megabaidine image tĂ€iesti tavapĂ€rane: Ubuntu image kaalus 600 megabaiti ja Microsoft .Neti image mitu gigabaiti. Neil vanadel aegadel vĂ”is juba ainuĂŒksi ĂŒhe imageâi allalaadimine teie vaba kettaruumi tĂ”siselt vĂ€hendada, isegi kui jagasite kihte imageâite vahel. TĂ€napĂ€eval, Ă”nneks, on imageâid palju vĂ€iksemad, kuid ka sel juhul vĂ”ib olemasolevad ressursid kiiresti tĂ€is kulutada, kui mitte rakendada mĂ”ningaid ettevaatusabinĂ”usid.
On olemas mitut tĂŒĂŒpi imageâeid, mis lĂ”ppkasutajale otseselt nĂ€htavad ei ole:
- intermediate image'id, mille pĂ”hjal on koostatud teised image'id â neid ei saa eemaldada, kui kasutate konteinereid, mis pĂ”hinevad neil samadel âteistelâ image'idel;
- dangling image'id on intermediate image'id, millele ei viita ĂŒkski töötav konteiner â need saab eemaldada.
- JĂ€rgmise kĂ€suga saate kontrollida, kas teie sĂŒsteemis leidub dangling image'e:
$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
none none 21e658fe5351 12 minutes ago 71.3MBNeid saab eemaldada jÀrgmiselt:
$ docker image rm $(docker image ls -f dangling=true -q)VÔime kasutada ka alamkÀsku prune:
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:143407a3cb7efa6e95761b8cd6cea25e3f41455be6d5e7cda
deleted: sha256:738010bda9dd34896bac9bbc77b2d60addd7738ad1a95e5cc
deleted: sha256:fa4f0194a1eb829523ecf3bad04b4a7bdce089c8361e2c347
deleted: sha256:c5041938bcb46f78bf2f2a7f0a0df0eea74c4555097cc9197
deleted: sha256:5945bb6e12888cf320828e0fd00728947104da82e3eb4452f
Total reclaimed space: 12.9kBKui soovime ĂŒhe kĂ€suga eemaldada ĂŒldse kĂ”ik image'id (mitte ainult dangling image'id), siis saab seda teha nii:
$ docker image rm $(docker image ls -q)Kettaruumi kasutamine volume'ite poolt
Volume'e kasutatakse andmete salvestamiseks vĂ€ljaspool konteineri failisĂŒsteemi. NĂ€iteks siis, kui soovime mĂ”ne rakenduse töö tulemused alles hoida, et neid hiljem muul viisil kasutada. TĂŒĂŒpiline nĂ€ide on andmebaasid.
KÀivitame MongoDB konteineri, mount'ime sellele konteinerivÀlise volume'i ja taastame sellest andmebaasi varukoopia (meil on see saadaval failis 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
--jsonArrayAndmed asuvad hostmasinas kataloogis /var/lib/docker/volumes. Aga miks mitte konteineri lugemis-kirjutamiskihi tasemel? Sest MongoDB image'i Dockerfile'is on kataloog /data/db (kus MongoDB vaikimisi oma andmeid hoiab) mÀÀratletud volume'ina.

MÀrkus: paljud image'id, mille töö tulemusena andmeid luuakse, kasutavad nende andmete sÀilitamiseks volume'e.
Kui oleme MongoDB-ga lÔpetanud ning peatame (vÔi isegi eemaldame) konteineri, siis volume'it ei kustutata. See jÀtkab meie vÀÀrtusliku kettaruumi hÔivamist seni, kuni eemaldame selle kÀsitsi jÀrgmise kÀsuga:
$ docker volume rm $(docker volume ls -q)VÔi saame kasutada juba tuttavat alamkÀsku prune:
$ docker volume prune
WARNING! See eemaldab kĂ”ik kohalikud köited, mida ei kasuta vĂ€hemalt ĂŒks konteiner.
Kas soovite kindlasti jÀtkata? [y/N] y
Deleted Volumes:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da
Total reclaimed space: 25.82GB
luc@saturn:~$Kettakasutus image'i build-cache'i jaoks
Docker 18.09-s tehti image'ite loomise protsessis mĂ”ningaid muudatusi tĂ€nu BuildKitile. Selle tööriista abil suureneb koostamise kiirus ning paraneb andmesalvestuse ja turvalisuse haldus. Siin ei kĂ€sitle me selle suurepĂ€rase tööriista kĂ”iki ĂŒksikasju, vaid vaatame ainult seda, kuidas see mĂ”jutab kettaruumi kasutust.
Oletame, et meil on tÀiesti lihtne Node.Js-i rakendus:
- Fail index.js kÀivitab lihtsa HTTP serveri, mis vastab igale saabunud pÀringule tekstireaga:
- Fail package.json mÀÀrab sÔltuvused, millest HTTP serveri kÀivitamiseks kasutatakse ainult expressjs-i:
$ 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 image'i koostamiseks nÀeb vÀlja selline:
FROM node:13-alpine
COPY package.json /app/package.json
RUN cd /app && npm install
COPY . /app/
WORKDIR /app
EXPOSE 80
CMD ["npm", "start"]Koostame image'i tavalisel viisil, ilma BuildKiti kasutamata:
$ docker build -t app:1.0 .Kui kontrollime kettaruumi kasutust, nÀeme, et ruumi vÔtavad ainult baasimage (node:13-alpine) ja lÔppimage (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 0BKoostame nĂŒĂŒd meie rakenduse teise versiooni, kasutades juba BuildKiti. Selleks tuleb vaid mÀÀrata muutuja DOCKER_BUILDKIT vÀÀrtuseks 1:
$ DOCKER_BUILDKIT=1 docker build -t app:2.0 .Kui kontrollime nĂŒĂŒd kettakasutust, nĂ€eme, et nĂŒĂŒd osaleb selles ka build-cache:
$ 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.949kBSelle puhastamiseks kasutame jÀrgmist kÀsku:
$ docker builder prune
WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y
Deleted build cache objects:
rffq7b06h9t09xe584rn4f91e
ztexgsz949ci8mx8p5tzgdzhe
3z9jeoqbbmj3eftltawvkiayi
Total reclaimed space: 8.949kBPuhasta kÔik!
Vaatasime nĂŒĂŒd, kuidas puhastada konteinerite, image'ite ja volume'ite kasutatavat kettaruumi. Selleks aitab subkĂ€sk prune. Kuid seda saab kasutada ka Dockeri sĂŒsteemitasemel ning siis puhastab see kĂ”ik, mida vĂ€hegi saab:
$ docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N]Kui sÀÀstate mingil pÔhjusel Dockeriga masinas kettaruumi, tasub selle kÀsu perioodiline kÀivitamine harjumuseks muuta.
Allikas: habr.com
