Amathiphu we-Docker: Sula umshini wakho odongeni

Amathiphu we-Docker: Sula umshini wakho odongeni

Sawubona, Habr! Ngethula ekunakeni kwakho ukuhunyushwa kwalesi sihloko "Amathiphu e-Docker: Hlanza Umshini Wakho Wasendaweni" umbhali Luc Juggery.

Namuhla sizokhuluma ngokuthi i-Docker isebenzisa kanjani isikhala sediski somshini wokusingathwa, futhi sizobona ukuthi singasikhulula kanjani lesi sikhala ezithombeni ezingasetshenziswanga neziqukathi.


Amathiphu we-Docker: Sula umshini wakho odongeni

Ukusetshenziswa okuphelele

I-Docker yinto epholile, mhlawumbe bambalwa abantu abangabazayo namuhla. Eminyakeni embalwa edlule, lo mkhiqizo usinike indlela entsha ngokuphelele yokwakha, ukuletha nokusebenzisa noma iyiphi indawo, okusivumela ukuthi songe ngokuphawulekayo izinsiza ze-CPU ne-RAM. Ngaphezu kwalokhu (futhi kwabanye lokhu kuzoba into ebaluleke kakhulu) I-Docker isivumele ukuthi senze lula ngendlela emangalisayo futhi sihlanganise ukuphathwa komjikelezo wempilo wezindawo zethu zokukhiqiza.

Nokho, zonke lezi zinto ezijabulisayo zokuphila zanamuhla ziza ngentengo. Uma sisebenzisa iziqukathi, sidawuniloda noma sakha ezethu izithombe, futhi sisebenzisa ama-ecosystem ayinkimbinkimbi, kufanele sikhokhe. Futhi sikhokha, phakathi kwezinye izinto, ngesikhala sediski.

Uma ungakaze ucabange ukuthi singakanani isikhala i-Docker esithatha emshinini wakho, ungase umangale ngokuphuma kwalo myalo:

$ docker system df

Amathiphu we-Docker: Sula umshini wakho odongeni

Lokhu kukhombisa ukusetshenziswa kwediski ye-Docker ezimeni ezahlukahlukene:

  • izithombe - isamba sikasayizi wezithombe ezilandiwe kumakhosombe ezithombe futhi zakhiwa ohlelweni lwakho;
  • iziqukathi - inani eliphelele lesikhala sediski elisetshenziswa iziqukathi ezigijima (okusho isamba sevolumu yezendlalelo zokufunda bhala zazo zonke iziqukathi);
  • umthamo wendawo - umthamo wesitoreji sendawo ofakwe ezitsheni;
  • ukwakha i-cache - amafayela esikhashana akhiqizwe inqubo yokwakha isithombe (usebenzisa ithuluzi le-BuildKit, elitholakalayo eliqala nge-Docker version 18.09).

Ngibheja ukuthi ngemva kwalokhu kudluliselwa okulula uzimisele ukuhlanza idiski yakho kadoti futhi ubuyisele amagigabhayithi ayigugu ekuphileni (inothi: ikakhulukazi uma ukhokha irenti kulawa magigabhayithi njalo ngenyanga).

Ukusetshenziswa kwediski ngeziqukathi

Ngaso sonke isikhathi lapho udala isiqukathi emshinini wokusingathwa, amafayela nezinkomba ezimbalwa ziyakhiwa kuhla lwemibhalo /var/lib/docker, phakathi kwalo okulandelayo okufanele ukunakwe:

  • Uhla lwemibhalo /var/lib/docker/containers/container_ID – uma usebenzisa umshayeli wokugawula ojwayelekile, kulapho amalogi omcimbi agcinwa khona ngefomethi ye-JSON. Amalogi anemininingwane eminingi, kanye namalogi angazange afundwe muntu noma acutshungulwe, ngokuvamile abangela ukuthi amadiski agcwale.
  • Uhlu lwemibhalo /var/lib/docker/overlay2 luqukethe izendlalelo zokubhala-bhala kwesiqukathi (imbondela2 ingumshayeli okhethwayo ekusatshalalisweni okuningi kwe-Linux). Uma isiqukathi sigcina idatha ohlelweni lwaso lwefayela, kuzobekwa kulolu hlu lwemibhalo.

Ake sicabange ngohlelo okufakwa kulo i-Pristine Docker, engakaze ibambe iqhaza ekwethuleni iziqukathi noma ukwakha izithombe. Umbiko wayo wokusetshenziswa kwesikhala sediski uzobukeka kanje:

$ 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

Ake sethule isiqukathi esithile, isibonelo, i-NGINX:

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

Kwenzekani kudiski:

  • izithombe zithatha i-126 MB, lena yi-NGINX efanayo esiyethule esitsheni;
  • iziqukathi zithatha amabhayithi angu-2 ahlekisayo.

$ 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

Uma sibheka isiphetho, asikabi naso isikhala esingasikhulula. Njengoba i-2 byte ingenangqondo ngokuphelele, ake sicabange ukuthi i-NGINX yethu ibhale ngokungalindelekile endaweni ethile ye-100 Megabytes yedatha futhi yakha i-test.img yefayela ncamashi lobu bukhulu ngaphakathi kwayo.

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

Ake sihlole ukusetshenziswa kwesikhala sediski kumsingathi futhi. Sizobona ukuthi isiqukathi (iziqukathi) sithatha amaMegabyte ayi-100 lapho.

$ 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

Ngicabanga ukuthi ubuchopho bakho obufuna ukwazi kakade sebuyazibuza ukuthi ifayela lethu le-test.img likuphi. Masiyibheke:

$ 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 emininingwaneni, singaqaphela ukuthi ifayela le-test.img litholakala kalula ezingeni lokufunda-bhala, lilawulwa umshayeli we-overlay2. Uma simisa isiqukathi sethu, umsingathi uzositshela ukuthi lesi sikhala, empeleni, singakhululwa:

# 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

Singakwenza kanjani lokhu? Ngokususa isiqukathi, okuzohlanganisa ukusula isikhala esihambisanayo ezingeni lokufunda nokubhala.

Ngomyalo olandelayo, ungasusa zonke iziqukathi ezifakiwe ngokuqubuka okukodwa futhi usule idiski yakho kuwo wonke amafayela okufunda-bhala adalwe yiwo:

$ 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

Ngakho-ke, sikhulule amaMegabhayithi angu-104,9 ngokususa isiqukathi. Kodwa njengoba singasasisebenzisi isithombe esilandiwe ngaphambilini, siphinde sibe ikhandidethi lokususa nokukhulula izinsiza 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: Uma nje isithombe sisasetshenziswa okungenani isiqukathi esisodwa, ngeke ukwazi ukusebenzisa leli qhinga.

Umyalo omncane wokuthena esiwusebenzise ngenhla unomthelela kuphela ezitsheni ezimile. Uma sifuna ukususa hhayi kuphela ukumiswa kodwa neziqukathi ezisebenzayo, kufanele sisebenzise owodwa wale miyalo:

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

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

Amanothi aseceleni: uma usebenzisa ipharamitha ye-rm lapho uqala isitsha, lapho-ke ima, sonke isikhala sediski ebesikuthathile sizokhululwa.

Ukusebenzisa izithombe zediski

Eminyakeni embalwa edlule, usayizi wesithombe wamamegabhayithi angamakhulu amaningana wawuvamile ngokuphelele: isithombe se-Ubuntu sasinesisindo samamegabhayithi angu-600, futhi isithombe se-Microsoft .Net sasikala amagigabhayithi amaningana. Kulezo zinsuku ezimbi, ukulanda isithombe esisodwa nje kungathatha umonakalo omkhulu esikhaleni sakho samahhala sediski, noma ngabe wabelana ngamaleveli phakathi kwezithombe. Namuhla - udumo malube kwabakhulu - izithombe zinesisindo esincane kakhulu, kodwa noma kunjalo, ungakwazi ukugcwalisa ngokushesha izinsiza ezikhona uma ungathathi izinyathelo zokuphepha.

Kunezinhlobo ezimbalwa zezithombe ezingabonakali ngokuqondile kumsebenzisi wokugcina:

  • izithombe eziphakathi, ngesisekelo sokuthi ezinye izithombe ziqoqwa - azikwazi ukususwa uma usebenzisa iziqukathi ngokusekelwe kulezi zithombe "ezinye";
  • izithombe ezilengayo ziyizithombe eziphakathi nendawo ezingabaluliwe yinoma yiziphi iziqukathi ezisebenzayo - zingasuswa.
  • Ngomyalo olandelayo ungabheka izithombe ezilengayo ohlelweni lwakho:

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

Ungawasusa ngale ndlela elandelayo:

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

Singasebenzisa futhi 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

Uma ngokuzumayo sifuna ukususa zonke izithombe ngokuphelele (hhayi nje ukulenga) ngomyalo owodwa, khona-ke singakwenza lokhu:

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

Ukusetshenziswa kwediski ngamavolumu

Amavolumu asetshenziselwa ukugcina idatha ngaphandle kwesistimu yefayela lesiqukathi. Isibonelo, uma sifuna ukulondoloza imiphumela yohlelo lokusebenza ukuze siyisebenzise ngenye indlela. Isibonelo esivamile isizindalwazi.

Masiqalise isiqukathi se-MongoDB, sikhweze ivolumu ngaphandle kwesiqukathi, futhi sibuyisele isipele sesizindalwazi esivela kuso (sinakho kutholakala kufayela le-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 izotholakala kumshini wokusingatha kuhla lwemibhalo /var/lib/docker/volumes. Kodwa kungani ungekho ezingeni lokufunda nokubhala lesiqukathi? Ngoba ku-Dockerfile yesithombe se-MongoDB, inkomba ye-/data/db (lapho i-MongoDB igcina khona idatha yayo ngokuzenzakalelayo) ichazwa njengevolumu.

Amathiphu we-Docker: Sula umshini wakho odongeni

Inothi eseceleni: izithombe eziningi okufanele zikhiqize idatha zisebenzisa amavolumu ukugcina leyo datha.

Uma sidlala ngokwanele nge-MongoDB futhi simisa (noma mhlawumbe sisuse) isitsha, ivolumu ngeke isuswe. Izoqhubeka ithatha isikhala sethu sediski esiyigugu kuze kube yilapho sisisusa ngokucacile ngomyalo ofana nalo:

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

Hhayi-ke, noma singasebenzisa i-prune subcommand esesivele siyijwayele:

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

Kusetshenziswa idiski ukwenza inqolobane yokwakha isithombe

Ku-Docker 18.09, inqubo yokudala izithombe ibe nezinguquko ezithile ngenxa yethuluzi le-BuildKit. Le nto inyusa isivinini senqubo futhi ilungiselela ukugcinwa kwedatha nokuphathwa kokuphepha. Lapha ngeke sicabangele yonke imininingwane yaleli thuluzi elihle, sizogxila kuphela ekutheni lizisingatha kanjani izinkinga zokusetshenziswa kwesikhala sediski.

Ake sithi sinesicelo esilula ngokuphelele se-Node.Js:

  • ifayela le-index.js liqala iseva ye-HTTP elula ephendula ngomugqa esicelweni ngasinye esitholiwe:
  • ifayela le-package.json lichaza ukuncika, okuyi-expressjs kuphela esetshenziselwa ukuqalisa iseva ye-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 isithombe ibonakala kanje:

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

Ake sakhe isithombe ngendlela evamile, ngaphandle kokusebenzisa i-BuildKit:

$ docker build -t app:1.0 .

Uma sihlola ukusetshenziswa kwesikhala sediski, singabona ukuthi kuphela isithombe esiyisisekelo (i-node:13-alpine) kanye nesithombe esiqondiwe (uhlelo lokusebenza:1.0) okuthatha isikhala:

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

Ake sakhe inguqulo yesibili yohlelo lwethu lokusebenza, sisebenzisa i-BuildKit. Ukuze senze lokhu, sidinga nje ukusetha okuguquguqukayo kwe-DOCKER_BUILDKIT ku-1:

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

Uma manje sibheka ukusetshenziswa kwediski, sizobona ukuthi i-cache yokwakha (i-buid-cache) manje ihileleke lapho:

$ 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

Ukuze uyisule, sebenzisa umyalo olandelayo:

$ 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

Sula konke!

Ngakho-ke, sibheke ukuhlanza isikhala sediski esithathwe iziqukathi, izithombe namavolumu. Umyalo omncane we-prune uyasisiza ngalokhu. Kodwa futhi ingasetshenziswa ezingeni lesistimu ye-docker, futhi izohlanza konke engakwenza:

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

Uma ngesizathu esithile usindisa isikhala sediski emshinini osebenzisa i-Docker, ukusebenzisa lo myalo ngezikhathi ezithile kufanele kube umkhuba.

Source: www.habr.com

Engeza amazwana