Докерын зөвлөмж: Машинаа хог хаягдлаас цэвэрлэ

Докерын зөвлөмж: Машинаа хог хаягдлаас цэвэрлэ

Хөөе Хабр! Би нийтлэлийн орчуулгыг та бүхэнд толилуулж байна "Докерын зөвлөмж: Орон нутгийн машинаа цэвэрлэ" зохиогч нь Люк Жуггери.

Өнөөдөр бид Docker хост машины дискний зайг хэрхэн ашигладаг талаар ярилцах болно, мөн энэ зайг ашиглагдаагүй зураг, контейнерээс хэрхэн чөлөөлөх талаар олж мэдэх болно.


Докерын зөвлөмж: Машинаа хог хаягдлаас цэвэрлэ

Нийт хэрэглээ

Докер бол гайхалтай зүйл бөгөөд өнөөдөр цөөхөн хүн үүнд эргэлзэж байгаа байх. Хэдхэн жилийн өмнө энэхүү бүтээгдэхүүн нь бидэнд ямар ч орчныг бүтээх, хүргэх, ажиллуулах цоо шинэ арга замыг өгсөн нь CPU болон RAM-ийн нөөцийг ихээхэн хэмнэх боломжийг бидэнд олгосон юм. Үүнээс гадна (мөн зарим хүмүүсийн хувьд энэ нь хамгийн чухал зүйл байх болно) Docker нь үйлдвэрлэлийн орчныхоо амьдралын мөчлөгийн менежментийг гайхалтай хялбарчилж, нэгтгэх боломжийг бидэнд олгосон.

Гэсэн хэдий ч орчин үеийн амьдралын эдгээр бүх таашаал үнэ цэнэтэй байдаг. Бид контейнер ажиллуулж, өөрийн зургийг татаж авах эсвэл үүсгэх, нарийн төвөгтэй экосистемийг ашиглах үед бид төлбөр төлөх ёстой. Мөн бид бусад зүйлсийн дотор дискний зайг төлдөг.

Хэрэв та Docker таны машинд хэр их зай эзэлдэг талаар хэзээ ч бодож байгаагүй бол энэ тушаалын гаралт таныг гайхшруулж магадгүй юм.

$ docker system df

Докерын зөвлөмж: Машинаа хог хаягдлаас цэвэрлэ

Энэ нь Докерын дискний хэрэглээг өөр өөр нөхцөл байдалд харуулж байна:

  • зураг - зургийн агуулахаас татаж авсан, таны систем дээр суурилуулсан зургийн нийт хэмжээ;
  • чингэлэг - ажиллаж байгаа контейнеруудад ашигласан дискний нийт зай (бүх савны унших, бичих давхаргын нийт эзлэхүүн гэсэн үг);
  • орон нутгийн эзэлхүүн - саванд суурилуулсан орон нутгийн агуулахын хэмжээ;
  • кэш бүтээх – зураг бүтээх процессоор үүсгэгдсэн түр зуурын файлууд (BuildKit хэрэгслийг ашиглан Docker хувилбар 18.09-с эхлэн ашиглах боломжтой).

Энэхүү энгийн шилжүүлгийн дараа та дискээ хогноос цэвэрлэж, үнэт гигабайтыг сэргээхийг хүсч байгаа гэдэгт би итгэлтэй байна (тэмдэглэл: ялангуяа та эдгээр гигабайтын түрээсийг сар бүр төлдөг бол).

Контейнерээр дискний хэрэглээ

Хост машин дээр контейнер үүсгэх болгонд /var/lib/docker директорт хэд хэдэн файл, лавлах үүсгэгддэг бөгөөд үүнд дараах зүйлсийг анхаарах нь зүйтэй.

  • Лавлах /var/lib/docker/containers/container_ID – стандарт бүртгэлийн драйверийг ашиглах үед энд үйл явдлын бүртгэлийг JSON форматаар хадгалдаг. Хэтэрхий нарийвчилсан бүртгэлүүд, түүнчлэн хэн ч уншдаггүй эсвэл өөр аргаар боловсруулдаггүй логууд нь ихэвчлэн дискийг дүүргэх шалтгаан болдог.
  • /var/lib/docker/overlay2 лавлах нь чингэлэг унших-бичих давхаргуудыг агуулдаг (overlay2 нь ихэнх Линукс түгээлтийн хувьд илүүд үздэг драйвер юм). Хэрэв чингэлэг нь өгөгдлийг өөрийн файлын системд хадгалдаг бол түүнийг энэ директорт байрлуулна.

Контейнер хөөргөх, зураг бүтээх ажилд хэзээ ч оролцож байгаагүй цэвэр Docker суурилуулсан системийг төсөөлөөд үз дээ. Түүний дискний зай ашиглалтын тайлан дараах байдлаар харагдах болно.

$ 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

Зарим контейнер ажиллуулцгаая, жишээ нь NGINX:

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

Дискэнд юу тохиолдох вэ:

  • зураг нь 126 МБ багтаамжтай, энэ нь бидний саванд эхлүүлсэн NGINX юм;
  • Контейнер нь инээдтэй 2 байт эзэлдэг.

$ 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

Дүгнэлтээс харахад бидэнд чөлөөлөх орон зай одоогоор алга. 2 байт нь бүрэн утгагүй тул манай NGINX гэнэт 100 мегабайт өгөгдөл бичиж, дотроо яг ийм хэмжээтэй test.img файл үүсгэсэн гэж төсөөлөөд үз дээ.

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

Хост дээрх дискний зай ашиглалтыг дахин авч үзье. Тэнд чингэлэг (контейнер) 100 мегабайт эзэлдэг болохыг бид харах болно.

$ 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

Таны сониуч тархи аль хэдийн манай test.img файл хаана байгааг гайхаж байгаа гэж бодож байна. Үүнийг хайцгаая:

$ 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

Дэлгэрэнгүй мэдээлэл өгөхгүйгээр test.img файл нь overlay2 драйвераар хянагддаг унших, бичих түвшинд тохиромжтой гэдгийг бид тэмдэглэж болно. Хэрэв бид чингэлэгээ зогсоовол эзэн нь зарчмын хувьд энэ зайг чөлөөлж болно гэж хэлэх болно.

# 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

Үүнийг бид яаж хийж чадах вэ? Савыг устгаснаар унших-бичих түвшинд тохирох зайг цэвэрлэх болно.

Дараах командын тусламжтайгаар та суулгасан бүх контейнерийг нэг дор устгаж, тэдгээрийн үүсгэсэн бүх унших, бичих файлуудаас дискээ цэвэрлэж болно.

$ 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

Тиймээс бид контейнерыг устгаснаар 104,9 мегабайтыг чөлөөлсөн. Гэхдээ бид өмнө нь татаж авсан зургийг ашиглахаа больсон тул энэ нь бидний нөөцийг устгах, чөлөөлөх нэр дэвшигч болж байна:

$ 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

Тайлбар: Зургийг дор хаяж нэг контейнер ашиглаж байгаа бол та энэ заль мэхийг ашиглах боломжгүй.

Бидний дээр ашигласан prune дэд команд нь зөвхөн зогссон савнуудад л нөлөөлнө. Хэрэв бид зогссон төдийгүй ажиллаж байгаа контейнеруудыг устгахыг хүсвэл эдгээр командын аль нэгийг ашиглах хэрэгтэй.

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

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

Хажуугийн тэмдэглэл: хэрэв та савыг эхлүүлэхдээ -rm параметрийг ашиглавал зогсоход түүний эзэлсэн бүх дискний зай чөлөөлөгдөнө.

Дискний дүрсийг ашиглах

Хэдэн жилийн өмнө хэдэн зуун мегабайт зургийн хэмжээ бүрэн хэвийн байсан: Ubuntu зураг 600 мегабайт жинтэй, Microsoft .Net зураг хэд хэдэн гигабайт жинтэй байв. Эдгээр бүдүүлэг өдрүүдэд та зургуудын хооронд түвшнийг хуваалцаж байсан ч зөвхөн нэг зургийг татаж авах нь таны дискний хоосон зайд ихээхэн хохирол учруулж болзошгүй юм. Өнөөдөр - агуу ихийг магтъя - зургууд хамаагүй бага жинтэй, гэхдээ та урьдчилан сэргийлэх арга хэмжээ авахгүй бол бэлэн нөөцийг хурдан дүүргэх боломжтой.

Эцсийн хэрэглэгчдэд шууд харагдахгүй хэд хэдэн төрлийн зураг байдаг:

  • бусад зургуудыг цуглуулсан завсрын зургууд - хэрэв та эдгээр "бусад" зураг дээр суурилсан савыг ашигладаг бол тэдгээрийг устгах боломжгүй;
  • унжсан зургууд нь ажиллаж байгаа ямар ч савны лавлагаагүй завсрын зургууд бөгөөд тэдгээрийг устгаж болно.
  • Дараах командын тусламжтайгаар та өөрийн систем дээр унжсан дүрс байгаа эсэхийг шалгаж болно.

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

Та тэдгээрийг дараах байдлаар устгаж болно.

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

Бид мөн 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

Хэрэв бид гэнэт нэг тушаалаар бүх зургийг бүхэлд нь (зөвхөн унжсан биш) устгахыг хүсвэл дараах зүйлийг хийж болно.

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

Дискний ашиглалтын хэмжээ

Эзлэхүүнийг контейнерийн файлын системээс гадуур өгөгдлийг хадгалахад ашигладаг. Жишээлбэл, хэрэв бид програмын үр дүнг өөр аргаар ашиглахын тулд хадгалахыг хүсвэл. Нийтлэг жишээ бол мэдээллийн сан юм.

MongoDB контейнер ажиллуулж, контейнерт гаднах эзлэхүүнийг холбож, түүнээс мэдээллийн сангийн нөөцлөлтийг сэргээцгээе (бид үүнийг 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

Өгөгдөл нь /var/lib/docker/volumes сан дахь хост машин дээр байрлана. Гэхдээ яагаад савны унших-бичих түвшинд байж болохгүй гэж? Учир нь MongoDB зургийн Dockerfile дотор /data/db лавлах (MongoDB нь өгөгдлөө анхдагчаар хадгалдаг) нь эзлэхүүн гэж тодорхойлогддог.

Докерын зөвлөмж: Машинаа хог хаягдлаас цэвэрлэ

Хажуугийн тэмдэглэл: Өгөгдөл үүсгэх ёстой олон зураг тухайн өгөгдлийг хадгалахын тулд эзлэхүүнийг ашигладаг.

Бид MongoDB-тэй хангалттай тоглож, контейнерийг зогсоох (эсвэл бүр устгах) үед эзлэхүүн устахгүй. Бид үүнийг дараах тушаалаар устгах хүртэл бидний үнэ цэнэтэй дискний зайг эзэлсээр байх болно:

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

За, эсвэл бид аль хэдийн мэддэг prune дэд командыг ашиглаж болно:

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

Зураг бүтээх кэшэд диск ашиглах

Docker 18.09 дээр BuildKit хэрэглүүрийн ачаар зураг үүсгэх үйл явцад зарим өөрчлөлт орсон. Энэ зүйл нь процессын хурдыг нэмэгдүүлж, өгөгдөл хадгалах, аюулгүй байдлын менежментийг оновчтой болгодог. Энд бид энэ гайхамшигтай хэрэгслийн бүх нарийн ширийн зүйлийг авч үзэхгүй, бид зөвхөн дискний зайг хэрхэн ашиглах асуудлыг шийдвэрлэхэд анхаарлаа хандуулах болно.

Бидэнд маш энгийн Node.Js програм байгаа гэж бодъё:

  • index.js файл нь хүлээн авсан хүсэлт бүрт мөрөөр хариулах энгийн HTTP серверийг эхлүүлдэг:
  • package.json файл нь хамаарлыг тодорхойлдог бөгөөд үүнээс зөвхөн expressjs 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"
      }
    }

Зураг бүтээх Dockerfile нь дараах байдалтай байна.

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

Зургийг BuildKit ашиглахгүйгээр ердийн аргаар бүтээцгээе:

$ docker build -t app:1.0 .

Хэрэв бид дискний зайны ашиглалтыг шалгавал зөвхөн үндсэн зураг (зангилаа: 13-алп) болон очих газрын зураг (ап: 1.0) зай эзэлдэг болохыг харж болно:

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

BuildKit ашиглан програмынхаа хоёр дахь хувилбарыг бүтээцгээе. Үүнийг хийхийн тулд бид DOCKER_BUILDKIT хувьсагчийг 1 болгоход л хангалттай.

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

Хэрэв бид одоо дискний хэрэглээг шалгах юм бол бүтээх кэш (buid-cache) одоо тэнд байгааг харах болно:

$ 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

Үүнийг арилгахын тулд дараах тушаалыг ашиглана уу.

$ 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

Бүгдийг цэвэрлэ!

Тиймээс бид контейнер, зураг, эзэлхүүнээр эзэлдэг дискний зайг цэвэрлэх талаар авч үзсэн. Prune дэд команд нь үүнд тусалдаг. Гэхдээ үүнийг докерын системийн түвшинд бас ашиглаж болох бөгөөд энэ нь чадах бүхнээ цэвэрлэх болно:

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

Хэрэв та ямар нэг шалтгааны улмаас Docker ажиллуулж байгаа машин дээр дискний зайг хэмнэж байгаа бол энэ командыг үе үе ажиллуулах нь зуршил болох ёстой.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх