Ħej Habr! Nippreżenta għall-attenzjoni tiegħek it-traduzzjoni tal-artiklu
Illum se nitkellmu dwar kif Docker juża l-ispazju tad-diska tal-magna ospitanti, u se nifhmu wkoll kif neħilsu dan l-ispazju mir-ruttam ta 'immaġini u kontenituri mhux użati.
Konsum totali
Docker hija ħaġa sabiħa, probabbilment ftit nies jiddubitawha llum. Ftit snin ilu biss, dan il-prodott tana mod kompletament ġdid biex nibnu, inwasslu u nħaddmu kwalunkwe ambjent, li jippermettilna niffrankaw b'mod sinifikanti r-riżorsi tas-CPU u RAM. Minbarra dan (u għal xi wħud din se tkun l-iktar ħaġa importanti) Docker ippermettilna nissimplifikaw u ngħaqqdu b'mod oerhört il-ġestjoni taċ-ċiklu tal-ħajja tal-ambjenti tal-produzzjoni tagħna.
Madankollu, dawn il-pjaċiri kollha tal-ħajja moderna għandhom prezz. Meta nħaddmu kontenituri, iniżżlu jew noħolqu immaġini tagħna stess, u niskjeraw ekosistemi kumplessi, irridu nħallsu. U aħna nħallsu, fost affarijiet oħra, bi spazju fuq disk.
Jekk qatt ma ħsibt dwar kemm Docker fil-fatt jieħu spazju fuq il-magna tiegħek, tista' tkun sorpriż b'mod spjaċevoli bl-output ta' dan il-kmand:
$ docker system df
Dan juri l-użu tad-disk ta 'Docker f'kuntesti differenti:
- immaġini – id-daqs totali tal-immaġini li ġew imniżżla minn repożitorji tal-immaġni u mibnija fuq is-sistema tiegħek;
- kontenituri - l-ammont totali ta 'spazju tad-diska użat billi jitmexxew il-kontenituri (jiġifieri l-volum totali ta' saffi ta' read-write tal-kontenituri kollha);
- volumi lokali – il-volum tal-ħażna lokali mmuntati fuq kontenituri;
- build cache - fajls temporanji ġġenerati mill-proċess tal-bini tal-immaġni (bl-użu tal-għodda BuildKit, disponibbli li tibda bil-verżjoni Docker 18.09).
Ħatrat li wara dan it-trasferiment sempliċi tkun ħerqan li tnaddaf id-diska tiegħek miż-żibel u terġa’ tagħti l-ħajja lill-gigabytes prezzjużi (nota: speċjalment jekk tħallas il-kera għal dawn il-gigabytes kull xahar).
Użu tad-disk mill-kontenituri
Kull darba li toħloq kontenitur fuq il-magna ospitanti, jinħolqu diversi fajls u direttorji fid-direttorju /var/lib/docker, fosthom dawn li ġejjin ta 'min jinnota:
- Direttorju /var/lib/docker/containers/container_ID – meta tuża s-sewwieq tal-logging standard, dan huwa fejn ir-reġistri tal-avvenimenti jiġu ssejvjati fil-format JSON. Zkuk dettaljati wisq, kif ukoll zkuk li ħadd ma jaqra jew jipproċessa b'xi mod ieħor, ħafna drabi jikkawżaw li d-diski jimtlew.
- Id-direttorju /var/lib/docker/overlay2 fih is-saffi tal-qari u l-kitba tal-kontenitur (overlay2 huwa s-sewwieq preferut fil-biċċa l-kbira tad-distribuzzjonijiet tal-Linux). Jekk il-kontenitur jaħżen id-dejta fis-sistema tal-fajls tiegħu, allura huwa f'dan id-direttorju li titqiegħed.
Ejja nimmaġinaw sistema li fuqha huwa installat Docker verġni, li qatt ma kien involut fit-tnedija ta 'kontenituri jew bini ta' immaġini. Ir-rapport tal-użu tal-ispazju tad-disk tiegħu se jidher bħal dan:
$ 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 0B
Ejja nniedu xi kontenitur, pereżempju, NGINX:
$ docker container run --name www -d -p 8000:80 nginx:1.16
X'jiġri mid-diska:
- immaġini jokkupaw 126 MB, dan huwa l-istess NGINX li nedejna fil-kontenitur;
- kontenituri jieħdu 2 bytes redikoli.
$ 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 0B
Meta niġġudikaw mill-konklużjoni, għad m'għandna l-ebda spazju li nistgħu neħilsu. Peress li 2 bytes huma kompletament frivoli, ejja nimmaġinaw li NGINX tagħna b'mod mhux mistenni kiteb x'imkien 100 Megabytes ta 'dejta u ħoloq fajl test.img ta' eżattament dan id-daqs ġewwa fih innifsu.
$ docker exec -ti www
dd if=/dev/zero of=test.img bs=1024 count=0 seek=$[1024*100]
Ejja neżaminaw l-użu tal-ispazju tad-disk fuq il-host mill-ġdid. Se naraw li l-kontenitur (kontenituri) jokkupa 100 Megabytes hemmhekk.
$ 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 0B
Naħseb li l-moħħ kurżiv tiegħek diġà qed jistaqsi fejn jinsab il-fajl test.img tagħna. Ejja nfittxuha:
$ 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
Mingħajr ma nidħlu fid-dettalji, nistgħu ninnotaw li l-fajl test.img jinsab b'mod konvenjenti fil-livell tal-qari-kitba, ikkontrollat mis-sewwieq overlay2. Jekk nieqfu l-kontenitur tagħna, l-ospitant jgħidilna li dan l-ispazju jista’, fil-prinċipju, jiġi meħlus:
# 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 0B
Kif nistgħu nagħmlu dan? Billi tħassar il-kontenitur, li se jinvolvi l-ikklerjar tal-ispazju korrispondenti fil-livell tal-qari-kitba.
Bil-kmand li ġej, tista 'tneħħi l-kontenituri installati kollha f'daqqa waħda u tneħħi d-disk tiegħek mill-fajls kollha ta' read-write maħluqa minnhom:
$ 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.9MB
Għalhekk, aħna neħlesna 104,9 Megabytes billi ħassarna l-kontenitur. Iżda peress li m'għadniex nużaw l-immaġni li tniżżel qabel, din issir ukoll kandidat għat-tħassir u l-ħelsien tar-riżorsi tagħna:
$ 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 0B
Nota: Sakemm l-immaġni tkun qed tintuża minn mill-inqas kontenitur wieħed, ma tkunx tista' tuża dan it-trick.
Is-sottokmand tal-pruna li użajna hawn fuq għandu effett biss fuq kontenituri mwaqqfa. Jekk irridu nħassru mhux biss kontenituri waqfien iżda wkoll li qed jaħdmu, għandna nużaw wieħed minn dawn il-kmandi:
# Historical command
$ docker rm -f $(docker ps –aq)
# More recent command
$ docker container rm -f $(docker container ls -aq)
Noti tal-ġenb: jekk tuża l-parametru -rm meta tibda kontenitur, allura meta jieqaf, l-ispazju kollu tad-diska li okkupa se jinħeles.
Bl-użu ta 'stampi tad-disk
Ftit snin ilu, daqs ta' immaġini ta' diversi mijiet ta' megabytes kien kompletament normali: immaġni Ubuntu kienet tiżen 600 megabytes, u immaġni Microsoft .Net kienet tiżen diversi gigabytes. F'dawk il-ġranet shaggy, it-tniżżil ta 'immaġni waħda biss jista' jieħu piż kbir fuq l-ispazju tad-disk liberu tiegħek, anke jekk kont qed taqsam il-livelli bejn l-immaġini. Illum - tifħir lill-kbar - immaġini jiżnu ħafna inqas, iżda anke hekk, tista 'malajr timla r-riżorsi disponibbli jekk ma tieħux xi prekawzjonijiet.
Hemm diversi tipi ta' immaġini li mhumiex viżibbli direttament għall-utent aħħari:
- stampi intermedji, li fuq il-bażi tagħhom jinġabru immaġini oħra - ma jistgħux jitħassru jekk tuża kontenituri bbażati fuq dawn l-immaġini "oħra";
- immaġini dangling huma immaġini intermedji li mhumiex referenzjati mill-ebda wieħed mill-kontenituri running - jistgħu jitħassru.
- Bil-kmand li ġej tista 'tiċċekkja għal immaġini dangling fis-sistema tiegħek:
$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
none none 21e658fe5351 12 minutes ago 71.3MB
Tista' tneħħihom bil-mod li ġej:
$ docker image rm $(docker image ls -f dangling=true -q)
Nistgħu wkoll nużaw is-sottokmand 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.9kB
Jekk f'daqqa waħda rridu nħassru l-immaġini kollha għal kollox (u mhux biss dangling) bi kmand wieħed, allura nistgħu nagħmlu dan:
$ docker image rm $(docker image ls -q)
Użu tad-disk bil-volumi
Il-volumi jintużaw biex jaħżnu d-dejta barra s-sistema tal-fajls tal-kontenitur. Pereżempju, jekk irridu nsalvaw ir-riżultati ta 'applikazzjoni sabiex nużawhom b'xi mod ieħor. Eżempju komuni huwa databases.
Ejja nniedu kontenitur MongoDB, immuntaw volum estern għall-kontenitur, u nirrestawraw backup tad-database minnu (għandna disponibbli fil-fajl 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
--jsonArray
Id-dejta tkun tinsab fuq il-magna ospitanti fid-direttorju /var/lib/docker/volumes. Imma għaliex mhux fil-livell tal-qari-kitba tal-kontenitur? Minħabba li fid-Dockerfile tal-immaġni MongoDB, id-direttorju / data/db (fejn MongoDB jaħżen id-dejta tiegħu b'mod awtomatiku) huwa definit bħala volum.
Nota tal-ġenb: ħafna stampi li għandhom jipproduċu dejta jużaw volumi biex jaħżnu dik id-dejta.
Meta nilagħbu biżżejjed ma 'MongoDB u nwaqqfu (jew forsi anke nħassru) il-kontenitur, il-volum mhux se jitħassar. Se tkompli tieħu l-ispazju prezzjuż tad-diska tagħna sakemm inħassruh b'mod espliċitu bi kmand bħal dan:
$ docker volume rm $(docker volume ls -q)
Ukoll, jew nistgħu nużaw is-sottokmand tal-pruna li diġà huwa familjari għalina:
$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da
Total reclaimed space: 25.82GB
luc@saturn:~$
L-użu tad-disk għall-cache tal-bini tal-immaġni
F'Docker 18.09, il-proċess tal-ħolqien tal-immaġni għadda minn xi bidliet grazzi għall-għodda BuildKit. Din il-ħaġa żżid il-veloċità tal-proċess u tottimizza l-ħażna tad-data u l-ġestjoni tas-sigurtà. Hawnhekk mhux se nikkunsidraw id-dettalji kollha ta 'din l-għodda mill-isbaħ; se niffukaw biss fuq kif tindirizza kwistjonijiet ta' użu tal-ispazju tad-disk.
Ejja ngħidu li għandna applikazzjoni Node.Js kompletament sempliċi:
- il-fajl index.js jibda server HTTP sempliċi li jirrispondi b'linja għal kull talba riċevuta:
- il-fajl package.json jiddefinixxi d-dipendenzi, li expressjs minnhom biss jintuża biex iħaddem is-server 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"
}
}
Id-Dockerfile għall-bini tal-immaġni jidher bħal dan:
FROM node:13-alpine
COPY package.json /app/package.json
RUN cd /app && npm install
COPY . /app/
WORKDIR /app
EXPOSE 80
CMD ["npm", "start"]
Ejja nibnu l-immaġni bil-mod tas-soltu, mingħajr ma nużaw BuildKit:
$ docker build -t app:1.0 .
Jekk niċċekkjaw l-użu tal-ispazju tad-disk, nistgħu naraw li l-immaġni bażi (node:13-alpine) u l-immaġni tad-destinazzjoni (app:1.0) biss qed jieħdu spazju:
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 0B
Ejja nibnu t-tieni verżjoni tal-applikazzjoni tagħna, billi tuża BuildKit. Biex nagħmlu dan, irridu biss nissettjaw il-varjabbli DOCKER_BUILDKIT għal 1:
$ DOCKER_BUILDKIT=1 docker build -t app:2.0 .
Jekk issa niċċekkjaw l-użu tad-disk, se naraw li l-build cache (buid-cache) issa hija involuta hemmhekk:
$ 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.949kB
Biex tneħħiha, uża l-kmand li ġej:
$ 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.949kB
Żbarazza kollox!
Allura, ħares lejn it-tindif tal-ispazju tad-disk okkupat minn kontenituri, stampi u volumi. Is-sottokmand tal-pruna jgħinna f'dan. Iżda tista 'tintuża wkoll fil-livell tas-sistema docker, u se tnaddaf dak kollu li tista':
$ 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]
Jekk għal xi raġuni qed tiffranka spazju fuq id-diska fuq il-magna Docker tiegħek, allura t-tħaddim perjodiku ta 'dan il-kmand għandu jsir drawwa.
Sors: www.habr.com