
Tere, Habr! Esitan teile artikli tÔlke autori .
TÀna rÀÀgime sellest, kuidas Docker kasutab hostmasina kettaruumi ning uurime, kuidas vabastada seda ruumi mittevajalikest piltidest ja konteineritest.

Kogutarbimine
Docker on Ă€ge asi, kahtlemata pole tĂ€napĂ€eval keegi selles kahtlemas. Veel paar aastat tagasi pakkus see toode meile tĂ€iesti uue viisi iga keskkonna loomisel, tarnimisel ja kĂ€itamisel, vĂ”imaldades oluliselt sÀÀsta protsessori ja mĂ€lu ressursse. Lisaks sellele (ja mĂ”ne jaoks on see isegi kĂ”ige tĂ€htsam) aitas Docker meil uskumatult lihtsustada ja ĂŒhtlustada kasutatavate töökeskkondade elutsĂŒkli haldamist.
Kuid kĂ”igi nende kaasaegsete mugavuste eest tuleb maksta. Kui kĂ€itameme konteinerit, allalaadime vĂ”i loome oma pilte, juurutame keerulisi ökosĂŒsteeme, peame maksma. Ja maksame sealhulgas ketta ruumiga.
Kui te pole kunagi mĂ”elnud, kui palju ruumi teie Docker masinas tegelikult Ă€ra vĂ”tab, vĂ”ite selle kĂ€su vĂ€ljundi tĂ”ttu ebameeldivalt ĂŒllatuda:
$ docker system df 
Siin on nĂ€idatud Dockerâi diskikasutust erinevates aspektides:
- pildid (images) â allalaaditud ja teie sĂŒsteemis loodud piltide kogumahu suurus;
- konteinerid (containers) â jooksvaid konteinerite kasutatav ĂŒldine kettaruumi maht (silmas peetakse kĂ”igi konteinerite kirjutamis- ja lugemistasemete kogumahtu);
- kohalikud mahud (local volumes) â kohalikud salvestusruumid, mis on konteineritega ĂŒhendatud;
- ehituse vahemĂ€lu (build cache) â ajutised failid, mis on loodud piltide ehitamise protsessi kĂ€igus (kasutades BuildKit tööriista, mis on saadaval alates Docker versioonist 18.09).
VÔin kihla vedada, et juba pÀrast seda lihtsat loetelu tunnete suure soovi puhastada oma ketast prahist ja vabastada kallihinnalised gigabaidid (vÀlja arvatud, kui maksate nende gigabaitide eest igakuiselt rendimaksu).
Konteinerite diskikasutus
Iga kord, kui konteiner luuakse hostimasinas, luuakse kataloogis /var/lib/docker mitu faili ja katalooge, mille hulgas tasub vÀlja tuua jÀrgmised:
- Kataloog /var/lib/docker/containers/ID_konteineri â standardse logimisjuhendi kasutamisel salvestatakse just siia sĂŒndmuste logid JSON-formaadis. Liigne ĂŒksikasjalikkus logides ning logid, mida keegi ei loe ega muul moel töötle, pĂ”hjustavad sageli kĂ”vakettaruumi ĂŒletĂ€itumise.
- Kataloog /var/lib/docker/overlay2 â sisaldab konteinerite kirjutamis- ja lugemiskihti (overlay2 â eelistatud draiver enamikus Linuxi jaotustes). Kui konteiner salvestab andmeid oma failisĂŒsteemi, siis just selles kataloogis need asuvad.
Kujutame ette sĂŒsteemi, kuhu on installitud puhas Docker, mis ei ole kunagi osalenud konteinerite kĂ€itamise ega imagede koostamises. Tema kettakasutuse raport nĂ€eb vĂ€lja jĂ€rgmine:
$ 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 konteineri, nÀiteks NGINX:
$ docker container run --name www -d -p 8000:80 nginx:1.16Mis juhtub diskiga:
- pildid (images) vÔtavad 126 MB, see on see NGINX, mille me konteineris kÀivitasime;
- konteinerid (containers) vÔtavad naljakad 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 0BVaatamata vÀljundile ei ole meil veel ruumi, mida vÔiksime vabastada. Kuna 2 baiti on tÀiesti naljakas, kujutame ette, et meie NGINX kirjutas ootamatult kuhugi 100 Megabaidi andmeid ja lÔi endasse faili test.img just sellise suurusega.
$ docker exec -ti www
dd if=/dev/zero of=test.img bs=1024 count=0 seek=$[1024*100]Uurime taas diskiruumi kasutust hostis. NÀeme, et konteiner (containers) vÔtab seal 100 Megabaidi.
$ 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 uudishimu juba kĂŒsib, kus meie fail test.img asub. Otsime seda:
$ 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.imgIlma, et fail test.img on mugavalt paigutatud lugemise-kirjutamise tasemele, mida haldab overlay2 juht. Kui me peatame meie konteineri, siis host nÀitab meile, et see koht on pÔhimÔtteliselt vabastatav:
# 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 me saame seda teha? Kustutades konteineri, mis toob endaga kaasa vastava ruumi puhastamise lugemise-kirjutamise tasemel.
JĂ€rgmise kĂ€su abil saate ĂŒheskoos eemaldada kĂ”ik installitud konteinerid ja puhastada oma ketta kĂ”igist neile sisse loodud lugemise-kirjutamise failidest:
$ docker container prune
WARNING! See eemaldab kÔik peatatud konteinerid.
Kas olete kindel, et soovite jÀtkata? [y/N] y
Kustutatud konteinerid:
5e7f8e5097ace9ef5518ebf0c6fc2062ff024efb495f11ccc89df21ec9b4dcc2
Kokku vabastatud ruum: 104.9MBNii et me vabastasime 104,9 megabaiti konteineri eemaldamisega. Kuid kuna me enam ei kasuta varem allalaaditud pilti, muutub see samuti meie ressursside vabastamise kandidaadiks:
$ docker system df
TĂĂP KOKKU AKTIIVNE SUURUS TAASKONDITSIONITAV
Pildid 1 0 126M 126M (100%)
Konteinerid 0 0 0B 0B
Kohalikud mahtud 0 0 0B 0B
Kogumise vahemĂ€lu 0 0 0B 0BTĂ€htis: seni, kuni pilt on vĂ€hemalt ĂŒhe konteineri poolt kasutusel, ei saa te seda nippi kasutada.
AlamkĂ€sk prune, mida me eespool kasutasime, kehtib ainult peatatud konteinerite kohta. Kui soovime eemaldada mitte ainult peatatud, vaid ka töötavaid konteinerite, tuleks kasutada ĂŒhte jĂ€rgmistest kĂ€skudest:
# Historical command
$ docker rm -f $(docker ps âaq)
# More recent command
$ docker container rm -f $(docker container ls -aq)MĂ€rkused: kui konteineri kĂ€itamisel kasutada parameetrit ârm, siis selle peatamisel vabastatakse kogu ruum, mida see kasutas.
Piltide poolt kasutatav diskiruumi
MĂ”ned aastad tagasi oli mitme sajandi megabaiti suurune pilt tĂ€iesti normaalne: Ubuntu pilt kaalub 600 megabaiti ja Microsoft .Net pilt mitu gigabaiti. Tol ajal vĂ”is ĂŒhe pildi allalaadimine teie vabale kettaruumi korralikult haiget teha, isegi kui jagasite pilte vastavalt nende vahel. TĂ€na â tĂ€nu suurele â on pildid palju vĂ€iksemad, kuid isegi siis vĂ”ite kiiresti oma ressursid tĂ€is saada, kui te ei vĂ”ta ette teatud ettevaatusabinĂ”usid.
On mitu pilditĂŒĂŒpi, mis pole lĂ”ppkasutajale vahetult nĂ€htavad:
- intermediate pildid, mille pĂ”hjal on kokku pandud teised pildid â neid ei saa eemaldada, kui kasutate konteynereid, mis pĂ”hinevad just nende "teiste" piltide peal;
- dangling pildid â need on intermediate pildid, millele ei viita ĂŒkski kĂ€imasolev konteiner â need vĂ”ivad olla eemaldatud.
- JĂ€rgmise kĂ€suga saate kontrollida, kas teie sĂŒsteemis on dangling pilte:
$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
none none 21e658fe5351 12 minutes ago 71.3MBNende eemaldamine on vÔimalik jÀrgmise kÀsu abil:
$ docker image rm $(docker image ls -f dangling=true -q)Me saame kasutada ka kÀsku prune:
$ docker image prune
WARNING! See kustutab kÔik nö. rippuvad pildid.
Kas olete kindel, et soovite jÀtkata? [y/N] y
Kustutatud pildid:
kustutatud: sha256:143407a3cb7efa6e95761b8cd6cea25e3f41455be6d5e7cda
kustutatud: sha256:738010bda9dd34896bac9bbc77b2d60addd7738ad1a95e5cc
kustutatud: sha256:fa4f0194a1eb829523ecf3bad04b4a7bdce089c8361e2c347
kustutatud: sha256:c5041938bcb46f78bf2f2a7f0a0df0eea74c4555097cc9197
kustutatud: sha256:5945bb6e12888cf320828e0fd00728947104da82e3eb4452f
Kokku taastatud ruum: 12.9kBKui me tahame kustutada kĂ”ik pildid (mitte ainult rippuvad) ĂŒhe kĂ€suga, siis saab seda teha nii:
$ docker image rm $(docker image ls -q)Ketta kasutamine mahudena
Mahud (volumes) kasutatakse andmete salvestamiseks konteineri failisĂŒsteemist vĂ€ljaspool. NĂ€iteks, kui me soovime salvestada mingi rakenduse töö tulemusi, et neid hiljem kasutada. Sage nĂ€ide on andmebaasid.
KÀivitame MongoDB konteineri, mountime sellele vÀlise mahu 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. Kuid miks mitte konteineri lugemise-kirjutamise tasemel? Sest MongoDB Dockerfile'i pildis on kataloog /data/db (kus MongoDB vaikimisi oma andmeid sÀilitab) mÀÀratletud kui maht (volume).

MÀrgistusmÀrkmed: paljud pildid, mille pÔhjal peaksid andmed tekkima, kasutavad nende andmete salvestamiseks mahuteid (volumes).
Kui oleme MongoDB-ga mÀnginud ja konteineri peatame (vÔib-olla isegi kustutame), ei kustutata mahutit. See jÀtkab meie vÀÀrtusliku kettaruumi hÔivamist, kuni me selle selgesÔnaliselt kustutame jÀrgmise kÀsuga:
$ docker volume rm $(docker volume ls -q)VÔi vÔime kasutada juba tuttavat alakommandot prune:
$ docker volume prune
WARNING! See eemaldab kĂ”ik kohalikud mahutid, mida ei kasutada vĂ€hemalt ĂŒhe konteineri poolt.
Kas olete kindel, et soovite jÀtkata? [y/N] y
Kustutatud mahutid:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da
Kokku vabastatud ruum: 25.82GB
luc@saturn:~$Ketta kasutamine piltide kogumise vahemÀlu jaoks
Docker 18.09-s on piltide loomise protsessis toimusid mĂ”ned muutused BuildKit tööriista tĂ”ttu. Selle abil suurendatakse protsessi kiirus, optimeeritakse andmete salvestamise ja turvamise haldamist. Siin me ei kĂ€sitle kĂ”iki selle suurepĂ€rase tööriista ĂŒksikasju, vaid keskendume sellele, kuidas see puutub kokku kettaruumi kasutamise probleemidega.
Oletame, et meil on tÀiesti lihtne Node.Js rakendus:
- fail index.js kÀivitab lihtsa HTTP serveri, mis vastab igale saadud pÀringule reaga:
- fail package.json mÀÀratleb sÔltuvused, millest kasutatakse ainult expressjs HTTP serveri kÀivitamiseks:
$ 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 pildi koostamiseks nÀeb vÀlja jÀrgmine:
FROM node:13-alpine
COPY package.json /app/package.json
RUN cd /app && npm install
COPY . /app/
WORKDIR /app
EXPOSE 80
CMD ["npm", "start"]Kogume pildi tavalisel viisil, ilma BuildKit'i kasutamata:
$ docker build -t app:1.0 .Kui vaatame kettaruumi kasutust, nÀeme, et ruumi vÔtavad ainult pÔhikujutis (node:13-alpine) ja lÔppkujutis (app:1.0):
TĂĂP KOKKU AKTIIVNE SUURUS TAASTATAV
Pildid 2 0 109.3MB 109.3MB (100%)
Konteinerid 0 0 0B 0B
Kohalikud mahud 0 0 0B 0B
Build Cache 0 0 0B 0BKogume nĂŒĂŒd meie rakenduse teise versiooni, kasutades juba BuildKit'i. Selleks peame vaid seadma muutuja DOCKER_BUILDKIT vÀÀrtuseks 1:
$ DOCKER_BUILDKIT=1 docker build -t app:2.0 .Kui me nĂŒĂŒd kettaruumi kontrollime, nĂ€eme, et seal osaleb nĂŒĂŒd build cache (buid-cache):
$ docker system df
TĂĂP KOKKU AKTIIVNE SUURUS TAASTATAV
Pildid 2 0 109.3MB 109.3MB (100%)
Konteinerid 0 0 0B 0B
Kohalikud mahud 0 0 0B 0B
Build Cache 11 0 8.949kB 8.949kBKÀesoleva puhastamiseks kasutame jÀrgmist kÀsku:
$ docker builder prune
HOIATUS! See eemaldab kÔik rippuvad build cache'i objektid.
Kas soovite tegelikult jÀtkata? [y/N] y
Eemaldatud build cache'i objektid:
rffq7b06h9t09xe584rn4f91e
ztexgsz949ci8mx8p5tzgdzhe
3z9jeoqbbmj3eftltawvkiayi
Kokku taastatud ruum: 8.949kBPuhastage kÔik!
Nii, oleme kĂ€sitlenud konteinerite, piltide ja mahtude poolt kasutatud kettaruumi puhastamist. Sellega aitab meid prune alammeeskond. Kuid seda saab kasutada ka Docker'i sĂŒsteemitasandil, ja see puhastab kĂ”ik, mis vĂ”imalik:
$ docker system prune
HOIATUS! See eemaldab:
- kÔik peatatud konteinerid
- kĂ”ik vĂ”rgud, mida ei kasutata vĂ€hemalt ĂŒhe konteineri poolt
- kÔik rippuvad pildid
- kÔik rippuvad koostamisvahemÀlud
Kas olete kindel, et soovite jÀtkata? [y/N]Kui te mingil pÔhjusel sÀÀstate kettaruumi Docker'i masinas, siis tasub harjumuseks vÔtta selle kÀsu perioodiline kÀivitamine.
Allikas: habr.com
