Docker : မဆိုးပါဘူး အကြံဉာဏ်

ငါ့ဆောင်းပါးအတွက်မှတ်ချက်များ Docker: မကောင်းသောအကြံဉာဏ် ၎င်းတွင်ဖော်ပြထားသော Dockerfile သည် အဘယ်ကြောင့် အလွန်ကြောက်စရာကောင်းကြောင်း ရှင်းပြရန် တောင်းဆိုမှုများစွာရှိခဲ့သည်။

ယခင်စီးရီး၏အကျဉ်းချုပ်− ဆော့ဖ်ဝဲရေးသားသူ နှစ်ဦးသည် တင်းကျပ်သော သတ်မှတ်ရက်အောက်တွင် Dockerfile တစ်ခုကို ရေးဖွဲ့သည်။ လုပ်ငန်းစဉ်တွင် Ops Igor Ivanovich သည် ၎င်းတို့ထံ ရောက်လာသည်။ ရလဒ် Dockerfile သည် အလွန်ဆိုးရွားသောကြောင့် AI သည် နှလုံးဖောက်လုနီးပါးဖြစ်နေပြီဖြစ်သည်။

Docker : မဆိုးပါဘူး အကြံဉာဏ်

အခု ဒီ Dockerfile မှာ ဘာမှားနေလဲ အဖြေရှာကြည့်ရအောင်။

ဒီလိုနဲ့ တစ်ပတ်ကျော်သွားပါပြီ။

Dev Petya သည် ကော်ဖီတစ်ခွက်ဖြင့် ထမင်းစားခန်းတွင် Ops Igor Ivanovich နှင့် တွေ့ဆုံသည်။

P: Igor Ivanovich မင်းက အရမ်းအလုပ်များနေလား။ ငါတို့ ဘယ်မှာ ပေါက်ခဲ့တာလဲ ဆိုတာ သိချင်ပါတယ်။

AI- ကောင်းပါတယ်၊ အမြတ်ထုတ်ခြင်းကို စိတ်ဝင်စားတဲ့ developer တွေနဲ့ မကြာခဏ တွေ့ဆုံလေ့မရှိပါဘူး။
ပထမအချက် အနည်းငယ်ကို သဘောတူကြပါစို့။

  1. Docker သဘောတရား- ကွန်တိန်နာတစ်ခု - လုပ်ငန်းစဉ်တစ်ခု။
  2. ဘူးသေးလေလေ ပိုကောင်းလေပါပဲ။
  3. ကက်ရှ်ကနေ များများယူလေ ပိုကောင်းလေပါပဲ။

P: ကွန်တိန်နာတစ်ခုတွင် လုပ်ငန်းစဉ်တစ်ခု အဘယ်ကြောင့်ရှိသင့်သနည်း။

AI- Docker သည် ကွန်တိန်နာတစ်ခုကို စတင်သောအခါတွင် pid 1 ဖြင့် လုပ်ငန်းစဉ်အခြေအနေကို စောင့်ကြည့်သည်။ လုပ်ငန်းစဉ်သေဆုံးသွားပါက Docker သည် ကွန်တိန်နာကို ပြန်လည်စတင်ရန် ကြိုးစားသည်။ သင့်တွင် ကွန်တိန်နာတစ်ခုတွင် လုပ်ဆောင်နေသည့် အပလီကေးရှင်းများစွာရှိသည်ဆိုပါစို့ သို့မဟုတ် ပင်မအပလီကေးရှင်းသည် pid 1 ဖြင့် လုပ်ဆောင်နေခြင်းမဟုတ်ပေ။ လုပ်ငန်းစဉ်သေဆုံးသွားပါက Docker သည် ၎င်းအကြောင်းကို သိရှိမည်မဟုတ်ပါ။

သင့်တွင် နောက်ထပ်မေးခွန်းများမရှိပါက၊ သင်၏ Dockerfile ကို ကျွန်ုပ်တို့အား ပြသပါ။

Petya ကပြတယ်။

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

မင်း tag ကိုယူ latest. tag ကိုအသုံးပြုခြင်း။ latest မခန့်မှန်းနိုင်သော အကျိုးဆက်များကို ဖြစ်ပေါ်စေသည်။ ရုပ်ပုံထိန်းသိမ်းသူသည် မတူညီသောဆော့ဖ်ဝဲလ်စာရင်းဖြင့် ပုံ၏ဗားရှင်းအသစ်ကို ဖန်တီးသည်ဟု မြင်ယောင်ကြည့်ပါ၊ ဤပုံသည် နောက်ဆုံးပေါ်တက်ဂ်ကို ရရှိသည်။ အကောင်းဆုံးအနေနှင့် သင့်ကွန်တိန်နာသည် တည်ဆောက်ခြင်းကို ရပ်သွားကာ အဆိုးဆုံးမှာ သင်သည် ယခင်ကမရှိခဲ့သော ပိုးကောင်များကို ဖမ်းမိခြင်းဖြစ်သည်။

သင်သည် ကွန်တိန်နာ၏ အသံအတိုးအကျယ်ကို တိုးစေသော မလိုအပ်သော ဆော့ဖ်ဝဲလ်များစွာဖြင့် ပြည့်စုံသော OS ဖြင့် ပုံတစ်ပုံကို ယူပါ။ ဆော့ဖ်ဝဲလ်များလေလေ၊ အပေါက်များနှင့် အားနည်းချက်များ များလေလေဖြစ်သည်။

ထို့အပြင်၊ ပုံပိုကြီးလေ၊ host နှင့် registry တွင် နေရာပိုယူလေ (ပုံများကို တစ်နေရာရာမှာ သိမ်းဆည်းထားသလား)။

P: ဟုတ်ပါတယ်၊ ငါတို့မှာ မှတ်ပုံတင်တစ်ခုရှိတယ်၊ မင်း အဲဒါကို စလုပ်တယ်။

AI- ဒါဆို ငါဘာပြောနေတာလဲ?... အိုး၊ ပမာဏများ... ကွန်ရက်ပေါ်ရှိ ဝန်အားလည်း တိုးလာသည်။ ပုံတစ်ပုံတည်းအတွက် ၎င်းသည် သိသာထင်ရှားခြင်းမရှိသော်လည်း စဉ်ဆက်မပြတ်တည်ဆောက်မှု၊ စမ်းသပ်မှုများနှင့် ဖြန့်ကျက်မှုရှိလာသောအခါ ၎င်းသည် သိသာသည်။ သင့်တွင် AWS တွင် God's mode မရှိပါက၊ သင်သည် စကြာဝဠာငွေတောင်းခံလွှာကိုလည်း ရရှိမည်ဖြစ်သည်။

ထို့ကြောင့်၊ အတိအကျဗားရှင်းနှင့် အနိမ့်ဆုံးဆော့ဖ်ဝဲလ်ဖြင့် အသင့်တော်ဆုံးပုံကို ရွေးချယ်ရန် လိုအပ်သည်။ ဥပမာ ယူပါ- FROM ruby:2.5.5-stretch

P: အိုး၊ ငါမြင်တယ်။ ရနိုင်သောပုံများကိုမည်သို့နှင့်မည်သည့်နေရာတွင်ကြည့်ရှုနိုင်မည်နည်း။ ငါဘယ်ဟာလိုအပ်တယ်ဆိုတာ ဘယ်လိုသိနိုင်မလဲ။

AI- အများအားဖြင့် ပုံတွေကို ယူပါတယ်။ dockerhubpornhub နဲ့ မရောထွေးပါနဲ့ :) များသောအားဖြင့် ပုံတစ်ပုံအတွက် အစုအဝေးများစွာရှိသည်-
alpine: ပုံများကို 5 MB သာရှိသော minimalistic Linux ပုံပေါ်တွင် စုဆောင်းထားသည်။ ၎င်း၏အားနည်းချက်- ၎င်းကို ၎င်း၏ကိုယ်ပိုင် libc အကောင်အထည်ဖော်မှုဖြင့် စုစည်းထားပြီး စံပက်ကေ့ခ်ျများသည် ၎င်းတွင် အလုပ်မလုပ်ပါ။ လိုအပ်သော ပက်ကေ့ခ်ျကို ရှာဖွေခြင်းနှင့် ထည့်သွင်းခြင်းမှာ အချိန်များစွာ ယူရလိမ့်မည်။
ကုတ်ခြစ်ရာ: base image ကို အခြားပုံများ တည်ဆောက်ရာတွင် အသုံးမပြုပါ။ ၎င်းသည် binary၊ ပြင်ဆင်ထားသောဒေတာကို လုပ်ဆောင်ရန်အတွက်သာ ရည်ရွယ်ပါသည်။ GO အပလီကေးရှင်းများကဲ့သို့ သင်လိုအပ်သမျှ ပါဝင်သော ဒွိအပလီကေးရှင်းများကို လုပ်ဆောင်ရန်အတွက် စံပြဖြစ်သည်။
Ubuntu သို့မဟုတ် Debian ကဲ့သို့သော မည်သည့် OS ကိုမဆို အခြေခံထားသည်။ အင်း၊ ရှင်းပြစရာလိုမယ်မထင်ဘူး။

AI- ယခု ကျွန်ုပ်တို့သည် အပိုပစ္စည်းများအားလုံးကို ထည့်သွင်းရန် လိုအပ်ပါသည်။ packages များ နှင့် သင်၏ cache ကိုရှင်းလင်းပါ။ ပြီးတော့ ချက်ချင်း လွှင့်ပစ်လိုက်နိုင်တယ်။ တတ်လွယ်ခြင်းအဆင့်မြှင့်. သို့မဟုတ်ပါက၊ တည်ဆောက်မှုတစ်ခုစီတွင် အခြေခံပုံ၏ပုံသေ tag များရှိနေသော်လည်း မတူညီသောပုံများကို ရရှိမည်ဖြစ်သည်။ ပုံရှိ ပက်ကေ့ဂျ်များကို အပ်ဒိတ်လုပ်ခြင်းသည် ထိန်းသိမ်းသူ၏တာဝန်ဖြစ်ပြီး တဂ်ကို ပြောင်းလဲခြင်းဖြင့် လိုက်ပါသွားမည်ဖြစ်သည်။

P: ဟုတ်တယ်၊ ငါကြိုးစားခဲ့တယ်၊ အဲဒါက ဒီလို ဖြစ်သွားတယ်။

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/* 

ဒါတွေအားလုံးတော့ မဟုတ်ပါဘူး။ Ruby မင်းမှာ ဘာရှိလဲ။ ထို့နောက် အစတွင် ပရောဂျက်တစ်ခုလုံးကို ကူးယူရန် မလိုအပ်ပါ။ Gemfile နှင့် Gemfile.lock ကိုကူးယူရန်လုံလောက်ပါသည်။

ဤနည်းလမ်းဖြင့်၊ အရင်းအမြစ်ပြောင်းလဲမှုတိုင်းအတွက် အစုအဝေးထည့်သွင်းခြင်းကို လုပ်ဆောင်မည်မဟုတ်သော်လည်း Gemfile သို့မဟုတ် Gemfile.lock သည် ပြောင်းလဲသွားမှသာလျှင်။

တူညီသောနည်းလမ်းများသည် npm၊ pip၊ ရေးစပ်သူနှင့် မှီခိုမှုစာရင်းရှိသော ဖိုင်တစ်ခုပေါ်အခြေခံ၍ အခြားဘာသာစကားများဖြစ်သည့် npm၊ pip၊ ရေးဖွဲ့သူနှင့် အခြားဘာသာစကားများအတွက် အလုပ်လုပ်သည်။

နောက်ဆုံးအနေနဲ့ Docker သဘောတရား "one container - one process" အကြောင်းကို အစမှာ ပြောခဲ့တာ မှတ်မိပါသလား။ ဆိုလိုသည်မှာ ကြီးကြပ်ရေးမှူး မလိုအပ်ပါ။ တူညီသောအကြောင်းပြချက်များကြောင့် systemd ကိုမတပ်ဆင်သင့်ပါ။ တကယ်တော့ Docker ကိုယ်တိုင်က ကြီးကြပ်သူပါ။ ၎င်းတွင် လုပ်ငန်းစဉ်များစွာကို သင်လုပ်ဆောင်သည့်အခါ၊ ၎င်းသည် ကြီးကြပ်ရေးမှူးလုပ်ငန်းစဉ်တစ်ခုတွင် အက်ပ်များစွာကို လုပ်ဆောင်နေသကဲ့သို့ဖြစ်သည်။
တည်ဆောက်သည့်အခါတွင် သင်သည် ပုံတစ်ပုံတည်းကို ဖန်တီးမည်ဖြစ်ပြီး၊ လုပ်ငန်းစဉ်တစ်ခုစီတွင် လည်ပတ်နိုင်ရန် လိုအပ်သော ကွန်တိန်နာအရေအတွက်ကို စတင်လိုက်ပါ။

ဒါပေမယ့် နောက်ပိုင်းမှာ ပိုများတယ်။

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

ကွန်တိန်နာကိုစတင်သောအခါ daemons ၏ပစ်လွှတ်မှုကိုကျွန်ုပ်တို့ကျော်နိုင်ပါသလား။

AI: ဟုတ်တယ်၊ မှန်တယ်။ စကားမစပ်၊ သင်သည် CMD နှင့် ENTRYPOINT နှစ်မျိုးလုံးကို သုံးနိုင်သည်။ ပြီးတော့ မင်းရဲ့ အိမ်စာက ဘာကွာခြားလဲ ဆိုတာ အဖြေရှာကြည့်ပါ။ Habre တွင် ဤအကြောင်းအရာနှင့် ပတ်သက်၍ ကောင်းသောအချက်တစ်ခုရှိသည်။ ဆောင်းပါး.

ဒါဆို ဆက်သွားကြရအောင်။ သင်သည် node ကိုထည့်သွင်းရန် ဖိုင်တစ်ခုကို ဒေါင်းလုဒ်လုပ်သော်လည်း ၎င်းတွင် သင်လိုအပ်သောအရာများပါ၀င်မည်ဟု အာမခံချက်မရှိပါ။ အတည်ပြုချက်ထည့်ရန် လိုအပ်ပါသည်။ ဥပမာ၊ ဤကဲ့သို့သော၊

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/* 

checksum ကို အသုံးပြု၍ သင်သည် မှန်ကန်သောဖိုင်ကို ဒေါင်းလုဒ်လုပ်ထားကြောင်း အတည်ပြုနိုင်သည်။

P: ဒါပေမယ့် ဖိုင်ပြောင်းရင် build ပျက်သွားလိမ့်မယ်။

AI: ဟုတ်တယ်၊ ထူးဆန်းတာက၊ ဒါက အပေါင်းတစ်ခုလည်းဖြစ်တယ်။ ဖိုင်ပြောင်းသွားသည်ကို သင်သိမည်ဖြစ်ပြီး ထိုနေရာတွင် ပြောင်းလဲထားသည်ကို သင်တွေ့မြင်နိုင်မည်ဖြစ်သည်။ သင်ဘယ်တော့မှမသိနိုင်၊ သူတို့ရောက်ရှိနိုင်တဲ့ အရာအားလုံးကို ဖျက်ပစ်တဲ့ ဇာတ်ညွှန်းတစ်ခု ဒါမှမဟုတ် နောက်ခံတံခါးကို ဖန်တီးပေးတယ်လို့ သင်ဘယ်တော့မှ မပြောပြပါဘူး။

P: ကျေးဇူးတင်ပါတယ်။ နောက်ဆုံး Dockerfile သည် ဤကဲ့သို့ ဖြစ်နေမည် ဖြစ်သည် ။

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

P: Igor Ivanovich၊ မင်းရဲ့အကူအညီအတွက် ကျေးဇူးတင်ပါတယ်။ ငါပြေးဖို့အချိန်ရောက်ပြီ၊ ငါဒီနေ့ 10 ကြိမ်ထပ်လုပ်ရမယ်။

Igor Ivanovich သည် သူ့လုပ်ဖော်ကိုင်ဖက်ကို အလျင်စလိုငေးကြည့်ရင်း ရပ်လိုက်ပြီး ကော်ဖီပြင်းပြင်းလေးတငုံသောက်လိုက်သည်။ 99.9% SLA နှင့် bug-free ကုဒ်အကြောင်း စက္ကန့်အနည်းငယ်ကြာ စဉ်းစားပြီးနောက်၊ သူက မေးခွန်းတစ်ခုမေးသည်။

AI: မှတ်တမ်းတွေကို ဘယ်မှာ သိမ်းထားလဲ။

P: ဟုတ်ပါတယ်၊ production.log မှာ။ စကားမစပ်၊ ဟုတ်သည်၊ သို့သော် ssh မပါဘဲ ၎င်းတို့ကို မည်သို့ဝင်ရောက်နိုင်မည်နည်း။

AI- ၎င်းတို့ကို ဖိုင်များတွင် ထားခဲ့ပါက၊ သင့်အတွက် ဖြေရှင်းချက်တစ်ခု တီထွင်ထားပြီးဖြစ်သည်။ docker exec command သည် သင့်အား container တစ်ခုတွင် မည်သည့် command ကိုမဆို လုပ်ဆောင်ရန် ခွင့်ပြုသည်။ ဥပမာအားဖြင့်၊ သင်သည် ကြောင်ကို သစ်လုံးပြုလုပ်နိုင်သည်။ ပြီးတော့ သော့ကိုသုံးတယ်။ -အဲဒါ နှင့် run နေသော bash (ကွန်တိန်နာတွင်ထည့်သွင်းပါက) သည်သင့်အားကွန်တိန်နာသို့အပြန်အလှန်ဝင်ရောက်ခွင့်ပေးလိမ့်မည်။

ဒါပေမယ့် မှတ်တမ်းဖိုင်တွေကို သိမ်းဆည်းမထားသင့်ပါဘူး။ အနည်းဆုံးအားဖြင့်၊ ၎င်းသည် ကွန်တိန်နာ၏ အထိန်းအကွပ်မဲ့ ကြီးထွားမှုကို ဖြစ်စေပြီး သစ်လုံးများကို မည်သူမျှ လှည့်မကြည့်ပါ။ မှတ်တမ်းများအားလုံးကို stdout သို့ပေးပို့သင့်သည်။ အဲဒီမှာသူတို့ကို command ကိုသုံးပြီးကြည့်ရှုနိုင်ပါတယ်။ docker မှတ်တမ်းများ.

P: Igor Ivanovich၊ မှတ်တမ်းများကို အသုံးပြုသူဒေတာအဖြစ် Physical Node ပေါ်တွင် တပ်ဆင်ထားသော လမ်းညွှန်တစ်ခုတွင် ထည့်သွင်းနိုင်မည်ဖြစ်သည်။

AI- node ၏ဒစ်ပေါ်တွင် တင်ထားသောဒေတာကို ဖယ်ရှားရန် သင်မမေ့ခဲ့ပါက ကောင်းပါတယ်။ ၎င်းကို မှတ်တမ်းများဖြင့်လည်း လုပ်ဆောင်နိုင်သည်၊ လှည့်ခြင်းကို သတ်မှတ်ရန် မမေ့ပါနှင့်။
ဒါပဲ ပြေးလို့ရတယ်။

P: Igor Ivanovich၊ ဘာဖတ်ရမလဲ အကြံပေးနိုင်မလား။

AI : ပထမဦးစွာဖတ်ပါ။ Docker developer များမှ အကြံပြုချက်များDocker ကို သူတို့ထက် ပိုသိတာ ဘယ်သူမှ မရှိသလောက်ပါပဲ။

Internship လိုချင်ရင်၊ သွားလိုက်ပါ။ အကြိတ်အနယ်. တကယ်တော့ လက်တွေ့မပါတဲ့ သီအိုရီက သေသွားပြီ။

source: www.habr.com

မှတ်ချက် Add