Serişteyên Docker: Makîneya xwe ji qirêjê paqij bikin

Serişteyên Docker: Makîneya xwe ji qirêjê paqij bikin

Hey Habr! Wergera gotarê pêşkêşî we dikim "Serişteyên Docker: Makîneya xweya Herêmî Paqij bikin" nivîskar Luc Juggery.

Îro em ê bipeyivin ka Docker çawa cîhê dîskê ya makîneya mêvandar bikar tîne, û em ê jî fêr bibin ka meriv çawa vê cîhê ji bermayên wêne û konteynerên nekarandî azad dike.


Serişteyên Docker: Makîneya xwe ji qirêjê paqij bikin

Bi tevahî vexwarin

Docker tiştek xweş e, belkî kêm kes îro jê guman dikin. Tenê çend sal berê, vê hilberê rêyek bi tevahî nû da me ku em her hawîrdorek ava bikin, radest bikin û bimeşînin, ku rê dide me ku em bi girîngî çavkaniyên CPU û RAM-ê xilas bikin. Digel vê yekê (û ji bo hin kesan ev ê bibe ya herî girîng) Docker destûr da me ku em rêveberiya çerxa jiyanê ya hawîrdorên hilberîna xwe pir hêsan hêsan û yek bikin.

Lêbelê, van hemî dilşadiyên jiyana nûjen bi bihayek têne. Dema ku em konteyneran dimeşînin, wêneyên xwe dakêşin an diafirînin, û ekosîstemên tevlihev bicîh dikin, divê em bidin. Û em di nav tiştên din de, bi cîhê dîskê didin.

Ger we çu carî nefikirîye ka Docker bi rastî çiqas cîhê li ser makîneya we digire, dibe ku hûn ji derketina vê fermanê ecêb şaş bimînin:

$ docker system df

Serişteyên Docker: Makîneya xwe ji qirêjê paqij bikin

Ev karanîna dîska Docker-ê di çarçoveyek cûda de destnîşan dike:

  • wêne - mezinahiya giştî ya wêneyên ku ji depoyên wêneyan hatine daxistin û li ser pergala we hatine çêkirin;
  • konteynir - giştiya cîhê dîskê ku ji hêla konteynerên xebitandinê ve tê bikar anîn (tê vê wateyê ku hêjmara giştî ya qatên xwendin-nivîsandinê yên hemî konteyneran);
  • cildên herêmî - qebareya depoya herêmî ya ku li konteyneran hatî hilanîn;
  • cache ava bike - pelên demkî yên ku ji hêla pêvajoya avakirina wêneyê ve têne çêkirin (bi karanîna amûra BuildKit, ku bi guhertoya Docker 18.09-ê dest pê dike peyda dibe).

Ez bet dikim ku piştî vê veguheztina sade hûn bi hewes in ku hûn dîska xwe ji çopê paqij bikin û gigabytên hêja vegerînin jiyanê (têbînî: bi taybetî heke hûn her meh kirêya van gigabaytan bidin).

Bikaranîna dîskê ji hêla konteyneran ve

Her gava ku hûn li ser makîneya mêvandar konteynerek diafirînin, çend pel û peldank di pelrêça /var/lib/docker de têne afirandin, di nav wan de yên jêrîn hêjayî balê ne:

  • Navnîşan /var/lib/docker/containers/container_ID - dema ku ajokera têketinê ya standard bikar tîne, li vir têketinên bûyerê di formata JSON de têne tomar kirin. Têketinên pir hûrgulî, û her weha têketinên ku kes naxwîne an wekî din pêvajo nake, bi gelemperî dibe sedem ku dîskên tijî bibin.
  • Peldanka /var/lib/docker/overlay2 qatên xwendin-nivîsandinê yên konteynerê dihewîne (overlay2 di piraniya belavkirinên Linux de ajokara bijarte ye). Ger konteynir daneyan di pergala pelê xwe de hilîne, wê hingê ew ê di vê pelrêçayê de were danîn.

Werin em pergalek ku li ser Dockerek bêkêmasî tê saz kirin, ku tu carî beşdarî destpêkirina konteyneran an çêkirina wêneyan nebûye, bifikirin. Rapora karanîna cîhê dîska wê bi vî rengî xuya dike:

$ 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

Ka em hin konteynir bidin destpêkirin, mînakî, NGINX:

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

Çi diqewime li ser dîskê:

  • wêne 126 MB dagir dikin, ev heman NGINX e ku me di konteynerê de da destpêkirin;
  • konteynir 2 baytên bêaqil digirin.

$ 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

Li gorî encamnameyê, hêj cîhek me tune ku em azad bikin. Ji ber ku 2 byte bi tevahî bêaqil e, em bifikirin ku NGINX-a me ji nişka ve li deverek 100 Megabytes dane nivîsandin û pelek test.img ya tam bi vê mezinahiyê di hundurê xwe de çêkir.

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

Ka em dîsa karanîna cîhê dîskê li ser mêvandar lêkolîn bikin. Em ê bibînin ku konteynir li wir 100 Megabyte digire.

$ 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

Ez difikirim ku mêjiyê weya lêpirsîn jixwe meraq dike ku pelê me test.img li ku ye. Ka em lê bigerin:

$ 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

Bêyî ku em biçin nav hûrguliyan, em dikarin bala xwe bidin ku pelê test.img bi hêsanî di asta xwendin-nivîsandinê de ye, ku ji hêla ajokera overlay2 ve tê kontrol kirin. Ger em konteynera xwe rawestînin, mêvandar dê ji me re bêje ku ev cîh, di prensîbê de, dikare were azad kirin:

# 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

Em çawa dikarin vê yekê bikin? Bi jêbirina konteynerê, ku dê bibe sedema paqijkirina cîhê têkildar di asta xwendin-nivîsandinê de.

Bi fermana jêrîn, hûn dikarin hemî konteynerên sazkirî bi yek gavê rakin û dîska xwe ji hemî pelên xwendin-nivîsandinê yên ku ji hêla wan ve hatine afirandin paqij bikin:

$ 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

Ji ber vê yekê, me bi jêbirina konteynerê 104,9 Megabytes azad kir. Lê ji ber ku em êdî wêneya berê dakêşandî bikar naynin, ew jî dibe berendamek jêbirin û azadkirina çavkaniyên me:

$ 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

Nîşe: Heya ku wêne bi kêmanî yek konteynir tê bikar anîn, hûn ê nikaribin vê hîleyê bikar bînin.

Binfermandariya prune ya ku me li jor bikar anî tenê bandorek li ser konteynerên rawestandî dike. Ger em dixwazin ne tenê konteynerên rawestandî, lê di heman demê de konteynerên xebitandinê jî jêbirin, divê em yek ji van fermanan bikar bînin:

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

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

Nîşanên alî: heke hûn gava ku konteynir dest pê dike parametreya -rm bikar bînin, wê hingê gava ku ew raweste, dê hemî cîhê dîskê ku ew dagir kiriye azad bibe.

Bikaranîna wêneyên dîskê

Çend sal berê, mezinahiya wêneyê çend sed megabayt bi tevahî normal bû: Wêneyek Ubuntu 600 megabyte, û wêneyek Microsoft .Net çend gigabayt giran bû. Di wan rojên şil de, dakêşana tenê yek wêneyê dikare zirarek mezin li cîhê dîska weya belaş bigire, hetta ku we astê di navbera wêneyan de parve dikir. Îro - pesnê mezinan be - giraniya wêneyan pir kêmtir e, lê tewra jî, heke hûn hin tedbîran negirin hûn dikarin zû çavkaniyên berdest tijî bikin.

Gelek celeb wêne hene ku rasterast ji bikarhênerê dawî re nayên dîtin:

  • wêneyên navîn, ku li ser bingeha wan wêneyên din têne berhev kirin - heke hûn konteyneran li ser bingeha van wêneyên "din" bikar bînin, ew nikarin jêbirin;
  • Wêneyên daleqandî wêneyên navîn in ku ji hêla yek ji konteynerên xebitandinê ve nayên referans kirin - ew dikarin werin jêbirin.
  • Bi fermana jêrîn hûn dikarin li ser pergala xwe wêneyên dakêşandî kontrol bikin:

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

Hûn dikarin wan bi awayên jêrîn jêbirin:

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

Em dikarin jêrfermandariya prune jî bikar bînin:

$ 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

Ger em ji nişka ve dixwazin bi yek fermanê hemî wêneyan bi tevahî jêbirin (û ne tenê daleqandî), wê hingê em dikarin wiya bikin:

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

Bikaranîna dîskê ji hêla cildan ve

Volume ji bo hilanîna daneyan li derveyî pergala pelê ya konteynerê têne bikar anîn. Mînakî, heke em dixwazin encamên serîlêdanek hilînin da ku wan bi rengek din bikar bînin. Mînakek hevpar databases e.

Werin em konteynirek MongoDB bidin destpêkirin, cildek ji derveyî konteynerê siwar bikin, û paşvekêşana databasê jê vegerînin (me ew di pelê bck.json de heye):

# 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

Daneyên dê li ser makîneya mêvandar di pelrêça /var/lib/docker/volumes de cih bigirin. Lê çima ne di asta xwendin-nivîsandinê ya konteynerê de? Ji ber ku di Dockerfile ya wêneya MongoDB de, pelrêça / data/db (ku MongoDB daneyên xwe bi xwerû hildide) wekî cildek tê destnîşan kirin.

Serişteyên Docker: Makîneya xwe ji qirêjê paqij bikin

Nîşe: Gelek wêneyên ku divê daneyan hilberînin, cildan bikar tînin da ku wan daneyan hilînin.

Gava ku em bi MongoDB-ê têra xwe bilîzin û konteynerê rawestînin (an jî dibe ku jêbirin), deng dê neyê jêbirin. Ew ê berdewam bike ku cîhê dîska meya hêja bigire heya ku em bi fermanek weha bi eşkere jêbirin:

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

Welê, an jî em dikarin jêrfermana prune ya ku jixwe ji me re nas e bikar bînin:

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

Bikaranîna dîskê ji bo cache avakirina wêneyê

Di Docker 18.09 de, pêvajoya çêkirina wêneyê bi saya amûra BuildKit hin guhertin derbas bûye. Ev tişt leza pêvajoyê zêde dike û hilanîna daneyê û rêveberiya ewlehiyê xweştir dike. Li vir em ê hemî hûrguliyên vê amûra ecêb nehesibînin; em ê tenê li ser mijarên karanîna cîhê dîskê çawa bisekine.

Ka em bêjin me serîlêdanek Node.Js bi tevahî hêsan heye:

  • pelê index.js serverek HTTP-ya hêsan dest pê dike ku bi rêzek bersivê dide her daxwazek hatî wergirtin:
  • pelê package.json pêwendiyan diyar dike, ji wan tenê expressjs ji bo xebitandina servera HTTP tê bikar anîn:

$ 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 ji bo avakirina wêneyê wiha xuya dike:

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

Werin em wêneyê bi awayê asayî ava bikin, bêyî ku BuildKit bikar bînin:

$ docker build -t app:1.0 .

Ger em karanîna cîhê dîskê kontrol bikin, em dikarin bibînin ku tenê wêneya bingehîn (node:13-alpine) û wêneya armanc (app:1.0) cîh digirin:

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

Werin em guhertoya duyemîn a serlêdana xwe, bi karanîna BuildKit ava bikin. Ji bo vê yekê, em tenê hewce ne ku guhêrbara DOCKER_BUILDKIT li 1-ê saz bikin:

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

Ger em nuha karanîna dîskê kontrol bikin, em ê bibînin ku cache-ya avakirinê (buid-cache) niha li wir tê de ye:

$ 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

Ji bo paqijkirina wê, emrê jêrîn bikar bînin:

$ 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

Hemî paqij bike!

Ji ber vê yekê, me li paqijkirina cîhê dîskê ya ku ji hêla konteynir, wêne û cildan ve hatî dagir kirin nihêrî. Binfermandariya prune bi vê yekê alîkariya me dike. Lê ew dikare di asta pergala docker de jî were bikar anîn, û ew ê her tiştê ku dikare paqij bike:

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

Ger ji ber hin sedeman hûn cîhê dîskê li ser makîneya xweya Docker hilînin, wê hingê pêdivî ye ku bi domdarî vê fermanê bibe adet.

Source: www.habr.com

Add a comment