
Përshëndetje, Habr! Ju prezantoj përkthimin e artikullit autori .
Sot do të flasim për mënyrën se si Docker përdor hapësirën diskore të makinës pritëse dhe do të shqyrtojmë se si ta çlirojmë këtë hapësirë nga mbetjet e imazheve dhe kontejnerëve të pavlerë.

Konsum total
Docker është një gjë e mrekullueshme, ndoshta sot pak njerëz dyshojnë për këtë. Vetëm disa vite më parë, ky produkt na ofroi një mënyrë krejtësisht të re për të ndërtuar, dërguar dhe ekzekutuar çdo mjedis, duke na lejuar të kursejmë ndjeshëm resurset e procesorit dhe memorjes operative. Përveç kësaj (dhe për disa, kjo mund të jetë edhe më e rëndësishme), Docker na mundësoi të thjeshtojmë dhe unifikojmë menaxhimin e ciklit të jetës të mjediseve të punës që përdorim.
Megjithatë, për të gjitha këto bukuri të jetës moderne, duhet të paguajmë. Kur fillojmë kontejnerë, shkarkojmë ose krijojmë imazhe tona, shpërndajmë ekosistemat komplekse, duhet të paguajmë. Dhe paguajmë, përfshirë, me hapësirën diskore.
Nëse keni qenë ndonjëherë të shqetësuar për sa hapësirë është realisht e zënë në makinën tuaj nga Docker, mund të jeni të surprizuar keq nga rezultati i këtij komande:
$ docker system df 
Këtu shfaqet përdorimi i diskut nga Docker në aspekte të ndryshme:
- imazhe (images) â pesha totale e imazheve qĂ« janĂ« shkarkuar nga depo dhe ndĂ«rtuar nĂ« sistemin tuaj;
- kontejnerĂ« (containers) â sasia totale e hapĂ«sirĂ«s diskore tĂ« pĂ«rdorur nga kontejnerĂ«t e aktivizuar (kuptohet si sasia totale e shtresave tĂ« leximit-shkrimit tĂ« tĂ« gjithĂ« kontejnerĂ«ve);
- vĂ«llime lokale (local volumes) â sasia e magazinave lokale, tĂ« montuara nĂ« kontejnerĂ«;
- _CACHE e ndĂ«rtimit (build cache) â skedarĂ«t pĂ«rkohĂ«sorĂ« tĂ« krijuar gjatĂ« procesit tĂ« ndĂ«rtimit tĂ« imazheve (duke pĂ«rdorur mjetin BuildKit, i disponueshĂ«m nga Docker versioni 18.09).
Jam i sigurt se pas këtij përshkrimi të thjeshtë, ju do të dëshironit të pastroni diskun nga mbeturinat dhe të riktheni gigabajtët e çmuar (shënim: sidomos, nëse për këta gigabajtë paguani çdo muaj një qira).
Përdorimi i diskut nga kontejnerët
Ădo herĂ« kur krijoni njĂ« kontejner nĂ« makinĂ«n pritĂ«se, nĂ« katalogun /var/lib/docker krijohen disa skedarĂ« dhe kataloge, ndĂ«r tĂ« cilat duhet tĂ« theksohen tĂ« following:
- Katalogu /var/lib/docker/containers/ID_konteinerit - kur përdoret drejtori standard i regjistrimit, këtu ruhen skedarët e ngjarjeve në formatin JSON. Regjistrimet shumë të detajuara, si dhe ato që askush nuk i lexon dhe nuk i përpunon në mënyra të tjera, shpesh shkaktojnë mbushje të dyshemesë.
- Katalogu /var/lib/docker/overlay2 - përmban shtresat e leximit-shkrimit të konteinerëve (overlay2 - drejtori e preferuar në shumicën e shpërndarjeve të Linux). Nëse konteneri ruan të dhëna në sistemin e tij të skedarëve, ato do të vendosen pikërisht në këtë katalog.
Le të imagjinojmë një sistem ku është instaluar një Docker të pastër, i cili nuk ka marrë pjesë ndonjëherë në ekzekutimin e konteinerëve dhe ndërtimin e imazheve. Raporti i tij mbi përdorimin e hapësirës së dyshemesë do të duket kështu:
$ docker system df
TIPI TOTAL AKTIV SIPĂRFAQE PĂRHASHMĂRISHME
Imazhe 0 0 0B 0B
Konteinerë 0 0 0B 0B
Vëllimet Lokale 0 0 0B 0B
Cache ndërtimi 0 0 0B 0BTë ekzekutojmë ndonjë kontener, për shembull, NGINX:
$ docker container run --name www -d -p 8000:80 nginx:1.16ĂfarĂ« ndodh me diskun:
- imazhet (images) zënë 126 Mb, ky është NGINX-i që ekzekutuam në kontener;
- kontejnerët (containers) zënë vetëm 2 byte.
$ docker system df
TIPI TOTAL AKTIV MADHĂSIA RIKTHESHME
Imazhet 1 1 126M 0B (0%)
Kontejnerët 1 1 2B 0B (0%)
Vëllimet lokale 0 0 0B 0B
Cache ndërtimi 0 0 0B 0BDuke u bazuar në daljen, nuk kemi hapësirë për të çliruar. Sepse 2 byte është krejtësisht e papranueshme, le të imagjinojmë se NGINX ynë papritur shkroi diku 100 Megabajt të dhënash dhe krijoi brenda vetes një skedar test.img të atij madhësie.
$ docker exec -ti www
dd if=/dev/zero of=test.img bs=1024 count=0 seek=$[1024*100]Po shqyrtojmë përsëri përdorimin e hapësirës në disk në host. Do të shohim se kontejneri (containers) zë aty 100 Megabajt.
$ docker system df
TIPI TOTAL AKTIV MADHĂSIA RIKTHESHME
Imazhet 1 1 126M 0B (0%)
Kontejnerët 1 1 104.9MB 0B (0%)
Vëllimet lokale 0 0 0B 0B
Cache ndërtimi 0 0 0B 0BMendoj se mendja juaj kurioze tashmë po bëhet pyetje, ku ndodhet skedari ynë test.img. Le të e kërkojmë atë:
$ 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.imgPa pa për detaje, mund të theksojmë se skedari test.img është pozicionuar në mënyrë të përshtatshme në nivelin e leximit-shkrimit, të menaxhuar nga drejtuesi overlay2. Nëse e ndalojmë kontenierin tonë, hosti do t'na tregojë që ky vend mund të lirohet në thelb:
# 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 0BSi mund ta bëjmë këtë? Duke fshirë kontenierin, i cili do të tërheqë pastrimin e hapësirës përkatëse në nivelin e leximit-shkrimit.
Me komandën e mëposhtme mund të fshini të gjithë kontenierët e instaluar me një të rënë dhe të pastroni diskun tuaj nga të gjithë skedarët që janë krijuar prej tyre në nivelin e leximit-shkrimit:
$ docker container prune
WARNING! Kjo do të heqë të gjithë kontenierët e ndaluar.
A jeni të sigurt se dëshironi të vazhdoni? [y/N] y
Kontenierët e fshirë:
5e7f8e5097ace9ef5518ebf0c6fc2062ff024efb495f11ccc89df21ec9b4dcc2
Hapësira totale e rikuperuar: 104.9MBKështu, kemi liruar 104.9 Megabajt duke fshirë kontenierin. Por pasi tashmë nuk po e përdorim imazhin e shkarkuar më parë, ai gjithashtu bëhet një kandidat për fshirje dhe lirimin e burimeve tona:
$ docker system df
LLOJI TOTAL AKTIV SIZI RIKUPERUESHME
Imazhet 1 0 126M 126M (100%)
Kontenierët 0 0 0B 0B
Volume Lokale 0 0 0B 0B
Kasa e Ndërtimit 0 0 0B 0BKujdes: derisa imazhi përdoret nga të paktën një kontejner, nuk do të jeni në gjendje të përdorni këtë truk.
Dishblloku i team-it prune që përdorem më parë ka efekt vetëm në kontejnerët e ndalur. Nëse dëshirojmë të heqim jo vetëm kontejnerët e ndaluar, por edhe ata aktivë, duhet të përdorim një nga këto komanda:
# Historical command
$ docker rm -f $(docker ps âaq)
# More recent command
$ docker container rm -f $(docker container ls -aq)ShĂ«nime nĂ« anĂ«: nĂ«se pĂ«rdorim parametrin ârm kur startojmĂ« njĂ« kontejner, hapĂ«sira e diskut qĂ« ai zinte do tĂ« lirohet kur ai tĂ« ndalhet.
Përdorimi i diskut nga imazhet
Disa vjet mĂ« parĂ«, madhĂ«sia e njĂ« imazhi nĂ« disa qindra megabajt ishte mjaft normale: imazhi Ubuntu peshoi 600 megabajt, ndĂ«rsa imazhi Microsoft .Net disa gigabajt. NĂ« ato kohĂ«ra, shkarkimi vetĂ«m i njĂ« imazhi mund tĂ« dĂ«mtonte ndjeshĂ«m hapĂ«sirĂ«n tuaj tĂ« lirĂ« nĂ« disk, edhe nĂ«se po ndanit nivelet mes imazheve. Sot â falĂ« zotave â imazhet peshojnĂ« shumĂ« mĂ« pak, por edhe nĂ« kĂ«tĂ« rast, mund tĂ« mbushni shpejt burimet nĂ« dispozicion nĂ«se nuk merrni disa masa paraprake.
Ekzistojnë disa lloje imazhesh që nuk janë drejtpërdrejt të dukshme për përdoruesin final:
- imazhe nga mesatarja, mbi tĂ« cilat janĂ« mbledhur imazhe tĂ« tjera â ato nuk mund tĂ« fshihen nĂ«se pĂ«rdorni kontejnerĂ« tĂ« bazuar nĂ« kĂ«to «imazhe tĂ« tjera»;
- imazhe tĂ« varura â kĂ«to janĂ« imazhe tĂ« mesatarjes, tĂ« cilat nuk are referencuar nga asnjĂ« nga kontejnerĂ«t e aktivizuar â ato mund tĂ« fshihen.
- Me komandën e mëposhtme mund të kontrolloni se a ka imazhe të varura në sistemin tuaj:
$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
none none 21e658fe5351 12 minutes ago 71.3MBAto mund të fshihen në këtë mënyrë:
$ docker image rm $(docker image ls -f dangling=true -q)Ne gjithashtu mund të përdorim subkomandën prune:
$ docker image prune
WARNING! Kjo do të heqë të gjitha imazhet e varura.
Jeni të sigurt që dëshironi të vazhdoni? [y/N] y
Imazhet e fshira:
deleted: sha256:143407a3cb7efa6e95761b8cd6cea25e3f41455be6d5e7cda
deleted: sha256:738010bda9dd34896bac9bbc77b2d60addd7738ad1a95e5cc
deleted: sha256:fa4f0194a1eb829523ecf3bad04b4a7bdce089c8361e2c347
deleted: sha256:c5041938bcb46f78bf2f2a7f0a0df0eea74c4555097cc9197
deleted: sha256:5945bb6e12888cf320828e0fd00728947104da82e3eb4452f
Hapësira totale e rikuperuar: 12.9kBNëse ndonjëherë dëshirojmë të fshijmë të gjitha imazhet (dhe jo vetëm ato të varura) me një komandë, mund ta bëjmë kështu:
$ docker image rm $(docker image ls -q)Përdorimi i hapësirës nga volumet
Tomat (volumes) përdoren për të ruajtur të dhënat jashtë sistemit të skedarëve të kontejnerit. Për shembull, nëse duam të ruajmë rezultatet e punës së ndonjë aplikacioni, për t'i përdorur më vonë siç dëshirojmë. Një shembull i zakonshëm janë bazat e të dhënave.
Le të fillojmë një kontejner MongoDB, të montojmë një volum të jashtëm në raport me kontejnerin dhe të rikuperojmë nga ai një backup të bazës së të dhënave (në dispozicionin tonë në skedarin 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
--jsonArrayTë dhënat do të gjenden në makinën host në katalogun /var/lib/docker/volumes. Por pse jo në nivelin e leximit-shkrimit të kontejnerit? Sepse në Dockerfile të figurës MongoDB, katalogu /data/db (ku MongoDB ruan të dhënat e tij si standard) është përcaktuar si volum (volume).

Shënime në margjinë: shumë figura, nga të cilat duhet të krijohen të dhëna, përdorin volumin (volumes) për të ruajtur këto të dhëna.
Kur të mërzitemi me MongoDB dhe të ndalojmë (ndoshta madje edhe të fshijmë) kontenierin, volumi nuk do të fshihet. Ai do të vazhdojë të zërë hapësirën tonë të çmuar në disk derisa ta fshijmë qartë me këtë komandë:
$ docker volume rm $(docker volume ls -q)Ose mund të përdorim nënkomandën prune që tashmë e njohim:
$ docker volume prune
KĂSHILLĂ! Kjo do tĂ« heqĂ« tĂ« gjitha volumet lokale qĂ« nuk pĂ«rdoren nga tĂ« paktĂ«n njĂ« kontejner.
A jeni të sigurt që dëshironi të vazhdoni? [y/N] y
Volume të fshira:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da
Hapësira totale e rikuperuar: 25.82GB
luc@saturn:~$Përdorimi i diskut për caching e ndërtimit të imazheve
Në Docker 18.09, procesi i krijimit të imazheve ka pasur disa ndryshime falë mjetit BuildKit. Ky mjet rrit shpejtësinë e procesit, optimizon menaxhimin e ruajtjes së të dhënave dhe sigurinë. Këtu nuk do të diskutojmë të gjitha detajet e këtij instrumenti të mrekullueshëm, do të fokusohemi vetëm në mënyrën si ndikon ai në çështjet e përdorimit të hapësirës në disk.
Supozoni se kemi një aplikacion shumë të thjeshtë Node.Js:
- skedari index.js nis një server HTTP të thjeshtë, i cili përgjigjet me një varg për çdo kërkesë të marrë:
- skedari package.json përcakton varësitë, nga të cilat përdoret vetëm expressjs për të nisur serverin HTTP:
$ 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 për ndërtimin e imazhit duket kështu:
FROM node:13-alpine
COPY package.json /app/package.json
RUN cd /app && npm install
COPY . /app/
WORKDIR /app
EXPOSE 80
CMD ["npm", "start"]Le të ndërtuojmë imazhin në mënyrë standarde, pa përdorur BuildKit:
$ docker build -t app:1.0 .Nëse kontrollojmë përdorimin e hapësirës në disk, do të shohim se vetëm imazhi bazë (node:13-alpine) dhe imazhi përfundimtar (app:1.0) po zënë vend:
TIPI TOTAL AKTIV TĂ MADH RIKTHYES
Imazhe 2 0 109.3MB 109.3MB (100%)
Kontejnerët 0 0 0B 0B
Vëllimet Lokale 0 0 0B 0B
Caches e Ndërtimit 0 0 0B 0BLe të ndërtuojmë versionin e dytë të aplikacionit tonë, tashmë me përdorimin e BuildKit. Për këtë, thjesht duhet të vendosim variablën DOCKER_BUILDKIT në vlerën 1:
$ DOCKER_BUILDKIT=1 docker build -t app:2.0 .Nëse tani kontrollojmë përdorimin e diskut, do të shohim se tani merr pjesë caching i ndërtimit (buid-cache):
$ docker system df
TIPI TOTAL AKTIV MADH RIKTHIK
Imazhe 2 0 109.3MB 109.3MB (100%)
Kontejnerë 0 0 0B 0B
Vëllime Lokale 0 0 0B 0B
Cache Ndërtime 11 0 8.949kB 8.949kBPër ta pastruar atë, do të përdorim komandën e mëposhtme:
$ docker builder prune
KĂSHILLĂ! Kjo do tĂ« heqĂ« tĂ« gjitha cache-tĂ« e ndĂ«rtimit qĂ« nuk pĂ«rdoren.
A jeni të sigurt që dëshironi të vazhdoni? [y/N] y
Objektet e hequra nga cache-të e ndërtimit:
rffq7b06h9t09xe584rn4f91e
ztexgsz949ci8mx8p5tzgdzhe
3z9jeoqbbmj3eftltawvkiayi
Hapësira totale e rikuperuar: 8.949kBPastroni gjithçka!
Pra, ne kemi shqyrtuar pastrimin e hapësirës në disk të zënë nga konteinerit, imazhet dhe vëllimet. Këtu na ndihmon subkomanda prune. Por ajo mund të përdoret edhe në nivelin sistemik docker, dhe do të pastrojë gjithçka që mundet:
$ docker system prune
KĂSHILLĂ! Kjo do tĂ« heqĂ«:
- të gjitha konteinerit e ndaluar
- të gjitha rrjetet që nuk përdoren nga të paktën një konteiner
- të gjitha imazhet e varura
- të gjitha cache të ndërtimit të varura
A jeni të sigurt që dëshironi të vazhdoni? [y/N]Nëse për ndonjë arsye jeni duke kursyer hapësirën në disk në makinerinë tuaj me Docker, atëherë është një zakon i mirë të ekzekutoni këtë komandë herë pas here.
Burimi: habr.com
