Docker ጠቃሚ ምክሮች፡ ማሽንህን ከቆሻሻ አጽዳ

Docker ጠቃሚ ምክሮች፡ ማሽንህን ከቆሻሻ አጽዳ

ሃይ ሀብር! የጽሁፉን ትርጉም ለእርስዎ ትኩረት አቀርባለሁ። "Docker ጠቃሚ ምክሮች፡ የአካባቢህን ማሽን አጽዳ" ደራሲ ሉክ ጁገሪ.

ዛሬ ዶከር የአስተናጋጁ ማሽኑን የዲስክ ቦታ እንዴት እንደሚጠቀም እንነጋገራለን, እና ይህን ቦታ እንዴት ጥቅም ላይ ካልዋሉ ምስሎች እና ኮንቴይነሮች ፍርስራሾችን እንዴት ነጻ ማድረግ እንደሚቻል እንገነዘባለን.


Docker ጠቃሚ ምክሮች፡ ማሽንህን ከቆሻሻ አጽዳ

አጠቃላይ ፍጆታ

ዶከር በጣም ጥሩ ነገር ነው, ምናልባት ዛሬ ጥቂት ሰዎች ይጠራጠራሉ. ከጥቂት አመታት በፊት ይህ ምርት ማንኛውንም አካባቢ ለመገንባት፣ ለማድረስ እና ለማስኬድ ሙሉ ለሙሉ አዲስ መንገድ ሰጥቶናል፣ ይህም የሲፒዩ እና ራም ሃብቶችን በከፍተኛ ሁኔታ እንድንቆጥብ አስችሎናል። ከዚህ በተጨማሪ (እና ለአንዳንዶች ይህ በጣም አስፈላጊው ነገር ይሆናል) ዶከር የምርት አካባቢያችንን የህይወት ዑደት አስተዳደር በሚያስደንቅ ሁኔታ ቀለል ለማድረግ እና አንድ ለማድረግ ፈቅዶልናል።

ይሁን እንጂ እነዚህ ሁሉ የዘመናዊ ህይወት ደስታዎች ዋጋ ያስከፍላሉ. ኮንቴይነሮችን ስናካሂድ፣ የራሳችንን ምስሎች ስናወርድ ወይም ስንፈጥር እና ውስብስብ ስነ-ምህዳሮችን ስናሰማራ፣ መክፈል አለብን። እና ከሌሎች ነገሮች በተጨማሪ በዲስክ ቦታ እንከፍላለን.

ዶከር በማሽንዎ ላይ ምን ያህል ቦታ እንደሚወስድ አስበህ የማታውቅ ከሆነ በዚህ ትዕዛዝ ውፅዓት ትገረም ይሆናል፡

$ docker system df

Docker ጠቃሚ ምክሮች፡ ማሽንህን ከቆሻሻ አጽዳ

ይህ የዶክተር ዲስክ አጠቃቀምን በተለያዩ ሁኔታዎች ያሳያል፡-

  • ምስሎች - ከምስል ማከማቻዎች የወረዱ እና በስርዓትዎ ላይ የተገነቡ ምስሎች አጠቃላይ መጠን;
  • ኮንቴይነሮች - መያዣዎች (ኮንቴይነሮች) የሚጠቀሙበት የዲስክ ቦታ ጠቅላላ መጠን (የሁሉም መያዣዎች አጠቃላይ የተነበቡ ንባብ ንብርብሮች ማለት ነው);
  • የአካባቢ ጥራዞች - በመያዣዎች ላይ የተገጠመ የአካባቢ ማከማቻ መጠን;
  • የግንባታ መሸጎጫ - በምስል ግንባታ ሂደት የተፈጠሩ ጊዜያዊ ፋይሎች (የBuildKit መሣሪያን በመጠቀም፣ ከDocker ስሪት 18.09 ጀምሮ ይገኛል።

ከዚህ ቀላል ዝውውር በኋላ ዲስክዎን ከቆሻሻ ለማጽዳት እና ውድ ጊጋባይት ወደ ህይወት ለመመለስ እንደሚጓጉ እገምታለሁ (ማስታወሻ፡ በተለይ ለእነዚህ ጊጋባይት በየወሩ ኪራይ ከከፈሉ)።

የዲስክ አጠቃቀም በመያዣዎች

በአስተናጋጁ ማሽን ላይ መያዣ በሚፈጥሩበት ጊዜ ሁሉ በ / var/lib/docker ማውጫ ውስጥ ብዙ ፋይሎች እና ማውጫዎች ይፈጠራሉ ፣ ከእነዚህም መካከል የሚከተሉትን ልብ ሊባል ይገባል ።

  • ማውጫ /var/lib/docker/containers/container_ID - መደበኛውን የመግቢያ ሾፌር ሲጠቀሙ የክስተት ምዝግብ ማስታወሻዎች በJSON ቅርጸት የሚቀመጡበት። በጣም ዝርዝር ምዝግብ ማስታወሻዎች፣ እንዲሁም ማንም የማያነበው ወይም በሌላ መንገድ የማይሰራ ምዝግብ ማስታወሻዎች ብዙውን ጊዜ ዲስኮች እንዲሞሉ ያደርጋሉ።
  • የ/var/lib/docker/ተደራቢ2 ማውጫ የእቃ መያዢያ ንባብ ንባብ ንብርብሮችን ይዟል (ተደራቢ2 በአብዛኛዎቹ የሊኑክስ ስርጭቶች ተመራጭ ነጂ ነው)። መያዣው በፋይል ስርዓቱ ውስጥ መረጃን የሚያከማች ከሆነ, በዚህ ማውጫ ውስጥ ይቀመጣል.

ኮንቴይነሮችን ለማስጀመርም ሆነ ምስሎችን በመገንባት ላይ ያልተሳተፈ ንፁህ ዶከር የተጫነበትን ስርዓት እናስብ። የእሱ የዲስክ ቦታ አጠቃቀም ዘገባ ይህን ይመስላል።

$ 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 ፋይል በተደራቢ 2 ሾፌር የሚቆጣጠረው በተነባቢ ፃፍ ደረጃ ላይ መሆኑን ልብ ማለት እንችላለን። መያዣችንን ካቆምን አስተናጋጁ ይህ ቦታ በመርህ ደረጃ ሊለቀቅ እንደሚችል ይነግረናል፡-

# 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

ማሳሰቢያ፡ ምስሉ ቢያንስ በአንድ ኮንቴይነር ስራ ላይ እስካል ድረስ ይህንን ብልሃት መጠቀም አይችሉም።

ከላይ የተጠቀምነው የፕሪን ንኡስ ትእዛዝ በቆሙ ኮንቴይነሮች ላይ ብቻ ተጽእኖ ይኖረዋል። የቆሙትን ብቻ ሳይሆን የሚሠሩትን ኮንቴይነሮችን መሰረዝ ከፈለግን ከሚከተሉት ትእዛዞች ውስጥ አንዱን መጠቀም አለብን፡-

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

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

የጎን ማስታወሻዎች፡- ኮንቴይነሩን ሲጀምሩ የ -rm መለኪያን ከተጠቀሙ፣ ሲቆም፣ የያዘው የዲስክ ቦታ በሙሉ ነፃ ይሆናል።

የዲስክ ምስሎችን በመጠቀም

ከጥቂት አመታት በፊት የበርካታ መቶ ሜጋባይት የምስል መጠን ሙሉ በሙሉ የተለመደ ነበር፡ የኡቡንቱ ምስል 600 ሜጋባይት ይመዝናል እና የማይክሮሶፍት ኔት ምስል ብዙ ጊጋባይት ይመዝን ነበር። በእነዚያ አስጨናቂ ቀናት ውስጥ፣ አንድ ምስል ብቻ ማውረድ በነጻ የዲስክ ቦታዎ ላይ ትልቅ ጫና ሊፈጥር ይችላል፣ ምንም እንኳን በምስሎች መካከል ደረጃዎችን እያጋሩ ቢሆንም። ዛሬ - ምስጋና ለታላቁ - ምስሎች በጣም ያነሰ ክብደት, ነገር ግን እንደዚያም ሆኖ, አንዳንድ ጥንቃቄዎችን ካላደረጉ ያሉትን ሀብቶች በፍጥነት መሙላት ይችላሉ.

ለዋና ተጠቃሚ በቀጥታ የማይታዩ በርካታ የምስሎች አይነቶች አሉ።

  • መካከለኛ ምስሎች, ሌሎች ምስሎች በሚሰበሰቡበት መሰረት - በእነዚህ "ሌሎች" ምስሎች ላይ የተመሰረቱ መያዣዎችን ከተጠቀሙ ሊሰረዙ አይችሉም;
  • ተንጠልጣይ ምስሎች በማናቸውም የሩጫ መያዣዎች ያልተጠቀሱ መካከለኛ ምስሎች ናቸው - ሊሰረዙ ይችላሉ.
  • በሚከተለው ትዕዛዝ በስርዓትዎ ላይ የተንጠለጠሉ ምስሎችን ማረጋገጥ ይችላሉ፡

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

እንዲሁም የፕሪም ንዑስ ትዕዛዝን መጠቀም እንችላለን፡-

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

የዲስክ አጠቃቀም በጥራዞች

ጥራዞች ከመያዣው የፋይል ስርዓት ውጭ መረጃን ለማከማቸት ያገለግላሉ። ለምሳሌ የመተግበሪያውን ውጤት በሌላ መንገድ ለመጠቀም ልናስቀምጠው ከፈለግን። የተለመደው ምሳሌ የውሂብ ጎታዎች ነው.

የሞንጎዲቢ ኮንቴይነርን እናስጀምር፣ ከመያዣው ውጪ የሆነ የድምጽ መጠን እንጫን እና የውሂብ ጎታውን ምትኬ ወደነበረበት እንመልስ (በ 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 ማውጫ ውስጥ ይገኛል። ግን ለምን በእቃ መያዣው የንባብ-መፃፍ ደረጃ ላይ አይሆንም? ምክንያቱም በሞንጎዲቢ ምስል Dockerfile ውስጥ /data/db ማውጫ (MongoDB ውሂቡን በነባሪ የሚያከማችበት) እንደ ጥራዝ ይገለጻል።

Docker ጠቃሚ ምክሮች፡ ማሽንህን ከቆሻሻ አጽዳ

የጎን ማስታወሻ፡ ብዙ ውሂብ ማምረት ያለባቸው ምስሎች ያንን ውሂብ ለማከማቸት ጥራዞች ይጠቀማሉ።

ከMongoDB ጋር በቂ ስንጫወት እና መያዣውን ስናቆም (ወይም ምናልባት መሰረዝ) ድምጹ አይጠፋም። በሚከተለው ትእዛዝ በግልፅ እስክንሰርዘው ድረስ ውድ የሆነውን የዲስክ ቦታችንን መያዙን ይቀጥላል።

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

ደህና፣ ወይም ለእኛ አስቀድሞ የሚያውቀውን የፕሪም ንዑስ ትዕዛዝ ልንጠቀም እንችላለን፡-

$ 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 ፋይል ለተቀበለው እያንዳንዱ ጥያቄ በመስመር ምላሽ የሚሰጥ ቀላል የኤችቲቲፒ አገልጋይ ይጀምራል።
  • package.json ፋይል ጥገኞችን ይገልፃል፣ ከእነዚህም ውስጥ expressjs ብቻ የኤችቲቲፒ አገልጋይ ለማሄድ ጥቅም ላይ ይውላል፡

$ 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"
      }
    }

ምስሉን ለመስራት ዶክ ፋይል ይህን ይመስላል።

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

ሁሉንም ያፅዱ!

ስለዚህ, በመያዣዎች, ምስሎች እና ጥራዞች የተያዘውን የዲስክ ቦታ ማጽዳትን ተመልክተናል. የፕሪም ንዑስ ትእዛዝ በዚህ ይረዳናል። ግን በዶክተር ሲስተም ደረጃም መጠቀም ይቻላል፣ እና የሚችለውን ሁሉ ያጸዳል፡-

$ 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 በሚሰራ ማሽን ላይ የዲስክ ቦታን እያጠራቀምክ ከሆነ ይህን ትዕዛዝ በየጊዜው ማስኬድ ልማድ መሆን አለበት።

ምንጭ: hab.com

አስተያየት ያክሉ