డాకర్: చెడు సలహా కాదు

నా వ్యాసానికి వ్యాఖ్యలలో డాకర్: చెడు సలహా అందులో వివరించిన డాకర్‌ఫైల్ ఎందుకు చాలా భయంకరంగా ఉందో వివరించడానికి చాలా అభ్యర్థనలు వచ్చాయి.

మునుపటి సిరీస్ సారాంశం: ఇద్దరు డెవలపర్‌లు గట్టి గడువులో డాకర్‌ఫైల్‌ను కంపోజ్ చేస్తారు. ఈ ప్రక్రియలో, Ops ఇగోర్ ఇవనోవిచ్ వారి వద్దకు వస్తాడు. ఫలితంగా వచ్చిన డాకర్‌ఫైల్ చాలా చెడ్డది, AI గుండెపోటు అంచున ఉంది.

డాకర్: చెడు సలహా కాదు

ఇప్పుడు ఈ డాకర్‌ఫైల్‌లో ఏమి తప్పు ఉందో తెలుసుకుందాం.

కాబట్టి, ఒక వారం గడిచింది.

దేవ్ పెట్యా ఓప్స్ ఇగోర్ ఇవనోవిచ్‌ని భోజనాల గదిలో ఒక కప్పు కాఫీ తాగుతూ కలుసుకున్నాడు.

పి: ఇగోర్ ఇవనోవిచ్, మీరు చాలా బిజీగా ఉన్నారా? మేము ఎక్కడ చిక్కుకున్నామో నేను గుర్తించాలనుకుంటున్నాను.

AI: ఇది మంచిది, మీరు దోపిడీపై ఆసక్తి ఉన్న డెవలపర్‌లను తరచుగా కలవరు.
మొదట, కొన్ని విషయాలపై ఏకీభవిద్దాం:

  1. డాకర్ భావజాలం: ఒక కంటైనర్ - ఒక ప్రక్రియ.
  2. కంటైనర్ చిన్నది, మంచిది.
  3. మీరు కాష్ నుండి ఎంత ఎక్కువ తీసుకుంటే అంత మంచిది.

P: ఒక కంటైనర్‌లో ఒక ప్రక్రియ ఎందుకు ఉండాలి?

AI: డాకర్, కంటైనర్‌ను ప్రారంభించేటప్పుడు, పిడ్ 1తో ప్రక్రియ యొక్క స్థితిని పర్యవేక్షిస్తుంది. ప్రక్రియ చనిపోతే, డాకర్ కంటైనర్‌ను పునఃప్రారంభించడానికి ప్రయత్నిస్తాడు. మీరు కంటైనర్‌లో అనేక అప్లికేషన్‌లు రన్ అవుతున్నారని లేదా ప్రధాన అప్లికేషన్ pid 1తో రన్ కావడం లేదని అనుకుందాం. ప్రక్రియ చనిపోతే, డాకర్‌కి దాని గురించి తెలియదు.

మీకు మరిన్ని ప్రశ్నలు లేకుంటే, దయచేసి మీ డాకర్‌ఫైల్‌ను మాకు చూపించండి.

మరియు పెట్యా చూపించాడు:

FROM ubuntu:latest

# Копируем исходный код
COPY ./ /app
WORKDIR /app

# Обновляем список пакетов
RUN apt-get update 

# Обновляем пакеты
RUN apt-get upgrade

# Устанавливаем нужные пакеты
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor

# Устанавливаем bundler
RUN gem install bundler

# Устанавливаем nodejs используется для сборки статики
RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash -
RUN apt-get install -y nodejs

# Устанавливаем зависимости
RUN bundle install --without development test --path vendor/bundle

# Чистим за собой кэши
RUN rm -rf /usr/local/bundle/cache/*.gem 
RUN apt-get clean 
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 
RUN rake assets:precompile
# Запускаем скрипт, при старте контейнера, который запустит все остальное.
CMD ["/app/init.sh"]

AI: ఓహ్, దానిని క్రమంలో తీసుకుందాం. మొదటి పంక్తితో ప్రారంభిద్దాం:

FROM ubuntu:latest

మీరు ట్యాగ్ తీసుకోండి latest. ట్యాగ్‌ని ఉపయోగించడం latest అనూహ్య పరిణామాలకు దారి తీస్తుంది. ఇమాజిన్, ఇమేజ్ మెయింటెయినర్ వేరే సాఫ్ట్‌వేర్ జాబితాతో ఇమేజ్ యొక్క కొత్త వెర్షన్‌ను నిర్మిస్తాడు, ఈ చిత్రం తాజా ట్యాగ్‌ని అందుకుంటుంది. మరియు మీ కంటైనర్, ఉత్తమంగా, నిర్మాణాన్ని ఆపివేస్తుంది మరియు చెత్తగా, మీరు ఇంతకు ముందు లేని బగ్‌లను పట్టుకుంటారు.

మీరు చాలా అనవసరమైన సాఫ్ట్‌వేర్‌తో పూర్తి స్థాయి OSతో చిత్రాన్ని తీస్తారు, ఇది కంటైనర్ వాల్యూమ్‌ను పెంచుతుంది. మరియు మరింత సాఫ్ట్‌వేర్, మరిన్ని రంధ్రాలు మరియు దుర్బలత్వాలు.

అదనంగా, చిత్రం పెద్దది, ఇది హోస్ట్‌లో మరియు రిజిస్ట్రీలో ఎక్కువ స్థలాన్ని తీసుకుంటుంది (మీరు చిత్రాలను ఎక్కడైనా నిల్వ చేస్తారా)?

P: అవును, వాస్తవానికి, మాకు రిజిస్ట్రీ ఉంది, మీరు దాన్ని సెటప్ చేసారు.

AI: కాబట్టి, నేను దేని గురించి మాట్లాడుతున్నాను?.. అవును, వాల్యూమ్‌లు... నెట్‌వర్క్‌పై లోడ్ కూడా పెరుగుతోంది. ఒకే చిత్రం కోసం ఇది గుర్తించదగినది కాదు, కానీ నిరంతర నిర్మాణం, పరీక్షలు మరియు విస్తరణ ఉన్నప్పుడు, ఇది గుర్తించదగినది. మీకు AWSలో దేవుని మోడ్ లేకపోతే, మీరు కాస్మిక్ బిల్లును కూడా పొందుతారు.

అందువల్ల, మీరు ఖచ్చితమైన సంస్కరణ మరియు కనీస సాఫ్ట్‌వేర్‌తో చాలా సరిఅయిన చిత్రాన్ని ఎంచుకోవాలి. ఉదాహరణకు, తీసుకోండి: FROM ruby:2.5.5-stretch

పి: ఓహ్, నేను చూస్తున్నాను. నేను అందుబాటులో ఉన్న చిత్రాలను ఎలా మరియు ఎక్కడ చూడగలను? నాకు ఏది అవసరమో నాకు ఎలా తెలుసు?

AI: సాధారణంగా చిత్రాలు దీని నుండి తీసుకోబడతాయి డాకర్హబ్, పోర్న్‌హబ్‌తో కంగారు పడకండి :). ఒక చిత్రం కోసం సాధారణంగా అనేక సమావేశాలు ఉన్నాయి:
ఆల్పైన్: చిత్రాలు మినిమలిస్టిక్ లైనక్స్ ఇమేజ్‌లో సేకరించబడతాయి, కేవలం 5 MB మాత్రమే. దాని ప్రతికూలత: ఇది దాని స్వంత libc అమలుతో సంకలనం చేయబడింది, ప్రామాణిక ప్యాకేజీలు దానిలో పనిచేయవు. అవసరమైన ప్యాకేజీని కనుగొని, ఇన్‌స్టాల్ చేయడానికి చాలా సమయం పడుతుంది.
స్క్రాచ్: బేస్ ఇమేజ్, ఇతర చిత్రాలను నిర్మించడానికి ఉపయోగించబడదు. ఇది బైనరీ, సిద్ధం చేయబడిన డేటాను అమలు చేయడానికి మాత్రమే ఉద్దేశించబడింది. GO అప్లికేషన్‌ల వంటి మీకు అవసరమైన ప్రతిదాన్ని కలిగి ఉన్న బైనరీ అప్లికేషన్‌లను అమలు చేయడానికి అనువైనది.
ఉబుంటు లేదా డెబియన్ వంటి ఏదైనా OS ఆధారంగా. సరే, వివరించాల్సిన అవసరం లేదని నేను అనుకుంటున్నాను.

AI: ఇప్పుడు మనం అన్ని ఎక్స్‌ట్రాలను ఇన్‌స్టాల్ చేయాలి. ప్యాకేజీలు మరియు మీ కాష్‌లను క్లియర్ చేయండి. మరియు మీరు దానిని వెంటనే విసిరివేయవచ్చు apt-get అప్గ్రేడ్. లేకపోతే, ప్రతి బిల్డ్‌తో, బేస్ ఇమేజ్ యొక్క స్థిర ట్యాగ్ ఉన్నప్పటికీ, విభిన్న చిత్రాలు పొందబడతాయి. ఇమేజ్‌లో ప్యాకేజీలను అప్‌డేట్ చేయడం మెయింటైనర్ యొక్క పని మరియు ట్యాగ్‌ని మార్చడంతో పాటు ఉంటుంది.

పి: అవును, నేను దీన్ని చేయడానికి ప్రయత్నించాను, ఇది ఇలా మారింది:

WORKDIR /app
COPY ./ /app

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle

RUN rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

AI: చెడ్డది కాదు, కానీ పని చేయడానికి కూడా ఏదో ఉంది. చూడండి, ఇక్కడ ఈ ఆదేశం ఉంది:

RUN rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*  

... తుది చిత్రం నుండి డేటాను తొలగించదు, కానీ ఈ డేటా లేకుండా అదనపు పొరను మాత్రమే సృష్టిస్తుంది. సరిగ్గా ఇలా:

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

అయితే అదంతా కాదు. అక్కడ నీ దగ్గర ఏమి ఉన్నాయి, రూబీ? అప్పుడు మీరు మొత్తం ప్రాజెక్ట్‌ను ప్రారంభంలో కాపీ చేయవలసిన అవసరం లేదు. Gemfile మరియు Gemfile.lock కాపీ చేస్తే సరిపోతుంది.

ఈ విధానంతో, ప్రతి మూలాధార మార్పు కోసం బండిల్ ఇన్‌స్టాల్ అమలు చేయబడదు, కానీ Gemfile లేదా Gemfile.lock మారినట్లయితే మాత్రమే.

డిపెండెన్సీల జాబితాతో కూడిన ఫైల్ ఆధారంగా npm, pip, కంపోజర్ మరియు ఇతర వంటి డిపెండెన్సీ మేనేజర్‌తో ఇతర భాషలకు కూడా అదే పద్ధతులు పని చేస్తాయి.

చివరగా, నేను డాకర్ భావజాలం గురించి "ఒక కంటైనర్ - ఒక ప్రక్రియ" గురించి మాట్లాడినట్లు గుర్తుందా? అంటే సూపర్‌వైజర్ అవసరం లేదు. మీరు కూడా అదే కారణాల వల్ల systemdని ఇన్‌స్టాల్ చేయకూడదు. ముఖ్యంగా, డాకర్ స్వయంగా సూపర్‌వైజర్. మరియు మీరు దానిలో బహుళ ప్రక్రియలను అమలు చేయడానికి ప్రయత్నించినప్పుడు, ఇది ఒక సూపర్‌వైజర్ ప్రక్రియలో బహుళ అప్లికేషన్‌లను అమలు చేయడం లాంటిది.
నిర్మించేటప్పుడు, మీరు ఒకే చిత్రాన్ని తయారు చేసి, ఆపై అవసరమైన సంఖ్యలో కంటైనర్‌లను ప్రారంభించండి, తద్వారా ప్రతిదానిలో ఒక ప్రక్రియ నడుస్తుంది.

కానీ తరువాత దాని గురించి మరింత.

P: నేను అర్థం చేసుకున్నాను. ఏమి జరుగుతుందో చూడండి:

FROM ruby:2.5.5-stretch

WORKDIR /app
COPY Gemfile* /app

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

COPY . /app
RUN rake assets:precompile

CMD ["bundle”, “exec”, “passenger”, “start"]

కంటైనర్‌ను ప్రారంభించేటప్పుడు డెమోన్‌ల ప్రయోగాన్ని మనం భర్తీ చేయవచ్చా?

AI: అవును, అది నిజమే. మార్గం ద్వారా, మీరు CMD మరియు ENTRYPOINT రెండింటినీ ఉపయోగించవచ్చు. మరియు తేడా ఏమిటో గుర్తించడం మీ హోంవర్క్. హబ్రేలో ఈ అంశంపై మంచి ఒకటి ఉంది వ్యాసం.

కాబట్టి, ముందుకు వెళ్దాం. మీరు నోడ్‌ను ఇన్‌స్టాల్ చేయడానికి ఫైల్‌ను డౌన్‌లోడ్ చేసుకోండి, కానీ మీకు అవసరమైన వాటిని కలిగి ఉంటుందని హామీ లేదు. మేము ధ్రువీకరణను జోడించాలి. ఉదాహరణకు, ఇలా:

RUN curl -sL https://deb.nodesource.com/setup_9.x > setup_9.x 
    && echo "958c9a95c4974c918dca773edf6d18b1d1a41434  setup_9.x" | sha1sum -c - 
    &&  bash  setup_9.x 
    && rm -rf setup_9.x 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

చెక్‌సమ్‌ని ఉపయోగించి మీరు సరైన ఫైల్‌ని డౌన్‌లోడ్ చేశారని ధృవీకరించవచ్చు.

P: ఫైల్ మారితే, బిల్డ్ విఫలమవుతుంది.

AI: అవును, మరియు విచిత్రమేమిటంటే, ఇది కూడా ఒక ప్లస్. ఫైల్ మారిందని మీకు తెలుస్తుంది మరియు అక్కడ ఏమి మార్చబడిందో మీరు చూడగలరు. మీకు ఎప్పటికీ తెలియదు, వారు చేరుకోగలిగే ప్రతిదాన్ని తొలగించే లేదా బ్యాక్‌డోర్‌ను సృష్టించే స్క్రిప్ట్‌ని జోడించారు, చెప్పారు.

పి: ధన్యవాదాలు. చివరి డాకర్‌ఫైల్ ఇలా కనిపిస్తుంది:

FROM ruby:2.5.5-stretch

WORKDIR /app
COPY Gemfile* /app

RUN curl -sL https://deb.nodesource.com/setup_9.x > setup_9.x 
    && echo "958c9a95c4974c918dca773edf6d18b1d1a41434  setup_9.x" | sha1sum -c - 
    &&  bash  setup_9.x 
    && rm -rf setup_9.x 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

COPY . /app
RUN rake assets:precompile

CMD ["bundle”, “exec”, “passenger”, “start"]

పి: ఇగోర్ ఇవనోవిచ్, మీ సహాయానికి ధన్యవాదాలు. నేను పరుగెత్తడానికి ఇది సమయం, నేను ఈ రోజు మరో 10 కమిట్‌లు చేయాలి.

ఇగోర్ ఇవనోవిచ్, తన సహోద్యోగిని తన చూపులతో ఆపి, బలమైన కాఫీ తాగాడు. 99.9% SLA మరియు బగ్-ఫ్రీ కోడ్ గురించి కొన్ని సెకన్ల పాటు ఆలోచించిన తర్వాత, అతను ఒక ప్రశ్న అడుగుతాడు.

AI: మీరు లాగ్‌లను ఎక్కడ నిల్వ చేస్తారు?

P: అయితే, production.logలో. మార్గం ద్వారా, అవును, కానీ మనం వాటిని ssh లేకుండా ఎలా యాక్సెస్ చేయవచ్చు?

AI: మీరు వాటిని ఫైల్‌లలో ఉంచినట్లయితే, మీ కోసం ఇప్పటికే ఒక పరిష్కారం కనుగొనబడింది. డాకర్ ఎగ్జిక్యూటివ్ కమాండ్ ఏదైనా కమాండ్‌ను కంటైనర్‌లో అమలు చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఉదాహరణకు, మీరు లాగ్స్ కోసం పిల్లి చేయవచ్చు. మరియు కీని ఉపయోగించడం -ఇది మరియు రన్నింగ్ బాష్ (కంటైనర్‌లో ఇన్‌స్టాల్ చేయబడి ఉంటే) మీకు కంటైనర్‌కు ఇంటరాక్టివ్ యాక్సెస్ ఇస్తుంది.

కానీ మీరు ఫైల్‌లలో లాగ్‌లను నిల్వ చేయకూడదు. కనిష్టంగా, ఇది కంటైనర్ యొక్క అనియంత్రిత పెరుగుదలకు దారితీస్తుంది మరియు ఎవరూ లాగ్లను తిప్పరు. అన్ని లాగ్‌లు stdoutకి పంపబడాలి. అక్కడ వారు ఇప్పటికే ఆదేశాన్ని ఉపయోగించి వీక్షించవచ్చు డాకర్ లాగ్‌లు.

పి: ఇగోర్ ఇవనోవిచ్, బహుశా నేను లాగ్‌లను మౌంటెడ్ డైరెక్టరీలో, ఫిజికల్ నోడ్‌లో, వినియోగదారు డేటాగా ఉంచవచ్చా?

AI: నోడ్ డిస్క్‌లో లోడ్ చేయబడిన డేటాను తీసివేయడం మీరు మర్చిపోకుండా ఉండటం మంచిది. మీరు దీన్ని లాగ్‌లతో కూడా చేయవచ్చు, భ్రమణాన్ని సెటప్ చేయడం మర్చిపోవద్దు.
అంతే, మీరు పరుగెత్తవచ్చు.

పి: ఇగోర్ ఇవనోవిచ్, మీరు ఏమి చదవాలో నాకు సలహా ఇవ్వగలరా?

AI: మొదట, చదవండి డాకర్ డెవలపర్‌ల నుండి సిఫార్సులు, వారి కంటే డాకర్ గురించి ఎవరికీ బాగా తెలియదు.

మరియు మీరు ఇంటర్న్‌షిప్ పొందాలనుకుంటే, వెళ్ళండి ఇంటెన్సివ్. అన్ని తరువాత, అభ్యాసం లేని సిద్ధాంతం చనిపోయినది.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి