Äau Habr! PiedÄvÄju jÅ«su uzmanÄ«bai raksta tulkojumu
Å odien mÄs runÄsim par to, kÄ Docker izmanto saimniekdatora diska vietu, kÄ arÄ« izdomÄsim, kÄ atbrÄ«vot Å”o vietu no neizmantoto attÄlu un konteineru lūžÅiem.
KopÄjais patÄriÅÅ”
Docker ir forÅ”a lieta, droÅ”i vien daži cilvÄki Å”odien par to Å”aubÄs. Tikai pirms dažiem gadiem Å”is produkts mums sniedza pilnÄ«gi jaunu veidu, kÄ veidot, piegÄdÄt un darbinÄt jebkuru vidi, ļaujot ievÄrojami ietaupÄ«t CPU un RAM resursus. Papildus tam (un dažiem tas bÅ«s vissvarÄ«gÄkais) Docker ir ļÄvis mums neticami vienkÄrÅ”ot un apvienot mÅ«su ražoÅ”anas vides dzÄ«ves cikla pÄrvaldÄ«bu.
TomÄr visiem Å”iem mÅ«sdienu dzÄ«ves priekiem ir sava cena. Kad mÄs darbinÄm konteinerus, lejupielÄdÄjam vai veidojam savus attÄlus un izvietojam sarežģītas ekosistÄmas, mums ir jÄmaksÄ. Un mÄs maksÄjam, cita starpÄ, ar vietu diskÄ.
Ja jÅ«s nekad neesat domÄjis par to, cik daudz vietas Docker patiesÄ«bÄ aizÅem jÅ«su datorÄ, jÅ«s varÄtu bÅ«t nepatÄ«kami pÄrsteigts par Ŕīs komandas izvadi:
$ docker system df
Tas parÄda Docker diska lietojumu dažÄdos kontekstos:
- attÄli ā kopÄjais attÄlu lielums, kas tika lejupielÄdÄti no attÄlu krÄtuvÄm un tika izveidoti jÅ«su sistÄmÄ;
- konteineri ā kopÄjais diska vietas apjoms, ko izmanto darbinÄmie konteineri (ar to saprotot visu konteineru kopÄjo lasÄ«Å”anas un rakstÄ«Å”anas slÄÅu apjomu);
- lokÄlie apjomi ā konteineriem piemontÄtÄs vietÄjÄs noliktavas apjoms;
- veidot keÅ”atmiÅu ā pagaidu faili, kas Ä£enerÄti attÄlu veidoÅ”anas procesÄ (izmantojot rÄ«ku BuildKit, kas pieejams sÄkot ar Docker versiju 18.09).
Varu derÄt, ka pÄc Ŕīs vienkÄrÅ”Äs pÄrsÅ«tÄ«Å”anas jÅ«s vÄlÄsities iztÄ«rÄ«t disku no atkritumiem un atdzÄ«vinÄt vÄrtÄ«gos gigabaitus (piezÄ«me: Ä«paÅ”i, ja par Å”iem gigabaitiem maksÄjat Ä«ri katru mÄnesi).
Diska izmantoŔana konteineros
Katru reizi, kad resursdatorÄ izveidojat konteineru, direktorijÄ /var/lib/docker tiek izveidoti vairÄki faili un direktoriji, starp kuriem ir vÄrts atzÄ«mÄt:
- Direktorijs /var/lib/docker/containers/container_ID ā izmantojot standarta reÄ£istrÄÅ”anas draiveri, notikumu žurnÄli tiek saglabÄti JSON formÄtÄ. PÄrÄk detalizÄti žurnÄli, kÄ arÄ« žurnÄli, kurus neviens nelasa vai citÄdi neapstrÄdÄ, bieži izraisa disku pilnÄ«bu.
- DirektorijÄ /var/lib/docker/overlay2 ir konteinera lasÄ«Å”anas un rakstÄ«Å”anas slÄÅi (overlay2 ir vÄlamais draiveris lielÄkajÄ daÄ¼Ä Linux izplatÄ«jumu). Ja konteiners saglabÄ datus savÄ failu sistÄmÄ, tad tas tiks ievietots Å”ajÄ direktorijÄ.
IedomÄsimies sistÄmu, kurÄ ir uzstÄdÄ«ts senatnÄ«gs Docker, kas nekad nav bijis iesaistÄ«ts konteineru palaiÅ”anÄ vai attÄlu veidoÅ”anÄ. TÄs diska vietas izmantoÅ”anas pÄrskats izskatÄ«sies Å”Ädi:
$ 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
PalaidÄ«sim kÄdu konteineru, piemÄram, NGINX:
$ docker container run --name www -d -p 8000:80 nginx:1.16
Kas notiek ar disku:
- attÄli aizÅem 126 MB, tas ir tas pats NGINX, ko mÄs palaižÄm konteinerÄ;
- konteineri aizÅem smieklÄ«gus 2 baitus.
$ 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
Spriežot pÄc secinÄjuma, mums vÄl nav vietas, ko mÄs varÄtu atbrÄ«vot. TÄ kÄ 2 baiti ir pilnÄ«gi vieglprÄtÄ«gi, iedomÄsimies, ka mÅ«su NGINX negaidÄ«ti ierakstÄ«ja kaut kur 100 megabaitus datu un izveidoja tieÅ”i Å”Äda izmÄra failu test.img sevÄ«.
$ docker exec -ti www
dd if=/dev/zero of=test.img bs=1024 count=0 seek=$[1024*100]
VÄlreiz pÄrbaudÄ«sim resursdatora diska vietas izmantoÅ”anu. MÄs redzÄsim, ka konteiners (konteineri) tur aizÅem 100 megabaitus.
$ 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
Es domÄju, ka jÅ«su zinÄtkÄrÄs smadzenes jau prÄto, kur atrodas mÅ«su test.img fails. MeklÄsim to:
$ 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
Neiedziļinoties detaļÄs, varam atzÄ«mÄt, ka fails test.img ir Ärti izvietots lasÄ«Å”anas-rakstÄ«Å”anas lÄ«menÄ«, ko kontrolÄ overlay2 draiveris. Ja mÄs apturÄsim savu konteineru, saimnieks mums pateiks, ka Å”o vietu principÄ var atbrÄ«vot:
# 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
KÄ mÄs to varam izdarÄ«t? DzÄÅ”ot konteineru, kas nozÄ«mÄs atbilstoÅ”Äs vietas notÄ«rÄ«Å”anu lasÄ«Å”anas un rakstÄ«Å”anas lÄ«menÄ«.
Izmantojot Å”o komandu, varat vienÄ rÄvienÄ noÅemt visus instalÄtos konteinerus un notÄ«rÄ«t disku no visiem to izveidotajiem lasÄ«Å”anas un rakstÄ«Å”anas failiem:
$ 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
TÄtad, izdzÄÅ”ot konteineru, mÄs atbrÄ«vojÄm 104,9 megabaitus. Bet, tÄ kÄ mÄs vairs neizmantojam iepriekÅ” lejupielÄdÄto attÄlu, tas arÄ« kļūst par kandidÄtu mÅ«su resursu dzÄÅ”anai un atbrÄ«voÅ”anai:
$ 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
PiezÄ«me. KamÄr attÄlu izmantos vismaz viens konteiners, jÅ«s nevarÄsit izmantot Å”o triku.
IepriekÅ” izmantotÄ plÅ«mju apakÅ”komanda ietekmÄ tikai apturÄtos konteinerus. Ja vÄlamies dzÄst ne tikai apturÄtos, bet arÄ« darbojoÅ”os konteinerus, mums vajadzÄtu izmantot kÄdu no Ŕīm komandÄm:
# Historical command
$ docker rm -f $(docker ps āaq)
# More recent command
$ docker container rm -f $(docker container ls -aq)
SÄnu piezÄ«mes: ja, startÄjot konteineru, izmantojat parametru -rm, tad, kad tas apstÄjas, tiks atbrÄ«vota visa tÄ aizÅemtÄ vieta diskÄ.
Diska attÄlu izmantoÅ”ana
Pirms dažiem gadiem vairÄku simtu megabaitu attÄla izmÄrs bija pilnÄ«gi normÄls: Ubuntu attÄls svÄra 600 megabaitus, bet Microsoft .Net attÄls svÄra vairÄkus gigabaitus. Å ajos pinkainajos laikos tikai viena attÄla lejupielÄde var ievÄrojami samazinÄt brÄ«vo vietu diskÄ, pat ja kopÄ«gojat lÄ«meÅus starp attÄliem. Å odien - lai slavÄts - attÄli sver daudz mazÄk, taÄu, neskatoties uz to, jÅ«s varat Ätri aizpildÄ«t pieejamos resursus, ja neveicat dažus piesardzÄ«bas pasÄkumus.
Ir vairÄki attÄlu veidi, kas nav tieÅ”i redzami gala lietotÄjam:
- starpattÄli, uz kuru pamata tiek vÄkti citi attÄli - tos nevar izdzÄst, ja izmantojat konteinerus, kuru pamatÄ ir Å”ie ācitiā attÄli;
- karÄjoÅ”ie attÄli ir starpattÄli, uz kuriem nav atsauces nevienÄ no esoÅ”ajiem konteineriem ā tos var izdzÄst.
- Izmantojot Å”o komandu, varat pÄrbaudÄ«t, vai sistÄmÄ nav karÄjoÅ”o attÄlu:
$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
none none 21e658fe5351 12 minutes ago 71.3MB
JÅ«s varat tos noÅemt Å”Ädi:
$ docker image rm $(docker image ls -f dangling=true -q)
Varam izmantot arī plūmju apakŔkomandu:
$ 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
Ja mÄs pÄkÅ”Åi vÄlamies dzÄst visus attÄlus kopÄ (un ne tikai karÄjoties) ar vienu komandu, mÄs varam darÄ«t Å”Ädi:
$ docker image rm $(docker image ls -q)
Diska lietojums pÄc apjomiem
SÄjumi tiek izmantoti datu glabÄÅ”anai Ärpus konteinera failu sistÄmas. PiemÄram, ja mÄs vÄlamies saglabÄt lietojumprogrammas rezultÄtus, lai tos izmantotu citÄ veidÄ. IzplatÄ«ts piemÄrs ir datu bÄzes.
PalaidÄ«sim MongoDB konteineru, pievienosim konteineram ÄrÄju sÄjumu un atjaunosim no tÄ datu bÄzes dublÄjumu (tas ir pieejams failÄ 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
Dati atradÄ«sies resursdatora direktorijÄ /var/lib/docker/volumes. Bet kÄpÄc ne konteinera lasÄ«Å”anas-rakstÄ«Å”anas lÄ«menÄ«? TÄ kÄ MongoDB attÄla Dockerfile direktorijs /data/db (kurÄ MongoDB pÄc noklusÄjuma saglabÄ savus datus) ir definÄts kÄ sÄjums.
SÄnu piezÄ«me: daudzi attÄli, kuriem jÄrada dati, izmanto apjomu, lai saglabÄtu Å”os datus.
Kad mÄs pietiekami spÄlÄjam ar MongoDB un apturÄsim (vai varbÅ«t pat izdzÄsÄ«sim) konteineru, sÄjums netiks izdzÄsts. Tas turpinÄs aizÅemt mÅ«su dÄrgo vietu diskÄ, lÄ«dz mÄs to skaidri izdzÄsÄ«sim ar Å”Ädu komandu:
$ docker volume rm $(docker volume ls -q)
Nu, vai arÄ« mÄs varam izmantot mums jau pazÄ«stamo plÅ«mju apakÅ”komandu:
$ 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:~$
Diska izmantoÅ”ana attÄlu veidoÅ”anas keÅ”atmiÅai
ProgrammÄ Docker 18.09 attÄla izveides procesÄ ir veiktas dažas izmaiÅas, pateicoties rÄ«kam BuildKit. Å Ä« lieta palielina procesa Ätrumu un optimizÄ datu glabÄÅ”anu un droŔības pÄrvaldÄ«bu. Å eit mÄs neapsvÄrsim visas Ŕī brÄ«niŔķīgÄ rÄ«ka detaļas; mÄs koncentrÄsimies tikai uz to, kÄ tas risina problÄmas ar diska vietas izmantoÅ”anu.
PieÅemsim, ka mums ir pavisam vienkÄrÅ”a Node.Js lietojumprogramma:
- fails index.js palaiž vienkÄrÅ”u HTTP serveri, kas atbild ar rindiÅu uz katru saÅemto pieprasÄ«jumu:
- fails package.json definÄ atkarÄ«bas, no kurÄm HTTP servera palaiÅ”anai tiek izmantots tikai expressjs:
$ 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"
}
}
Docker fails attÄla izveidei izskatÄs Å”Ädi:
FROM node:13-alpine
COPY package.json /app/package.json
RUN cd /app && npm install
COPY . /app/
WORKDIR /app
EXPOSE 80
CMD ["npm", "start"]
Veidosim attÄlu parastajÄ veidÄ, neizmantojot BuildKit:
$ docker build -t app:1.0 .
Ja pÄrbaudÄm diska vietas lietojumu, mÄs varam redzÄt, ka vietu aizÅem tikai pamata attÄls (node:13-alpine) un mÄrÄ·a attÄls (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 0B
Izveidosim otro mÅ«su lietojumprogrammas versiju, izmantojot BuildKit. Lai to izdarÄ«tu, mums vienkÄrÅ”i jÄiestata mainÄ«gais DOCKER_BUILDKIT uz 1:
$ DOCKER_BUILDKIT=1 docker build -t app:2.0 .
Ja mÄs tagad pÄrbaudÄ«sim diska lietojumu, mÄs redzÄsim, ka tagad tajÄ ir iesaistÄ«ta veidoÅ”anas keÅ”atmiÅa (buid-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.949kB
Lai to notīrītu, izmantojiet Ŕo komandu:
$ 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
Iztīrīt visu!
TÄtad, mÄs apskatÄ«jÄm konteineru, attÄlu un sÄjumu aizÅemtÄs diska vietas attÄ«rÄ«Å”anu. To mums palÄ«dz žÄvÄtu plÅ«mju apakÅ”komanda. TaÄu to var izmantot arÄ« doku sistÄmas lÄ«menÄ«, un tas attÄ«rÄ«s visu iespÄjamo:
$ 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]
Ja kÄda iemesla dÄļ ietaupa vietu diskÄ datorÄ, kurÄ darbojas Docker, tad periodiskai Ŕīs komandas palaiÅ”anai vajadzÄtu kļūt par ieradumu.
Avots: www.habr.com