Cov Lus Qhia Docker: Tshem koj lub tshuab ntawm cov khib nyiab

Cov Lus Qhia Docker: Tshem koj lub tshuab ntawm cov khib nyiab

Hlo Habr! Kuv nthuav qhia rau koj mloog cov lus txhais ntawm tsab xov xwm "Docker Tswv Yim: Ntxuav Koj Lub Tshuab Hauv Zos" tus sau Lus Juggery.

Niaj hnub no peb yuav tham txog yuav ua li cas Docker siv qhov chaw disk ntawm lub tshuab hosting, thiab peb tseem yuav txheeb xyuas seb yuav tso qhov chaw no li cas los ntawm cov khoom seem ntawm cov duab tsis siv thiab ntim.


Cov Lus Qhia Docker: Tshem koj lub tshuab ntawm cov khib nyiab

Kev noj tag nrho

Docker yog qhov txias, tej zaum ob peb tus neeg tsis ntseeg nws niaj hnub no. Tsuas yog ob peb xyoos dhau los, cov khoom no tau muab peb txoj hauv kev tshiab los tsim, xa thiab khiav txhua qhov chaw, tso cai rau peb txuag CPU thiab RAM cov peev txheej. Ntxiv rau qhov no (thiab rau qee qhov no yuav yog qhov tseem ceeb tshaj plaws) Docker tau tso cai rau peb kom yooj yim heev thiab sib koom ua ke kev tswj hwm lub neej ntawm peb qhov chaw tsim khoom.

Txawm li cas los xij, tag nrho cov kev zoo siab ntawm lub neej niaj hnub no tuaj ntawm tus nqi. Thaum peb khiav cov thawv, rub tawm lossis tsim peb tus kheej cov duab, thiab xa cov ecosystems nyuaj, peb yuav tsum them. Thiab peb them, ntawm lwm yam, nrog rau qhov chaw disk.

Yog tias koj tsis tau xav txog ntau qhov chaw Docker tiag tiag siv rau ntawm koj lub tshuab, tej zaum koj yuav xav tsis thoob los ntawm cov lus txib no:

$ docker system df

Cov Lus Qhia Docker: Tshem koj lub tshuab ntawm cov khib nyiab

Qhov no qhia Docker qhov kev siv disk hauv cov ntsiab lus sib txawv:

  • cov duab - tag nrho qhov loj ntawm cov duab uas tau rub tawm los ntawm cov duab repositories thiab ua rau koj lub cev;
  • ntim - tag nrho cov nqi ntawm qhov chaw disk siv los ntawm kev khiav ntim (txhais tau tias tag nrho cov ntim ntawm cov ntawv nyeem-sau txheej ntawm tag nrho cov ntim);
  • cov ntim hauv zos - qhov ntim ntawm cov khoom ntim hauv zos mounted rau ntim;
  • tsim cache - cov ntaub ntawv ib ntus tsim los ntawm cov txheej txheem tsim duab (siv cov cuab yeej BuildKit, muaj pib nrog Docker version 18.09).

Kuv twv tias tom qab qhov kev hloov pauv yooj yim no koj tau mob siab rau ntxuav koj cov khib nyiab khib nyiab thiab nqa cov gigabytes muaj nuj nqis rov qab los rau lub neej (ceeb toom: tshwj xeeb tshaj yog tias koj them nqi xauj tsev rau cov gigabytes txhua lub hlis).

Disk siv los ntawm cov ntim khoom

Txhua zaus koj tsim lub thawv rau ntawm lub tshuab host, ntau cov ntaub ntawv thiab cov npe tau tsim nyob rau hauv /var/lib/docker directory, ntawm cov hauv qab no yog tsim nyog sau cia:

  • Directory /var/lib/docker/containers/container_ID - thaum siv tus txheej txheem loggging tsav tsheb, qhov no yog qhov kev tshwm sim cav tau txais kev cawmdim hauv JSON hom. Cov cav ntau dhau, nrog rau cov cav uas tsis muaj leej twg nyeem lossis lwm yam txheej txheem, feem ntau ua rau cov disks puv.
  • Cov ntawv teev npe /var/lib/docker/overlay2 muaj cov thawv nyeem-sau txheej (overlay2 yog tus tsav tsheb nyiam hauv feem ntau Linux faib). Yog hais tias lub thawv khaws cov ntaub ntawv nyob rau hauv nws cov ntaub ntawv system, ces nws yog nyob rau hauv no directory uas nws yuav muab tso rau.

Cia peb xav txog lub kaw lus uas lub Docker pristine tau teeb tsa, uas tsis tau koom nrog hauv kev tsim cov thawv lossis cov duab tsim. Nws daim ntawv qhia txog qhov chaw siv disk yuav zoo li no:

$ 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

Cia peb tso qee lub thawv, piv txwv li, NGINX:

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

Yuav ua li cas rau lub disk:

  • dluab nyob 126 MB, qhov no yog tib yam NGINX uas peb launched nyob rau hauv lub thawv;
  • ntim khoom noj tsis zoo 2 bytes.

$ 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

Kev txiav txim los ntawm qhov xaus, peb tseem tsis tau muaj qhov chaw uas peb tuaj yeem tso tau. Txij li thaum 2 bytes tsis muaj tseeb, cia peb xav txog tias peb NGINX poob nthav tau sau qhov chaw 100 Megabytes ntawm cov ntaub ntawv thiab tsim cov ntaub ntawv test.img raws nraim qhov loj me hauv nws tus kheej.

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

Cia peb tshuaj xyuas qhov chaw siv disk ntawm tus tswv dua. Peb yuav pom tias lub thawv (cov thawv ntim) nyob 100 Megabytes nyob ntawd.

$ 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

Kuv xav tias koj lub hlwb inquisitive twb xav paub qhov twg peb cov ntaub ntawv test.img nyob. Wb nrhiav nws:

$ 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

Yog tsis nkag mus rau hauv cov ntsiab lus, peb tuaj yeem nco ntsoov tias cov ntaub ntawv test.img tau yooj yim nyob ntawm qib nyeem-sau, tswj los ntawm overlay2 tsav tsheb. Yog tias peb nres peb lub thawv, tus tswv tsev yuav qhia peb tias qhov chaw no tuaj yeem, hauv paus ntsiab lus, tau tso tawm:

# 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

Peb yuav ua li cas li no? Los ntawm kev rho tawm lub thawv, uas yuav entail tshem tawm qhov chaw sib thooj ntawm qib nyeem-sau.

Nrog rau cov lus txib hauv qab no, koj tuaj yeem tshem tawm tag nrho cov ntim ntim hauv ib qho kev poob qis thiab tshem koj cov disk ntawm txhua cov ntaub ntawv nyeem-sau tsim los ntawm lawv:

$ 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

Yog li, peb tso tawm 104,9 Megabytes los ntawm kev rho tawm lub thawv. Tab sis txij li thaum peb tsis siv cov duab rub tawm yav dhau los, nws kuj dhau los ua tus neeg sib tw rau kev tshem tawm thiab tso peb cov peev txheej:

$ 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

Nco tseg: tsuav yog daim duab siv tsawg kawg ib lub thawv, koj yuav tsis muaj peev xwm siv qhov ua kom yuam kev no.

Lub prune subcommand peb siv saum toj no tsuas yog muaj kev cuam tshuam rau cov thawv ntim khoom. Yog tias peb xav rho tawm tsis tsuas yog nres tab sis kuj tseem khiav ntim, peb yuav tsum siv ib qho ntawm cov lus txib no:

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

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

Cov ntawv sau sab: yog tias koj siv -rm parameter thaum pib lub thawv, tom qab ntawd thaum nws nres, txhua qhov chaw disk uas nws nyob yuav raug tso tawm.

Siv cov duab disk

Ob peb xyoos dhau los, cov duab loj ntawm ob peb puas megabytes yog qhov qub tag nrho: Ubuntu duab hnyav 600 megabytes, thiab Microsoft .Net duab hnyav ntau gigabytes. Nyob rau hauv cov hnub shaggy, rub tawm tsuas yog ib daim duab tuaj yeem ua rau muaj kev cuam tshuam loj ntawm koj qhov chaw dawb disk, txawm tias koj tab tom sib koom qib ntawm cov duab. Niaj hnub no - qhuas rau qhov zoo tshaj plaws - cov duab hnyav dua, tab sis txawm li ntawd los, koj tuaj yeem sau cov peev txheej sai sai yog tias koj tsis ua qee yam ceev faj.

Muaj ntau ntau hom duab uas tsis pom ncaj qha rau tus neeg siv kawg:

  • cov duab nruab nrab, raws li lwm cov duab tau sau tseg - lawv tsis tuaj yeem muab tshem tawm yog tias koj siv cov thawv ntim raws li cov duab "lwm" no;
  • dangling dluab yog cov duab nruab nrab uas tsis tau hais los ntawm ib qho ntawm cov thawv khiav - lawv tuaj yeem raug tshem tawm.
  • Nrog rau cov lus txib hauv qab no koj tuaj yeem tshawb xyuas cov duab dangling ntawm koj lub cev:

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

Koj tuaj yeem tshem lawv ntawm txoj kev hauv qab no:

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

Peb kuj tuaj yeem siv prune cov lus txib:

$ 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

Yog tias peb mam li xav rho tawm tag nrho cov duab tag nrho (thiab tsis yog dangling xwb) nrog ib qho lus txib, ces peb tuaj yeem ua qhov no:

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

Kev siv disk los ntawm ntim

Cov ntim yog siv los khaws cov ntaub ntawv sab nraum lub thawv cov ntaub ntawv. Piv txwv li, yog tias peb xav khaws cov txiaj ntsig ntawm daim ntawv thov kom siv lawv ua lwm txoj hauv kev. Ib qho piv txwv yog databases.

Cia peb tso lub thawv MongoDB, mount ib lub ntim sab nraud rau lub thawv, thiab rov qab kho cov ntaub ntawv thaub qab los ntawm nws (peb muaj nyob rau hauv cov ntaub ntawv 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

Cov ntaub ntawv yuav nyob ntawm lub tshuab host hauv /var/lib/docker/volumes directory. Tab sis vim li cas ho tsis nyob rau qib nyeem-sau ntawm lub thawv? Vim tias nyob rau hauv Dockerfile ntawm MongoDB duab, /data/db directory (qhov twg MongoDB khaws nws cov ntaub ntawv los ntawm lub neej ntawd) txhais tau tias yog ntim.

Cov Lus Qhia Docker: Tshem koj lub tshuab ntawm cov khib nyiab

Kev Ceeb Toom: Muaj ntau cov duab uas yuav tsum tsim cov ntaub ntawv siv ntim los khaws cov ntaub ntawv ntawd.

Thaum peb ua si txaus nrog MongoDB thiab nres (lossis tej zaum tseem rho tawm) lub thawv, lub ntim yuav tsis raug tshem tawm. Nws yuav txuas ntxiv siv peb qhov chaw muaj nuj nqis disk kom txog thaum peb qhia meej meej nws nrog cov lus txib zoo li no:

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

Zoo, lossis peb tuaj yeem siv prune cov lus txib uas twb tau paub rau peb:

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

Siv disk rau duab tsim cache

Hauv Docker 18.09, cov txheej txheem tsim duab tau dhau los ua qee qhov kev hloov pauv ua tsaug rau cov cuab yeej BuildKit. Qhov no ua rau kom cov txheej txheem ceev thiab optimizes cov ntaub ntawv cia thiab tswj kev ruaj ntseg. Ntawm no peb yuav tsis xav txog tag nrho cov ntsiab lus ntawm cov cuab yeej zoo no; peb tsuas yog tsom mus rau yuav ua li cas nws daws teeb meem ntawm qhov chaw siv disk.

Cia peb hais tias peb muaj daim ntawv thov Node.Js yooj yim kiag li:

  • cov ntaub ntawv index.js pib ib qho yooj yim HTTP server uas teb nrog ib kab rau txhua qhov kev thov tau txais:
  • cov ntaub ntawv package.json txhais cov dependencies, uas tsuas yog expressjs yog siv los khiav HTTP server:

$ 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 rau kev tsim cov duab zoo li no:

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

Cia peb tsim cov duab raws li niaj zaus, tsis tas siv BuildKit:

$ docker build -t app:1.0 .

Yog tias peb txheeb xyuas qhov chaw siv disk, peb tuaj yeem pom tias tsuas yog cov duab hauv qab (node: 13-alpine) thiab cov duab lo lus uas peb (app: 1.0) tab tom noj qhov chaw:

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

Cia peb tsim qhov thib ob ntawm peb daim ntawv thov, siv BuildKit. Txhawm rau ua qhov no, peb tsuas yog yuav tsum teeb tsa DOCKER_BUILDKIT hloov pauv mus rau 1:

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

Yog tias peb tam sim no tshawb xyuas qhov kev siv disk, peb yuav pom tias qhov tsim cache (buid-cache) tam sim no koom nrog:

$ 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

Txhawm rau tshem nws, siv cov lus txib hauv qab no:

$ 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

Clear tag nrho!

Yog li, peb tau saib ntawm kev tu cov chaw disk uas nyob hauv cov thawv, duab thiab ntim. Cov lus txib prune pab peb nrog qhov no. Tab sis nws kuj tuaj yeem siv tau ntawm docker system theem, thiab nws yuav ntxuav txhua yam nws tuaj yeem ua tau:

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

Yog tias vim li cas koj thiaj li txuag chaw disk ntawm lub tshuab ua haujlwm Docker, tom qab ntawd ua raws li cov lus txib no yuav tsum ua tus cwj pwm.

Tau qhov twg los: www.hab.com

Ntxiv ib saib