Awgrymiadau Dociwr: Cliriwch eich peiriant o sothach

Awgrymiadau Dociwr: Cliriwch eich peiriant o sothach

Hei Habr! Cyflwynaf i'ch sylw gyfieithiad yr erthygl "Awgrymiadau Dociwr: Glanhau Eich Peiriant Lleol" awdur Luc Jwgr.

Heddiw, byddwn yn siarad am sut mae Docker yn defnyddio gofod disg y peiriant gwesteiwr, a byddwn hefyd yn darganfod sut i ryddhau'r gofod hwn o'r darnau o ddelweddau a chynwysyddion nas defnyddiwyd.


Awgrymiadau Dociwr: Cliriwch eich peiriant o sothach

Cyfanswm y defnydd

Mae Docker yn beth cŵl, mae'n debyg mai ychydig o bobl sy'n ei amau ​​heddiw. Ychydig flynyddoedd yn ôl, rhoddodd y cynnyrch hwn ffordd gwbl newydd i ni adeiladu, darparu a rhedeg unrhyw amgylchedd, gan ganiatáu inni arbed adnoddau CPU a RAM yn sylweddol. Yn ogystal â hyn (ac i rai dyma fydd y peth pwysicaf) mae Docker wedi caniatáu inni symleiddio ac uno rheolaeth cylch bywyd ein hamgylcheddau cynhyrchu yn rhyfeddol.

Fodd bynnag, mae pris i'w gael ar yr holl ddanteithion hyn o fywyd modern. Pan fyddwn yn rhedeg cynwysyddion, yn lawrlwytho neu'n creu ein delweddau ein hunain, ac yn defnyddio ecosystemau cymhleth, mae'n rhaid i ni dalu. Ac rydym yn talu, ymhlith pethau eraill, gyda gofod disg.

Os nad ydych erioed wedi meddwl faint o le y mae Docker yn ei gymryd ar eich peiriant, efallai y cewch eich synnu'n annymunol gan allbwn y gorchymyn hwn:

$ docker system df

Awgrymiadau Dociwr: Cliriwch eich peiriant o sothach

Mae hyn yn dangos defnydd disg Docker mewn gwahanol gyd-destunau:

  • delweddau – cyfanswm maint y delweddau a gafodd eu llwytho i lawr o storfeydd delweddau a'u hadeiladu ar eich system;
  • cynwysyddion - cyfanswm y gofod disg a ddefnyddir wrth redeg cynwysyddion (sy'n golygu cyfanswm cyfaint haenau darllen-ysgrifennu pob cynhwysydd);
  • cyfeintiau lleol - cyfaint y storfa leol sydd wedi'i osod ar gynwysyddion;
  • adeiladu storfa - ffeiliau dros dro a gynhyrchir gan y broses adeiladu delweddau (gan ddefnyddio'r offeryn BuildKit, sydd ar gael gan ddechrau gyda fersiwn Docker 18.09).

Rwy'n betio, ar ôl y trosglwyddiad syml hwn, eich bod yn awyddus i lanhau'ch disg o sbwriel a dod â gigabeit gwerthfawr yn ôl yn fyw (noder: yn enwedig os ydych chi'n talu rhent am y gigabeit hyn bob mis).

Defnydd disg gan gynwysyddion

Bob tro y byddwch chi'n creu cynhwysydd ar y peiriant gwesteiwr, mae nifer o ffeiliau a chyfeiriaduron yn cael eu creu yn y cyfeiriadur /var/lib/docker, ac mae'r canlynol yn werth eu nodi:

  • Cyfeiriadur /var/lib/docker/containers/container_ID – wrth ddefnyddio'r gyrrwr logio safonol, dyma lle mae logiau digwyddiad yn cael eu cadw yn fformat JSON. Mae logiau rhy fanwl, yn ogystal â logiau nad oes neb yn eu darllen neu eu prosesu fel arall, yn aml yn achosi disgiau i ddod yn llawn.
  • Mae'r cyfeiriadur /var/lib/docker/overlay2 yn cynnwys yr haenau darllen-ysgrifennu cynhwysydd (overlay2 yw'r gyrrwr a ffefrir yn y rhan fwyaf o ddosbarthiadau Linux). Os yw'r cynhwysydd yn storio data yn ei system ffeiliau, yna yn y cyfeiriadur hwn y bydd yn cael ei osod.

Gadewch i ni ddychmygu system y mae Dociwr newydd ei osod arni, nad yw erioed wedi bod yn gysylltiedig â lansio cynwysyddion nac adeiladu delweddau. Bydd ei adroddiad defnydd gofod disg yn edrych fel hyn:

$ 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

Gadewch i ni lansio rhywfaint o gynhwysydd, er enghraifft, NGINX:

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

Beth sy'n digwydd i'r ddisg:

  • mae delweddau'n meddiannu 126 MB, dyma'r un NGINX a lansiwyd gennym yn y cynhwysydd;
  • mae cynwysyddion yn cymryd 2 beit chwerthinllyd.

$ 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

A barnu wrth y casgliad, nid oes gennym eto unrhyw le y gallem ei ryddhau. Gan fod 2 beit yn gwbl wamal, gadewch i ni ddychmygu bod ein NGINX wedi ysgrifennu 100 Megabytes o ddata yn annisgwyl ac wedi creu test.img ffeil o'r union faint hwn y tu mewn iddo'i hun.

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

Gadewch i ni archwilio'r defnydd o ofod disg ar y gwesteiwr eto. Fe welwn fod y cynhwysydd (cynwysyddion) yn meddiannu 100 Megabeit yno.

$ 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

Rwy'n meddwl bod eich ymennydd chwilfrydig eisoes yn pendroni ble mae ein ffeil test.img wedi'i lleoli. Edrychwn amdano:

$ 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

Heb fynd i fanylion, gallwn nodi bod y ffeil test.img wedi'i lleoli'n gyfleus ar y lefel darllen-ysgrifennu, a reolir gan y gyrrwr overlay2. Os byddwn yn atal ein cynhwysydd, bydd y gwesteiwr yn dweud wrthym y gellir rhyddhau'r gofod hwn, mewn egwyddor:

# 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

Sut gallwn ni wneud hyn? Trwy ddileu'r cynhwysydd, a fydd yn golygu clirio'r gofod cyfatebol ar y lefel darllen-ysgrifennu.

Gyda'r gorchymyn canlynol, gallwch chi gael gwared ar yr holl gynwysyddion sydd wedi'u gosod mewn un swoop cwympo a chlirio'ch disg o'r holl ffeiliau darllen-ysgrifennu a grëwyd ganddyn nhw:

$ 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

Felly, fe wnaethom ryddhau 104,9 Megabytes trwy ddileu'r cynhwysydd. Ond gan nad ydym bellach yn defnyddio'r ddelwedd a lawrlwythwyd yn flaenorol, mae hefyd yn dod yn ymgeisydd ar gyfer dileu a rhyddhau ein hadnoddau:

$ 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

Nodyn: Cyn belled â bod y ddelwedd yn cael ei defnyddio gan o leiaf un cynhwysydd, ni fyddwch yn gallu defnyddio'r tric hwn.

Dim ond ar gynwysyddion sydd wedi'u stopio y mae'r is-orchymyn tocio a ddefnyddiwyd gennym uchod yn cael effaith. Os ydym am ddileu nid yn unig stopio ond hefyd rhedeg cynwysyddion, dylem ddefnyddio un o'r gorchmynion hyn:

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

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

Nodiadau ochr: os ydych chi'n defnyddio'r paramedr -rm wrth gychwyn cynhwysydd, yna pan fydd yn stopio, bydd yr holl ofod disg yr oedd yn ei feddiannu yn cael ei ryddhau.

Defnyddio delweddau disg

Ychydig flynyddoedd yn ôl, roedd maint delwedd o rai cannoedd o megabeit yn gwbl normal: roedd delwedd Ubuntu yn pwyso 600 megabeit, a delwedd Microsoft .Net yn pwyso sawl gigabeit. Yn y dyddiau sigledig hynny, gallai lawrlwytho un ddelwedd yn unig gymryd doll fawr ar eich lle disg rhad ac am ddim, hyd yn oed os oeddech chi'n rhannu lefelau rhwng delweddau. Heddiw - canmoliaeth i'r gwych - mae delweddau'n pwyso llawer llai, ond serch hynny, gallwch chi lenwi'r adnoddau sydd ar gael yn gyflym os na fyddwch chi'n cymryd rhai rhagofalon.

Mae yna sawl math o ddelweddau nad ydyn nhw'n uniongyrchol weladwy i'r defnyddiwr terfynol:

  • delweddau canolradd, y mae delweddau eraill yn cael eu casglu ar eu sail - ni ellir eu dileu os ydych yn defnyddio cynwysyddion yn seiliedig ar y delweddau “eraill” hyn;
  • delweddau canolradd yw delweddau hongian nad oes unrhyw un o'r cynwysyddion rhedeg yn cyfeirio atynt - gellir eu dileu.
  • Gyda'r gorchymyn canlynol gallwch wirio am ddelweddau hongian ar eich system:

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

Gallwch gael gwared arnynt yn y ffordd ganlynol:

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

Gallwn hefyd ddefnyddio'r is-orchymyn tocio:

$ 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

Os ydym yn sydyn am ddileu pob delwedd yn gyfan gwbl (ac nid dim ond hongian) gydag un gorchymyn, yna gallwn wneud hyn:

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

Defnydd disg yn ôl cyfeintiau

Defnyddir cyfeintiau i storio data y tu allan i system ffeiliau'r cynhwysydd. Er enghraifft, os ydym am arbed canlyniadau cais er mwyn eu defnyddio mewn rhyw ffordd arall. Enghraifft gyffredin yw cronfeydd data.

Gadewch i ni lansio cynhwysydd MongoDB, gosod cyfaint y tu allan i'r cynhwysydd, ac adfer cronfa ddata wrth gefn ohono (mae gennym ni ar gael yn y ffeil 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

Bydd y data wedi'i leoli ar y peiriant gwesteiwr yn y cyfeiriadur /var/lib/docker/volumes. Ond beth am ar lefel darllen-ysgrifennu'r cynhwysydd? Oherwydd yn y Dockerfile o ddelwedd MongoDB, diffinnir y cyfeiriadur / data / db (lle mae MongoDB yn storio ei ddata yn ddiofyn) fel cyfaint.

Awgrymiadau Dociwr: Cliriwch eich peiriant o sothach

Nodyn ochr: mae llawer o ddelweddau sy'n gorfod cynhyrchu data yn defnyddio cyfeintiau i storio'r data hwnnw.

Pan fyddwn yn chwarae digon gyda MongoDB ac yn stopio (neu efallai hyd yn oed ddileu) y cynhwysydd, ni fydd y gyfrol yn cael ei ddileu. Bydd yn parhau i gymryd ein lle disg gwerthfawr nes i ni ei ddileu yn benodol gyda gorchymyn fel hyn:

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

Wel, neu gallwn ddefnyddio'r is-orchymyn tocio sydd eisoes yn gyfarwydd i ni:

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

Defnyddio disg ar gyfer storfa adeiladu delweddau

Yn Docker 18.09, mae'r broses creu delweddau wedi cael rhai newidiadau diolch i'r offeryn BuildKit. Mae'r peth hwn yn cynyddu cyflymder y broses ac yn gwneud y gorau o storio data a rheoli diogelwch. Yma ni fyddwn yn ystyried holl fanylion yr offeryn gwych hwn; byddwn ond yn canolbwyntio ar sut mae'n mynd i'r afael â materion defnyddio gofod disg.

Gadewch i ni ddweud bod gennym ni gymhwysiad Node.Js cwbl syml:

  • mae'r ffeil index.js yn cychwyn gweinydd HTTP syml sy'n ymateb gyda llinell i bob cais a dderbynnir:
  • mae'r ffeil package.json yn diffinio'r dibyniaethau, a dim ond expressjs a ddefnyddir i redeg y gweinydd 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"
      }
    }

Mae'r Dockerfile ar gyfer adeiladu'r ddelwedd yn edrych fel hyn:

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

Gadewch i ni adeiladu'r ddelwedd yn y ffordd arferol, heb ddefnyddio BuildKit:

$ docker build -t app:1.0 .

Os byddwn yn gwirio'r defnydd o ofod disg, gallwn weld mai dim ond y ddelwedd sylfaenol (nod: 13-alpaidd) a'r ddelwedd cyrchfan (app: 1.0) sy'n cymryd lle:

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

Gadewch i ni adeiladu ail fersiwn ein cais, gan ddefnyddio BuildKit. I wneud hyn, does ond angen i ni osod y newidyn DOCKER_BUILDKIT i 1:

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

Os byddwn nawr yn gwirio'r defnydd o ddisg, fe welwn fod y storfa adeiladu (buid-cache) bellach yn gysylltiedig yno:

$ 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

I'w glirio, defnyddiwch y gorchymyn canlynol:

$ 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

Cliriwch y cyfan!

Felly, buom yn edrych ar lanhau gofod disg a feddiannwyd gan gynwysyddion, delweddau a chyfeintiau. Mae'r is-orchymyn tocio yn ein helpu gyda hyn. Ond gellir ei ddefnyddio hefyd ar lefel y system docwr, a bydd yn glanhau popeth y gall:

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

Os ydych chi'n arbed lle disg ar eich peiriant Docker am ryw reswm, yna dylai rhedeg y gorchymyn hwn ddod yn arferiad o bryd i'w gilydd.

Ffynhonnell: hab.com

Ychwanegu sylw