Iingcebiso zeDocker: Coca umtshini wakho wenkunkuma

Iingcebiso zeDocker: Coca umtshini wakho wenkunkuma

Hayi Habr! Ndinikezela ingqalelo yakho inguqulelo yenqaku "Iingcebiso zeDocker: Coca umatshini wakho wasekhaya" umbhali Luc Juggery.

Namhlanje siza kuthetha malunga nendlela i-Docker esebenzisa ngayo i-disk space yomshini wokusingatha, kwaye siza kuphinda sibone indlela yokukhulula le ndawo kwi-scraps yemifanekiso engasetyenziswanga kunye nezikhongozeli.


Iingcebiso zeDocker: Coca umtshini wakho wenkunkuma

Ukusetyenziswa ngokupheleleyo

I-Docker yinto epholileyo, mhlawumbi bambalwa abantu abayithandabuzayo namhlanje. Kwiminyaka embalwa edlulileyo, le mveliso isinike indlela entsha ngokupheleleyo yokwakha, ukuhambisa kunye nokuqhuba nayiphi na indawo, okusivumela ukuba sigcine kakhulu i-CPU kunye nezixhobo ze-RAM. Ukongeza koku (kwaye kwabanye oku kuya kuba yeyona nto ibalulekileyo) UDocker usivumele ukuba senze lula ngendlela emangalisayo kwaye simanyanise ulawulo lomjikelo wobomi bendalo yethu yemveliso.

Noko ke, zonke ezi zinto zonwabileyo zobomi bale mihla ziza ngexabiso. Xa siqhuba izikhongozeli, sikhuphela okanye sizenzele eyethu imifanekiso, kwaye sisebenzisa i-ecosystem enzima, kufuneka sihlawule. Kwaye sihlawula, phakathi kwezinye izinto, ngendawo yediski.

Ukuba awuzange ucinge malunga nokuba singakanani na indawo iDocker eyithathayo kumatshini wakho, ungothuka ngokungathandekiyo sisiphumo salo myalelo:

$ docker system df

Iingcebiso zeDocker: Coca umtshini wakho wenkunkuma

Oku kubonisa ukusetyenziswa kwediski yeDocker kwiimeko ezahlukeneyo:

  • imifanekiso-ubungakanani bubonke bemifanekiso ekhutshelweyo esuka kugcino lwemifanekiso kwaye yakhiwe kwindlela yakho;
  • izikhongozeli – isixa sisonke sesithuba sedisk esisetyenziswa zizikhongozeli ezibalekayo (okuthetha ubungakanani bomthamo opheleleyo womaleko wokufunda-bhala wazo zonke izikhongozeli);
  • imiqulu yendawo - umthamo wogcino lwendawo olufakwe kwizikhongozeli;
  • ukwakha i-cache - iifayile zesikhashana eziveliswa yinkqubo yokwakha umfanekiso (usebenzisa isixhobo se-BuildKit, ekhoyo ngokuqala nge-Docker version 18.09).

Ndibheja ukuba emva kolu tshintsho olulula unomdla wokucoca idiski yakho yenkunkuma kwaye ubuyisele iigigabytes ezixabisekileyo ebomini (qaphela: ngakumbi ukuba uhlawula irenti kwezi gigabytes nyanga zonke).

Ukusetyenziswa kwediskhi ngezikhongozeli

Ngalo lonke ixesha usenza isikhongozeli kumatshini wokusingathwa, iifayile ezininzi kunye nolawulo lwenziwa kwi/var/lib/docker directory, phakathi kwayo oku kulandelayo kubalulekile ukuba uqaphele:

  • Uluhlu /var/lib/docker/containers/container_ID – xa usebenzisa umqhubi wokugawulwa kwemithi osemgangathweni, kulapho iilogi zesiganeko zigcinwa khona kwifomathi ye-JSON. Iilogi ezineenkcukacha kakhulu, kunye neelog ezingafundwanga mntu okanye ezinye iinkqubo, zihlala zibangela ukuba iidiski zigcwale.
  • I/var/lib/docker/overlay2 directory iqulathe isikhongozeli sokufunda-bhala umaleko (umaleko2 ngumqhubi okhethwayo kuninzi lonikezelo lweLinux). Ukuba isikhongozeli sigcina idatha kwinkqubo yayo yefayile, ke kukule ncwadana apho iya kubekwa khona.

Makhe sicinge ngenkqubo apho i-Pristine Docker ifakwe khona, engazange ibandakanyeke ekuqaliseni izitya okanye ukwakha imifanekiso. Ingxelo yokusetyenziswa kwendawo yediski iya kujongeka ngolu hlobo:

$ 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

Masiqalise isikhongozeli esithile, umzekelo, i-NGINX:

$ docker container run --name www -d -p 8000:80 nginx:1.16

Kwenzeka ntoni kwidiski:

  • imifanekiso ithatha i-126 MB, le yi-NGINX efanayo esiyisungule kwisitya;
  • izitya zithatha i-bytes ezihlekisayo ezi-2.

$ 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

Xa sijonga isiphelo, asikabi nandawo sinokuthi siyikhulule. Ekubeni i-2 bytes i-frivolous ngokupheleleyo, makhe sicinge ukuba i-NGINX yethu ibhale ngokungalindelekanga kwindawo ethile i-Megabytes ye-100 yedatha kwaye yenza uvavanyo lwefayile.

$ docker exec -ti www 
  dd if=/dev/zero of=test.img bs=1024 count=0 seek=$[1024*100]

Makhe sihlolisise ukusetyenziswa kwendawo yediski kumamkeli kwakhona. Siza kubona ukuba i-container (izikhongozeli) ithatha i-100 Megabytes apho.

$ 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

Ndicinga ukuba ingqondo yakho enomdla sele izibuza ukuba ifayile yethu yovavanyo.img ifumaneka phi. Masiyikhangele:

$ 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

Ngaphandle kokungena kwiinkcukacha, sinokuqaphela ukuba ifayile ye-test.img ifumaneka ngokufanelekileyo kwinqanaba lokufunda-ukubhala, elawulwa ngumqhubi we-overlay2. Ukuba simisa isikhongozeli sethu, umamkeli-zindwendwe uya kusixelela ukuba esi sithuba sinokuthi, ngokomgaqo, sikhululwe:

# 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

Sinokukwenza njani oku? Ngokucima isikhongozeli, okuya kubandakanya ukucoca indawo ehambelanayo kwinqanaba lokufunda-bhala.

Ngalo myalelo ulandelayo, ungasusa zonke izikhongozeli ezifakiweyo kwi-swoop enye kwaye ucime idiski yakho yazo zonke iifayile ezifundwayo ezidalwe ngabo:

$ 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

Ke, sikhulule i-104,9 Megabytes ngokucima isikhongozeli. Kodwa ekubeni singasawusebenzisi umfanekiso okhutshelwe ngaphambili, uphinda ube ngumgqatswa wokucima nokukhulula izixhobo zethu:

$ 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

Qaphela: Logama nje umfanekiso usasetyenziswa sisikhongozeli esinye, awuzukwazi ukusebenzisa obu buqhinga.

Umyalelo ongaphantsi weprune esiwusebenzisileyo ngasentla unempembelelo kwizikhongozeli ezimisiweyo. Ukuba sifuna ukucima hayi ukuyeka kuphela kodwa kunye nezikhongozeli eziqhubayo, kufuneka sisebenzise enye yale miyalelo:

# Historical command
$ docker rm -f $(docker ps –aq)

# More recent command
$ docker container rm -f $(docker container ls -aq)

Amanqaku ecala: ukuba usebenzisa i-rm parameter xa uqala isikhongozeli, ngoko xa siyeka, sonke isithuba sedisk ebesihleli siya kukhululwa.

Ukusebenzisa imifanekiso yedisk

Kwiminyaka embalwa edlulileyo, ubungakanani bomfanekiso wamakhulu aliqela emegabytes babuqhelekile ngokupheleleyo: umfanekiso we-Ubuntu ubunobunzima obungama-600 megabytes, kunye neMicrosoft .Net image inobunzima beegigabytes ezininzi. Ngezo ntsuku zine-shaggy, ukukhuphela umfanekiso omnye kunokuthatha irhafu enkulu kwindawo yakho yasimahla yedisk, nokuba ubunokwabelana ngamanqanaba phakathi kwemifanekiso. Namhlanje - ukudunyiswa koyena mkhulu - imifanekiso inobunzima obuncinci, kodwa nangona kunjalo, unokugcwalisa ngokukhawuleza izixhobo ezikhoyo ukuba awuthathi amanyathelo okhuseleko.

Kukho iintlobo ezininzi zemifanekiso engabonakali ngokuthe ngqo kumsebenzisi wokugqibela:

  • imifanekiso ephakathi, ngesiseko apho eminye imifanekiso iqokelelwa - ayinakususwa ukuba usebenzisa izitya ezisekelwe kule "minye imifanekiso";
  • imifanekiso ejingayo yimifanekiso ephakathi engabhekiselwanga kuyo nayiphi na imigqomo esebenzayo - inokususwa.
  • Ngomyalelo olandelayo ungajonga imifanekiso ejingayo kwindlela yakho:

$ docker image ls -f dangling=true
REPOSITORY  TAG      IMAGE ID         CREATED             SIZE
none      none   21e658fe5351     12 minutes ago      71.3MB

Ungazisusa ngale ndlela ilandelayo:

$ docker image rm $(docker image ls -f dangling=true -q)

Sinokusebenzisa i-prune subcommand:

$ 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

Ukuba ngequbuliso sifuna ukucima yonke imifanekiso ngokupheleleyo (kwaye hayi nje ukujinga) ngomyalelo omnye, ngoko singakwenza oku:

$ docker image rm $(docker image ls -q)

Ukusetyenziswa kwediski ngokwemiqulu

Imiqulu isetyenziselwa ukugcina idatha ngaphandle kwenkqubo yefayile yesikhongozeli. Umzekelo, ukuba sifuna ukugcina iziphumo zesicelo ukuze sizisebenzise ngenye indlela. Umzekelo oqhelekileyo ngoovimba beenkcukacha.

Masiqalise isikhongozeli se-MongoDB, sinyuse ivolumu ngaphandle kwisikhongozeli, kwaye sibuyisele ugcino lwedatha ukusuka kuyo (sinayo ifumaneka kwifayile ye-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

Idatha iya kufumaneka kumatshini wokusingatha kwi /var/lib/docker/volumes directory. Kodwa kutheni ungekho kumgangatho wokufunda-ukubhala wesikhongozeli? Ngenxa yokuba kwi-Dockerfile yomfanekiso we-MongoDB, i-data / db directory (apho i-MongoDB igcina idatha yayo ngokungagqibekanga) ichazwa njengomthamo.

Iingcebiso zeDocker: Coca umtshini wakho wenkunkuma

Inqaku elisecaleni: imifanekiso emininzi ekufuneka ivelise idatha isebenzisa umthamo wokugcina loo datha.

Xa sidlala ngokwaneleyo ngeMongoDB kwaye siyeke (okanye mhlawumbi sicime) isitya, ivolumu ayiyi kususwa. Iza kuqhubeka nokuthatha indawo yethu yedisk exabisekileyo side siyicime ngokucacileyo ngomyalelo onje:

$ docker volume rm $(docker volume ls -q)

Ewe, okanye sinokusebenzisa i-prune subcommand esele iqhelekile kuthi:

$ 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:~$

Ukusebenzisa idiski kwi-cache yokwakha umfanekiso

Kwi-Docker 18.09, inkqubo yokudala imifanekiso iye yatshintsha enkosi kwisixhobo se-BuildKit. Le nto inyusa isantya senkqubo kwaye ilungiselela ukugcinwa kwedatha kunye nolawulo lokhuseleko. Apha asizukuqwalasela zonke iinkcukacha zesi sixhobo simangalisayo; siya kugxila kuphela kwindlela esilungisa ngayo imiba yokusetyenziswa kwendawo kwidisk.

Masithi sinesicelo esilula ngokupheleleyo seNode.Js:

  • ifayile ye index.js iqala umncedisi we HTTP olula ophendula ngomgca kwisicelo ngasinye esifunyenweyo:
  • ifayile ye-package.json ichaza uxhomekeko, apho i-expressjs isetyenziswa kuphela ukuqhuba umncedisi we-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"
      }
    }

I-Dockerfile yokwakha umfanekiso ijongeka ngolu hlobo:

FROM node:13-alpine
COPY package.json /app/package.json
RUN cd /app && npm install
COPY . /app/
WORKDIR /app
EXPOSE 80
CMD ["npm", "start"]

Masiwakhe umfanekiso ngendlela eqhelekileyo, ngaphandle kokusebenzisa i-BuildKit:

$ docker build -t app:1.0 .

Ukuba sijonga ukusetyenziswa kwendawo yediski, sinokubona ukuba kuphela umfanekiso osisiseko (i-node: i-13-alpine) kunye nomfanekiso wendawo (usetyenziso: 1.0) othatha indawo:

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

Masakhe inguqulelo yesibini yesicelo sethu, sisebenzisa i-BuildKit. Ukwenza oku, sifuna nje ukuseta i-DOCKER_BUILDKIT eguquguqukayo ukuya ku-1:

$ DOCKER_BUILDKIT=1 docker build -t app:2.0 .

Ukuba ngoku sijonga ukusetyenziswa kwediski, siya kubona ukuba i-cache yokwakha (i-buid-cache) ngoku ibandakanyeka apho:

$ 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

Ukuyicoca, sebenzisa lo myalelo ulandelayo:

$ 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

Yicime yonke!

Ngoko, sijonge ukucoca indawo yedisk ehlala izikhongozeli, imifanekiso kunye nemiqulu. Umyalelo ongaphantsi wePrune uyasinceda kule nto. Kodwa inokusetyenziswa kwinqanaba lenkqubo ye-docker, kwaye iyakucoca yonke into enokuyenza:

$ 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]

Ukuba ngesizathu esithile ugcina isithuba sedisk kumatshini osebenza iDocker, ngoko uqhuba lo myalelo ngamaxesha athile kufuneka ube ngumkhwa.

umthombo: www.habr.com

Yongeza izimvo