Tukwici Docker: Share injin ku daga takarce

Tukwici Docker: Share injin ku daga takarce

Hello, Habr! Ina gabatar muku da fassarar labarin "Nasihu na Docker: Tsaftace Injin Gida" marubuci Luc Juggery.

A yau za mu yi magana game da yadda Docker ke amfani da sararin faifai na na'ura mai masaukin baki, sannan kuma za mu gano yadda za a 'yantar da wannan fili daga tarkacen hotuna da kwantena da ba a yi amfani da su ba.


Tukwici Docker: Share injin ku daga takarce

Jimlar amfani

Docker abu ne mai sanyi, tabbas mutane kaɗan ne ke shakkar hakan a yau. Bayan 'yan shekarun da suka gabata, wannan samfurin ya ba mu sabuwar hanya don ginawa, bayarwa da gudanar da kowane yanayi, yana ba mu damar adana albarkatun CPU da RAM sosai. Baya ga wannan (kuma ga wasu wannan zai zama abu mafi mahimmanci) Docker ya ba mu damar sauƙaƙawa da haɓaka tsarin tafiyar da rayuwa na yanayin samar da mu.

Duk da haka, duk waɗannan abubuwan jin daɗin rayuwar zamani suna da tsada. Lokacin da muka gudanar da kwantena, zazzage ko ƙirƙirar hotunan namu, kuma muka tura daɗaɗɗen yanayin muhalli, dole ne mu biya. Kuma muna biya, a tsakanin sauran abubuwa, tare da sararin faifai.

Idan baku taɓa tunanin adadin sararin Docker da gaske yake ɗauka akan injin ku ba, zaku iya mamakin fitowar wannan umarni:

$ docker system df

Tukwici Docker: Share injin ku daga takarce

Wannan yana nuna amfani da faifai na Docker a cikin mahallin daban-daban:

  • hotuna - jimlar girman hotunan da aka zazzage daga ma'ajin hoto kuma an gina su akan tsarin ku;
  • kwantena - jimlar adadin sararin faifai da aka yi amfani da su ta hanyar kwantena masu gudana (ma'ana jimlar adadin rubutun-rubutu na duk kwantena);
  • kundin gida - ƙarar ajiya na gida wanda aka ɗora zuwa kwantena;
  • gina cache - fayilolin wucin gadi da aka samar ta hanyar ginin hoto (ta amfani da kayan aikin BuildKit, akwai farawa da nau'in Docker 18.09).

Na yi imani cewa bayan wannan sauƙi mai sauƙi kuna sha'awar tsaftace faifan ku na datti kuma ku dawo da gigabytes mai daraja a rayuwa (bayanin kula: musamman idan kuna biyan haya don waɗannan gigabytes kowane wata).

Amfani da diski ta kwantena

Duk lokacin da ka ƙirƙiri akwati akan injin mai masauki, ana ƙirƙiri fayiloli da kundayen adireshi da yawa a cikin /var/lib/docker directory, daga cikinsu akwai masu zuwa a lura:

  • Directory /var/lib/docker/containers/container_ID – lokacin amfani da madaidaicin direban shiga, wannan shine inda ake ajiye rajistan ayyukan a cikin tsarin JSON. Cikakkun bayanai dalla-dalla, da kuma rajistan ayyukan da babu wanda ya karanta ko akasin haka, sau da yawa yakan sa fayafai su cika.
  • Littafin /var/lib/docker/overlay2 yana ƙunshe da yadudduka karanta-rubutun akwati (overlay2 shine wanda aka fi so a yawancin rarraba Linux). Idan kwandon yana adana bayanai a cikin tsarin fayil ɗinsa, to a cikin wannan kundin za a sanya shi.

Bari mu yi tunanin tsarin da aka shigar da Docker mai tsafta, wanda ba a taɓa shiga cikin ƙaddamar da kwantena ko gina hotuna ba. Rahoton amfani da sararin faifan sa zai yi kama da haka:

$ 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

Bari mu ƙaddamar da wani akwati, misali, NGINX:

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

Abin da ke faruwa da faifai:

  • hotuna sun mamaye 126 MB, wannan shine NGINX guda ɗaya da muka ƙaddamar a cikin akwati;
  • kwantena suna ɗaukar ba'a 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

Yin la'akari da ƙarshe, har yanzu ba mu da wani sarari da za mu iya 'yantar da shi. Tun da 2 bytes gaba ɗaya maras kyau, bari mu yi tunanin cewa NGINX ɗinmu ba zato ba tsammani ya rubuta wani wuri 100 Megabytes na bayanai kuma ya ƙirƙiri gwajin fayil.img daidai wannan girman a cikin kanta.

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

Bari mu sake bincika amfani da sararin faifai akan mai watsa shiri. Za mu ga cewa kwantena (kwantena) sun mamaye Megabytes 100 a can.

$ 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

Ina tsammanin kwakwalwar binciken ku ta riga tana mamakin inda fayil ɗin mu test.img yake. Bari mu neme shi:

$ 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

Ba tare da shiga cikin cikakkun bayanai ba, zamu iya lura cewa fayil ɗin test.img yana dacewa a matakin karanta-rubutu, wanda direban overlay2 ke sarrafawa. Idan muka dakatar da kwandon mu, mai masaukin zai gaya mana cewa wannan sarari na iya, bisa manufa, a 'yantar da shi:

# 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

Ta yaya za mu yi hakan? Ta hanyar share akwati, wanda zai haifar da share sararin da ya dace a matakin karantawa.

Tare da wannan umarni mai zuwa, zaku iya cire duk kwantena da aka shigar a cikin faɗuwa ɗaya kuma ku share faifan ku daga duk fayilolin rubutu da aka ƙirƙira ta su:

$ 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

Don haka, mun 'yantar da 104,9 Megabytes ta hanyar share akwati. Amma tunda ba mu ƙara amfani da hoton da aka zazzage a baya ba, shi ma ya zama ɗan takara don sharewa da 'yantar da albarkatun mu:

$ 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

Lura: Muddin ana amfani da hoton da aƙalla akwati ɗaya, ba za ku iya amfani da wannan dabarar ba.

Umurnin damfara da muka yi amfani da shi a sama kawai yana da tasiri akan kwantena da aka dakatar. Idan muna son share ba kawai an tsaya ba amma har da kwantena masu gudana, yakamata mu yi amfani da ɗayan waɗannan umarni:

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

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

Bayanin gefe: idan kun yi amfani da ma'aunin -rm lokacin fara akwati, sannan lokacin da ya tsaya, duk sararin faifan diski da ya mamaye za a kuɓuta.

Amfani da hotunan diski

A 'yan shekarun da suka gabata, girman hoton megabytes ɗari da yawa ya kasance daidai: hoton Ubuntu yana auna megabytes 600, kuma hoton Microsoft .Net ya auna gigabytes da yawa. A cikin waɗancan kwanaki masu banƙyama, zazzage hoto ɗaya kawai zai iya yin babban tasiri akan sararin diski kyauta, koda kuna raba matakan tsakanin hotuna. A yau - yabo ga masu girma - hotuna sun yi ƙasa da ƙasa, amma duk da haka, za ku iya cika abubuwan da ake da su da sauri idan ba ku yi taka tsantsan ba.

Akwai nau'ikan hotuna da yawa waɗanda ba a iya gani kai tsaye ga mai amfani da ƙarshe:

  • hotuna masu tsaka-tsaki, a kan abin da aka tattara wasu hotuna - ba za a iya share su ba idan kun yi amfani da kwantena bisa ga waɗannan "sauran" hotuna;
  • Hotunan dangling hotuna ne na tsaka-tsaki waɗanda kowane kwantenan da ke gudana ba ya yin nuni da su - ana iya share su.
  • Tare da umarni mai zuwa za ku iya bincika hotuna masu banƙyama akan tsarin ku:

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

Kuna iya cire su ta hanya mai zuwa:

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

Hakanan za mu iya amfani da umarnin da ke ƙasa:

$ 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

Idan ba zato ba tsammani muna son share duk hotuna gaba ɗaya (kuma ba kawai raɗaɗi) tare da umarni ɗaya ba, to zamu iya yin wannan:

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

Amfani da diski ta juzu'i

Ana amfani da ƙararrawa don adana bayanai a wajen tsarin fayil ɗin kwantena. Misali, idan muna son adana sakamakon aikace-aikacen don amfani da su ta wata hanya dabam. Misali na gama gari shine bayanan bayanai.

Bari mu ƙaddamar da akwati na MongoDB, ɗaga ƙarar waje zuwa akwati, kuma mu dawo da ajiyar bayanai daga gare ta (muna da shi a cikin fayil ɗin 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

Bayanan za su kasance a kan na'ura mai watsa shiri a cikin /var/lib/docker/ kundin adireshi. Amma me yasa ba a matakin karanta-rubutu na akwati ba? Domin a cikin Dockerfile na hoton MongoDB, littafin /data/db (inda MongoDB ke adana bayanansa ta tsohuwa) an bayyana shi azaman ƙara.

Tukwici Docker: Share injin ku daga takarce

Bayanan gefe: hotuna da yawa waɗanda dole ne su samar da bayanai suna amfani da juzu'i don adana wannan bayanan.

Lokacin da muka yi wasa sosai tare da MongoDB kuma muka tsaya (ko watakila ma share) akwati, ba za a share ƙarar ba. Zai ci gaba da ɗaukar sararin faifan mu mai daraja har sai mun share shi a sarari tare da umarni kamar haka:

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

Da kyau, ko kuma za mu iya amfani da umarnin damfara wanda ya riga ya saba mana:

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

Yin amfani da faifai don gina cache hoto

A cikin Docker 18.09, tsarin ƙirƙirar hoto ya sami wasu canje-canje godiya ga kayan aikin BuildKit. Wannan abu yana ƙara saurin tsari kuma yana inganta ajiyar bayanai da sarrafa tsaro. Anan ba za mu yi la'akari da duk cikakkun bayanai na wannan kayan aiki mai ban mamaki ba; za mu mai da hankali ne kawai kan yadda yake magance batutuwan amfani da sararin samaniya.

Bari mu ce muna da cikakkiyar aikace-aikacen Node.Js mai sauƙi:

  • Fayil ɗin index.js yana farawa uwar garken HTTP mai sauƙi wanda ke amsa tare da layi ga kowane buƙatar da aka karɓa:
  • fayil ɗin package.json yana bayyana abubuwan dogaro, waɗanda kawai expressjs ake amfani da su don gudanar da sabar 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 don gina hoton yayi kama da haka:

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

Bari mu gina hoton ta hanyar da aka saba, ba tare da amfani da BuildKit ba:

$ docker build -t app:1.0 .

Idan muka duba amfani da sararin faifai, za mu iya ganin cewa kawai hoton tushe (kumburi: 13-alpine) da hoton da aka yi niyya (app: 1.0) suna ɗaukar sarari:

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

Bari mu gina sigar aikace-aikacen mu na biyu, ta amfani da BuildKit. Don yin wannan, kawai muna buƙatar saita canjin DOCKER_BUILDKIT zuwa 1:

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

Idan yanzu muka bincika amfanin faifai, za mu ga cewa ginin cache (buid-cache) yanzu yana cikin ciki:

$ 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

Don share shi, yi amfani da umarni mai zuwa:

$ 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

Share duka!

Don haka, mun duba tsaftace sararin faifai da kwantena, hotuna da kundin ke mamaye. Submandan prune yana taimaka mana da wannan. Amma kuma ana iya amfani dashi a matakin tsarin docker, kuma zai tsaftace duk abin da zai iya:

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

Idan saboda wasu dalilai kuna adana sararin faifai akan injin Docker ɗin ku, to lokaci-lokaci gudanar da wannan umarni yakamata ya zama al'ada.

source: www.habr.com

Add a comment