Docker Konsèy: Efase machin ou a nan tenten

Docker Konsèy: Efase machin ou a nan tenten

Hey Habr! Mwen prezante nan atansyon ou tradiksyon an nan atik la "Konsèy Docker: Netwaye machin lokal ou a" otè a Luc Juggery.

Jodi a nou pral pale sou fason Docker sèvi ak espas ki gen kapasite nan machin lame a, epi nou pral tou konnen ki jan yo libere espas sa a soti nan bouyon yo nan imaj ki pa itilize yo ak resipyan yo.


Docker Konsèy: Efase machin ou a nan tenten

Konsomasyon total

Docker se yon bagay fre, pwobableman kèk moun gen dout jodi a. Jis kèk ane de sa, pwodui sa a te ban nou yon fason konplètman nouvo yo bati, delivre ak kouri nenpòt anviwònman, ki pèmèt nou siyifikativman sove CPU ak resous RAM. Anplis de sa a (ak pou kèk sa a pral bagay ki pi enpòtan) Docker te pèmèt nou ekstrèmman senplifye ak inifye jesyon sik lavi nan anviwònman pwodiksyon nou an.

Sepandan, tout plezi sa yo nan lavi modèn vini nan yon pri. Lè nou kouri kontenè, telechaje oswa kreye pwòp imaj nou, epi deplwaye ekosistèm konplèks, nou dwe peye. Epi nou peye, pami lòt bagay, ak espas disk.

Si ou pa janm te panse sou konbyen espas Docker aktyèlman pran sou machin ou, ou ta ka sezi dezagreyab pa pwodiksyon an nan lòd sa a:

$ docker system df

Docker Konsèy: Efase machin ou a nan tenten

Sa a montre itilizasyon disk Docker nan diferan kontèks:

  • imaj – gwosè total imaj ki te telechaje nan depo imaj epi ki te bati sou sistèm ou a;
  • kontenè - kantite total espas disk itilize pa kouri kontenè (sa vle di volim total kouch lekti-ekri nan tout resipyan);
  • volim lokal yo - volim depo lokal ki monte nan resipyan yo;
  • bati kachèt - dosye tanporè ki te pwodwi pa pwosesis bilding imaj la (itilize zouti BuildKit, ki disponib apati vèsyon Docker 18.09).

Mwen parye ke apre transfè senp sa a ou anvi netwaye disk ou a nan fatra epi pote gigaocte presye tounen nan lavi (nòt: sitou si ou peye lwaye pou jigokte sa yo chak mwa).

Itilizasyon disk pa resipyan

Chak fwa ou kreye yon veso sou machin lame a, plizyè fichye ak repèrtwar yo kreye nan /var/lib/docker anyè, pami sa ki annapre yo vo anyen:

  • Anyè /var/lib/docker/containers/container_ID - lè w ap itilize chofè estanda ki anrejistre, sa a se kote mòso evènman yo sove nan fòma JSON. Twò detaye mòso bwa, osi byen ke mòso bwa ke pèsonn pa li oswa otreman trete, souvan lakòz disk yo vin plen.
  • Anyè /var/lib/docker/overlay2 a gen kouch lekti-ekri veso yo (overlay2 se chofè pi pito nan pifò distribisyon Linux). Si veso a estoke done nan sistèm fichye li yo, Lè sa a, se nan anyè sa a ke li pral mete.

Ann imajine yon sistèm kote yon Docker primitif enstale, ki pa janm patisipe nan lanse resipyan oswa nan bati imaj. Rapò itilizasyon espas disk li yo pral sanble sa a:

$ 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

Ann lanse kèk veso, pou egzanp, NGINX:

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

Kisa k ap pase ak disk la:

  • imaj okipe 126 MB, sa a se menm NGINX ke nou te lanse nan veso a;
  • kontenè yo pran yon ridikil 2 octets.

$ 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

Jije pa konklizyon an, nou poko gen okenn espas ke nou ta ka libere. Depi 2 bytes se konplètman frivole, se pou nou imajine ke NGINX nou an san atann te ekri yon kote 100 Megabytes nan done epi li te kreye yon dosye test.img nan egzakteman gwosè sa a andedan tèt li.

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

Ann egzamine itilizasyon espas disk sou lame a ankò. Nou pral wè ke veso a (resipyan) okipe 100 Megabytes la.

$ 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

Mwen panse ke sèvo curieux ou deja ap mande kote dosye test.img nou an ye. Ann chèche li:

$ 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

San yo pa antre nan detay, nou ka sonje ke dosye a test.img se yon bon sitiye nan nivo a lekti-ekri, kontwole pa chofè a overlay2. Si nou sispann veso nou an, animatè a ap di nou ke espas sa a ka, an prensip, libere:

# 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

Ki jan nou ka fè sa? Lè w efase veso a, sa ki pral mande netwaye espas ki koresponn lan nan nivo lekti-ekri.

Avèk kòmandman sa a, ou ka retire tout resipyan enstale nan yon sèl kou epi netwaye disk ou a nan tout fichye lekti-ekri yo kreye:

$ 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

Se konsa, nou te libere 104,9 Megabytes pa efase veso a. Men, kòm nou pa sèvi ak imaj ki te telechaje anvan an ankò, li vin tou yon kandida pou efase ak libere resous nou yo:

$ 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

Remak: Osi lontan ke imaj la itilize pa omwen yon veso, ou pa yo pral kapab sèvi ak trik sa a.

Taye sou kòmand nou te itilize pi wo a sèlman gen yon efè sou veso ki sispann. Si nou vle efase pa sèlman sispann men tou kouri kontenè, nou ta dwe itilize youn nan kòmandman sa yo:

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

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

Nòt bò: si ou itilize paramèt -rm lè w kòmanse yon veso, Lè sa a, lè li sispann, tout espas ki genyen nan disk ke li te okipe yo pral libere.

Sèvi ak imaj ki gen kapasite

Sa gen kèk ane, yon gwosè imaj plizyè santèn megabyte te konplètman nòmal: yon imaj Ubuntu te peze 600 megabyte, ak yon imaj Microsoft .Net te peze plizyè jigokte. Nan jou shaggy sa yo, telechaje yon sèl imaj ta ka pran yon gwo peyaj sou espas disk gratis ou a, menm si ou te pataje nivo ant imaj yo. Jodi a - fè lwanj pou gwo - imaj yo peze anpil mwens, men menm si sa, ou ka byen vit ranpli resous ki disponib yo si ou pa pran kèk prekosyon.

Gen plizyè kalite imaj ki pa dirèkteman vizib pou itilizatè final la:

  • imaj entèmedyè, sou baz lòt imaj yo kolekte - yo pa ka efase si ou itilize resipyan ki baze sou "lòt" imaj sa yo;
  • imaj ki pandye yo se imaj entèmedyè ki pa fè referans a okenn nan kontenè yo kouri - yo ka efase.
  • Avèk kòmandman sa a ou ka tcheke imaj ki pandye sou sistèm ou a:

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

Ou ka retire yo nan fason sa a:

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

Nou ka itilize tou sou kòmand prune:

$ 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

Si nou toudenkou vle efase tout imaj yo ansanm (epi yo pa jis pandye) ak yon sèl lòd, Lè sa a, nou ka fè sa:

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

Itilizasyon disk pa volim

Volim yo itilize pou estoke done deyò sistèm dosye veso a. Pou egzanp, si nou vle sove rezilta yo nan yon aplikasyon yo nan lòd yo sèvi ak yo nan kèk lòt fason. Yon egzanp komen se baz done.

Ann lanse yon veso MongoDB, monte yon volim ekstèn nan veso a, epi restore yon backup baz done soti nan li (nou genyen li disponib nan dosye 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

Done yo pral lokalize sou machin lame a nan /var/lib/docker/volumes anyè. Men, poukisa pa nan nivo lekti-ekri veso a? Paske nan Dockerfile nan imaj MongoDB, anyè /data/db (kote MongoDB estoke done li yo pa default) defini kòm yon volim.

Docker Konsèy: Efase machin ou a nan tenten

Nòt bò: anpil imaj ki dwe pwodwi done itilize komèsan pou estoke done sa yo.

Lè nou jwe ase ak MongoDB epi sispann (oswa petèt menm efase) veso a, volim la pa pral efase. Li pral kontinye pran espas presye disk nou an jiskaske nou klèman efase li ak yon lòd tankou sa a:

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

Oke, oswa nou ka itilize soukòmand prune ki deja abitye pou nou:

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

Sèvi ak disk pou kachèt bati imaj

Nan Docker 18.09, pwosesis kreyasyon imaj la te sibi kèk chanjman gras ak zouti BuildKit. Bagay sa a ogmante vitès la nan pwosesis la ak optimize depo done ak jesyon sekirite. Isit la nou pa pral konsidere tout detay yo nan zouti sa a bèl bagay; nou pral sèlman konsantre sou fason li adrese pwoblèm nan itilizasyon espas disk.

Ann di nou gen yon aplikasyon Node.Js konplètman senp:

  • fichye index.js la kòmanse yon senp sèvè HTTP ki reponn ak yon liy pou chak demann ou resevwa:
  • fichye package.json la defini depandans yo, ki sèlman expressjs yo itilize pou kouri sèvè HTTP a:

$ 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 pou bati imaj la sanble sa a:

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

Ann bati imaj la nan fason nòmal la, san yo pa itilize BuildKit:

$ docker build -t app:1.0 .

Si nou tcheke itilizasyon espas disk la, nou ka wè sèlman imaj de baz la (node:13-alpine) ak imaj sib la (app:1.0) ap pran espas:

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

Ann konstwi dezyèm vèsyon aplikasyon nou an, lè l sèvi avèk BuildKit. Pou fè sa, nou jis bezwen mete varyab DOCKER_BUILDKIT a 1:

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

Si nou tcheke kounye a itilizasyon disk la, nou pral wè ke kachèt la bati (buid-cache) se kounye a patisipe la:

$ 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

Pou netwaye li, sèvi ak lòd sa a:

$ 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

Efase tout!

Se konsa, nou te gade nan netwaye espas disk okipe pa resipyan, imaj ak komèsan. Soukòmand prune a ede nou ak sa. Men, li kapab tou itilize nan nivo sistèm docker, epi li pral netwaye tout sa li kapab:

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

Si pou kèk rezon ou ap ekonomize espas disk sou yon machin ki kouri Docker, Lè sa a, detanzantan kouri lòd sa a ta dwe vin yon abitid.

Sous: www.habr.com

Add nouvo kòmantè