Docker: မကောင်းသောအကြံဉာဏ်

Docker: မကောင်းသောအကြံဉာဏ်

ကားမောင်းဖို့ သင်ယူနေချိန် ပထမသင်ခန်းစာမှာ နည်းပြဆရာက လမ်းဆုံလမ်းခွကို ပြောင်းပြန်မောင်းလာပြီး လုံးဝမလုပ်သင့်ဘူးလို့ ပြောတယ်။ ဒီစည်းကမ်းကို ချက်ခြင်းသတိရပြီး တစ်သက်လုံး သတိရသွားတယ်။

ကလေးများအတွက် Grigory Oster မှ "မကောင်းတဲ့အကြံဉာဏ်" ကို သင်ဖတ်ပြီး ဒါကို မလုပ်သင့်တာကို အလွယ်တကူနဲ့ သဘာဝကျကျနဲ့ သိနိုင်ပါတယ်။

Dockerfile ကို မှန်ကန်စွာရေးသားနည်း ဆောင်းပါးများစွာကို ရေးသားထားသည်။ ဒါပေမယ့် Dockerfiles မမှန်မကန်ဘယ်လိုရေးရမလဲဆိုတဲ့ ညွှန်ကြားချက်တွေကို ကျွန်တော်မတွေ့မိပါဘူး။ ဒီကွက်လပ်ကို ငါဖြည့်နေတယ်။ ကျွန်ုပ်၏ ပံ့ပိုးကူညီမှုရရှိသည့် ပရောဂျက်များတွင်လည်း ထိုကဲ့သို့သော dockerfiles အနည်းငယ်သာ ရှိပါမည်။

ဇာတ်ကောင်များ၊ အခြေအနေများနှင့် Dockerfile အားလုံးသည် စိတ်ကူးယဉ်ဆန်သည်။ ကိုယ့်ကိုယ်ကို အသိအမှတ်မပြုရင် တောင်းပန်ပါတယ်။

Dockerfile တစ်ခုကို ဖန်တီးနေသည်၊ ထူးဆန်းပြီး ကြောက်မက်ဖွယ်ကောင်းသည်။

Peter (အကြီးတန်း java/rubby/php developer)- လုပ်ဖော်ကိုင်ဖက် Vasily၊ သင်သည် Docker သို့ module အသစ်တစ်ခုကို အပ်လုဒ်လုပ်ပြီးပြီလား။
Vasily (အငယ်တန်း)- မဟုတ်ဘူး၊ ငါ့မှာ အချိန်မရှိဘူး၊ ဒီ Docker နဲ့ ငါ အဖြေရှာလို့ မရဘူး။ ဆောင်းပါးတွေ အများကြီးရှိတယ်၊ ခေါင်းမူးတယ်။

Peter - လွန်ခဲ့တဲ့တစ်နှစ်လောက်က ကျွန်တော်တို့မှာ နောက်ဆုံးရက်ရှိတယ်။ ကူညီပါရစေ၊ လုပ်ငန်းစဉ်မှာ အဖြေထုတ်မယ်။ မင်းအတွက်အဆင်မပြေဘူးဆိုတာ ငါ့ကိုပြောပါ။

Vasily- အနည်းငယ်မျှသာရှိစေရန် အခြေခံပုံတစ်ပုံကို ကျွန်ုပ်မရွေးချယ်နိုင်ပါ၊ သို့သော် သင်လိုအပ်သမျှ ရှိပါသည်။
ပေတရု- ubuntu ပုံကိုယူပါ၊ သင်လိုအပ်သမျှပါရှိသည်။ ပြီးတော့ မလိုအပ်တဲ့ အရာတွေ အများကြီးက နောက်ပိုင်းမှာ အဆင်ပြေလာလိမ့်မယ်။ ဗားရှင်းအမြဲတမ်းနောက်ဆုံးပေါ်ဖြစ်နေစေရန် နောက်ဆုံးပေါ် tag ကိုထည့်ရန်မမေ့ပါနှင့်။

Dockerfile တွင် ပထမစာကြောင်း ပေါ်လာသည် ။

FROM ubuntu:latest

ပေတရု- နောက်တစ်ခုက ဘာလဲ။
Vasily - ထို့ကြောင့် ပတ္တမြား၊ ဝဘ်ဆာဗာတစ်ခုရှိပြီး ဝန်ဆောင်မှု daemons နှစ်ခုကို စတင်သင့်သည်။
Peter - ဟုတ်တယ်၊ ငါတို့ ဘာလိုသလဲ- ruby၊ bundler၊ nodejs၊ imagemagick နဲ့ တခြားဘာတွေလဲ... ပြီးတော့ တစ်ချိန်တည်းမှာပဲ ပက်ကေ့ဂျ်အသစ်တွေကို သေချာပေါက်ရဖို့အတွက် အဆင့်မြှင့်တင်မှုတစ်ခုလုပ်ပါ။
Vasily- ကျွန်ုပ်တို့သည် root အောက်တွင်မရှိစေရန်အသုံးပြုသူကိုဖန်တီးမည်မဟုတ်ပါ။
ပေတရု: ဟား၊ ဒါဆို မင်း အခွင့်အရေးတွေနဲ့ လှည့်စားနေသေးတယ်။
Vasily : အားလုံးကို command တစ်ခုထဲကို ပေါင်းထည့်ဖို့ 15 မိနစ်လောက် အချိန်လိုပါတယ်...
(ပီတာသည် စေ့စေ့စပ်စပ်နှင့် အလွန်ထက်မြက်သော ဂျူနီယာကို ရိုင်းရိုင်းစိုင်းစိုင်း နှောက်ယှက်သည်။)
ပေတရု- သီးခြား command များဖြင့်ရေးပါ၊ ၎င်းသည်ဖတ်ရန်ပိုမိုလွယ်ကူလိမ့်မည်။

Dockerfile ကြီးထွားလာသည်-

FROM ubuntu:latest
RUN apt-get update
RUN apt-get upgrade
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full
RUN gem install bundler
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/*

ထို့နောက် Igor Ivanovich၊ DevOps (ဒါပေမယ့် Dev ထက် Ops ပိုများသည်) က ရုံးခန်းထဲသို့ လှမ်းအော်သည်။

AI- Petya၊ မင်းရဲ့ developer တွေက အစားအသောက်ဒေတာဘေ့စ်ကို ထပ်ပြီးချိုးဖျက်လိုက်တာ၊ ဒါက ဘယ်တော့ပြီးမလဲ...

တိုက်ပွဲငယ်တစ်ခုပြီးနောက်၊ Igor Ivanovich စိတ်အေးသွားပြီး သူ့လုပ်ဖော်ကိုင်ဖက်များ ဤနေရာတွင် ဘာလုပ်နေသည်ကို စတင်သိရှိလာသည်။

AI : မင်း ဘာလုပ်နေတာလဲ။
Vasily- ပေတရုသည် မော်ဂျူးအသစ်အတွက် Dockerfile ဖန်တီးရန် ကူညီပေးနေသည်။
AI- ကြည့်ပါရစေ... မင်းဒီမှာ ဘာရေးထားလဲ၊ သီးခြား command နဲ့ repository ကိုရှင်းလိုက်၊ ဒါက နောက်ထပ်အလွှာတစ်ခုပါ... ဒါပေမယ့် Gemfile ကိုမကူးထားရင် ဘယ်လို install လုပ်မလဲ။ ယေဘုယျအားဖြင့်တော့ ဒါက မကောင်းပါဘူး။
ပေတရု- ကျေးဇူးပြုပြီး မင်းရဲ့လုပ်ငန်းကို သွားပါ၊ ငါတို့က အဲဒါကို တစ်နည်းနည်းနဲ့ ဖြေရှင်းလိုက်မယ်။

Igor Ivanovich က ဝမ်းနည်းစွာ သက်ပြင်းချလိုက်ပြီး ဒေတာဘေ့စ်ကို ဘယ်သူက ချိုးဖျက်လိုက်လဲ ဆိုတာ သိဖို့ ထွက်သွားခဲ့တယ်။

ပေတရု- ဟုတ်တယ်၊ ဒါပေမယ့် သူက ကုဒ်အကြောင်း မှန်တယ်၊ ငါတို့က အဲဒါကို ပုံထဲကို တွန်းပို့ရမယ်။ ပြီးလျှင် ssh နှင့် supervisor ကိုချက်ချင်းထည့်သွင်းကြပါစို့၊ မဟုတ်ပါက daemons ကိုစတင်ပါမည်။

Vasily- ထို့နောက် ကျွန်ုပ်သည် Gemfile နှင့် Gemfile.lock ကို ဦးစွာ ကူးယူမည်ဖြစ်ပြီး၊ ထို့နောက် အရာအားလုံးကို ထည့်သွင်းမည်ဖြစ်ပြီး၊ ထို့နောက် ပရောဂျက်တစ်ခုလုံးကို ကူးယူမည်ဖြစ်သည်။ Gemfile မပြောင်းပါက၊ layer ကို cache မှ ယူသွားပါမည်။
ပေတရု- မင်းဘာလို့ ဒီအလွှာတွေရှိနေတာလဲ၊ အရာအားလုံးကို တစ်ခါတည်း ကူးယူလိုက်။ ချက်ချင်းကူးယူပါ။ ပထမတန်း။

ယခု Dockerfile သည် ဤကဲ့သို့ ဖြစ်သည်-

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
RUN gem install bundler
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/* 

Peter: ဒါဆို ဘာဆက်လုပ်မလဲ။ ကြီးကြပ်ရေးမှူးအတွက် ပြင်ဆင်မှုများ ရှိပါသလား။
Vasily: မဟုတ်ဘူး၊ မဟုတ်ဘူး။ ဒါပေမယ့် ငါမြန်မြန်လုပ်မယ်။
Peter: ဒါဆို မင်းလုပ်မယ်။ အခုပဲ အရာအားလုံးကို စတင်နိုင်မယ့် init script ကို ပုံဖော်ကြည့်ရအောင်။ အိုကေ၊ ထို့ကြောင့် သင်သည် ssh၊ nohup ဖြင့် စတင်သည်၊ သို့မှသာ ကျွန်ုပ်တို့သည် ကွန်တိန်နာသို့ ချိတ်ဆက်၍ အမှားအယွင်းများကို ကြည့်ရှုနိုင်မည်ဖြစ်သည်။ ထို့နောက် ကြီးကြပ်ရေးမှူးကို ထိုနည်းအတိုင်း လုပ်ဆောင်ပါ။ ဒါဆို မင်းခရီးသည်ပဲ ပြေးမယ်။
မေး- ဒါပေမယ့် လုပ်ငန်းစဉ်တစ်ခုရှိသင့်တယ်လို့ ကျွန်တော်ဖတ်မိတယ်၊ ဒါကြောင့် Docker က တစ်ခုခုမှားသွားလို့ ကွန်တိန်နာကို ပြန်လည်စတင်နိုင်တယ်ဆိုတာကို Docker သိပါလိမ့်မယ်။
P : မင်းခေါင်းကို အဓိပ္ပါယ်မဲ့စွာ မနှောင့်ယှက်ပါနဲ့။ ယေဘုယျအားဖြင့်၊ ဘယ်လိုလဲ။ လုပ်ငန်းစဉ်တစ်ခုတည်းတွင် ဤအရာအားလုံးကို သင်မည်ကဲ့သို့လုပ်ဆောင်သနည်း။ Igor Ivanovich သည် တည်ငြိမ်မှုနှင့်ပတ်သက်၍ တွေးကြည့်ပါစေ၊ ၎င်းသည် လစာရရှိခြင်းအတွက် မဟုတ်ပါ။ ကျွန်တော်တို့အလုပ်က ကုဒ်ရေးဖို့ပါ။ ယေဘူယျအားဖြင့်၊ သူ့အတွက် Dockefile ကို ရေးပေးတဲ့အတွက် ကျေးဇူးတင်ကြောင်း ပြောပါစေ။

10 မိနစ်နှင့် ကြောင်များအကြောင်း ဗီဒီယိုနှစ်ကား အကြာတွင်။

မေး- ကျွန်တော် အကုန်ပြီးပြီ။ နောက်ထပ် မှတ်ချက်တွေ ထပ်ထည့်ခဲ့တယ်။
P: ငါ့ကိုပြပါ!

Dockerfile ၏နောက်ဆုံးထွက်ဗားရှင်း-

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

# Запускаем скрипт, при старте контейнера, который запустит все остальное.
CMD [“/app/init.sh”]

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

ကောင်းပြီ၊ ယခု ကျွန်ုပ်တို့တွင် လုံးဝကြောက်မက်ဖွယ်ကောင်းသော Dockerfile တစ်ခုရှိသည်၊ Igor Ivanovich နုတ်ထွက်လိုပြီး သူ့မျက်လုံးများသည် နောက်တစ်ပတ်အထိ နာကျင်စေမည့် မြင်ကွင်းတစ်ခုရှိသည်။ Dockerfile သည် ပို၍ပင်ဆိုးရွားနိုင်သည်၊ ပြီးပြည့်စုံရန်ကန့်သတ်ချက်မရှိပါ။ ဒါပေမယ့် အစပိုင်းမှာတော့ ဒီလိုလုပ်ပါလိမ့်မယ်။

Grigory Oster ၏ကိုးကားချက်ဖြင့် အဆုံးသတ်လိုပါသည်။

မသေချာသေးရင်
ဘဝလမ်းကို ငါတို့ရွေးချယ်ခဲ့တယ်
အဘယ့်ကြောင့်ဆိုသော် သင်မသိပါ။
မင်းရဲ့ အလုပ်ကြမ်းခရီးကို စတင်လိုက်ပါ
စင်္ကြံရှိ မီးသီးများကို ချိုးပါ-
လူတွေက မင်းကို "ကျေးဇူးတင်ပါတယ်" လို့ပြောလိမ့်မယ်။
လူတွေကို ကူညီမယ်။
လျှပ်စစ်ဓာတ်အား သိမ်းဆည်းပါ။

source: www.habr.com

မှတ်ချက် Add