ოპტიმიზაცია
ისწავლეთ Docker-ის image-ების, კონტეინერების და Docker-ის საერთო წარმადობის ოპტიმიზაცია
Docker-ის ოპტიმიზაცია
Docker-ის ოპტიმიზაცია მოიცავს image-ის ზომის, build-ის დროის, runtime წარმადობისა და რესურსების გამოყენების გაუმჯობესებას. ეს ოპტიმიზაციები იწვევს უფრო სწრაფ deployment-ებს, შემცირებულ ხარჯებსა და აპლიკაციის უკეთეს წარმადობას. კარგად ოპტიმიზირებული Docker გარემო უზრუნველყოფს რესურსების ეფექტურ გამოყენებას, უფრო სწრაფ CI/CD მილსადენებს, აპლიკაციის გაშვების გაუმჯობესებულ დროსა და გაძლიერებულ უსაფრთხოების მდგომარეობას.
Docker-ის ოპტიმიზაციას შეიძლება მივუდგეთ რამდენიმე კუთხით:
- Image-ის ოპტიმიზაცია: ზომის შემცირება და build-ის ეფექტურობის გაუმჯობესება
- Build-ის წარმადობა: image-ის შექმნის პროცესის დაჩქარება
- Runtime-ის ოპტიმიზაცია: კონტეინერის შესრულების ეფექტურობის გაძლიერება
- რესურსების მართვა: CPU-ს, მეხსიერებისა და I/O-ს გამოყენების კონტროლი
- ინფრასტრუქტურის ოპტიმიზაცია: Docker daemon-ისა და ჰოსტი სისტემის რეგულირება
Image-ის ოპტიმიზაცია
მრავალეტაპიანი Build-ები
გამოიყენეთ მრავალეტაპიანი build-ები უფრო მცირე production image-ების შესაქმნელად, build-დროის დამოკიდებულებების runtime მოთხოვნებისგან გამოყოფით:
მრავალეტაპიან build-ებს რამდენიმე უპირატესობა აქვს:
- დრამატულად მცირე საბოლოო image-ები (ხშირად 10-20-ჯერ ზომის შემცირება)
- build-დროისა და runtime დამოკიდებულებების გამოყოფა
- შემცირებული თავდასხმის ზედაპირი ნაკლები დაინსტალირებული პაკეტებით
- უკეთესი ფენების ქეშირება უფრო სწრაფი ხელახალი build-ებისთვის
- უფრო უსაფრთხო image-ები build ინსტრუმენტებისა და საწყისი კოდის გარეშე
ფენების მინიმიზაცია
Docker image-ები შედგება ფენებისგან და თითოეული ფენა ამატებს ზედნადებს. ოპტიმიზაცია მოახდინეთ არასაჭირო ფენების შემცირებით:
- გააერთიანეთ დაკავშირებული ბრძანებები ერთ RUN ინსტრუქციაში
- გამოიყენეთ && ბრძანებების ლოგიკურად დასაკავშირებლად
- გაასუფთავეთ დროებითი ფაილები და პაკეტების ქეშები იმავე ფენაში
- დააჯგუფეთ ინსტალაციები სტაბილურობის/ცვლილების სიხშირის მიხედვით
ყოველი ფენა:
- ამატებს მეტამონაცემების ზედნადებს (ჩვეულებრივ ~4KB თითო ფენაზე)
- გავლენას ახდენს build-ისა და pull-ის დროზე
- გავლენას ახდენს ფენების ქეშის ეფექტურობაზე
- ხელს უწყობს image-ის ზომის საერთო სირთულეს
მიუხედავად იმისა, რომ Docker-ს აქვს 127 ფენის მკაცრი ლიმიტი, კარგი წესია, რომ production image-ში 20-ზე ნაკლები ფენა გქონდეთ.
გამოიყენეთ .dockerignore
შექმენით .dockerignore ფაილი არასაჭირო ფაილების build კონტექსტიდან გამოსარიცხად. ეს ამცირებს build-ის დროს, კონტექსტის ზომას და ხელს უშლის მგრძნობიარე ინფორმაციის image-ებში მოხვედრას:
კარგად კონფიგურირებული .dockerignore-ის უპირატესობები:
- ამცირებს build კონტექსტის ზომას (შეუძლია build-ის დროის მნიშვნელოვნად გაუმჯობესება)
- ხელს უშლის არასაჭირო ქეშის ინვალიდაციას
- აუმჯობესებს უსაფრთხოებას საიდუმლოებებისა და რწმუნებათა სიგელების გამორიცხვით
- ხდის build-ებს უფრო დეტერმინისტულს ცვლადი შინაარსის გამორიცხვით
- ამცირებს გამტარუნარიანობის გამოყენებას build კონტექსტის დისტანციურ Docker daemon-ებზე გადაცემისას
ასევე შეგიძლიათ გამოიყენოთ ნიმუშების დამთხვევა .gitignore-ის მსგავსად:
**/temp*- ემთხვევა ნებისმიერ ფაილს ან დირექტორიას, რომელიც იწყება "temp"-ით!important.log- უარყოფს წინა ნიმუშს, important.log-ის ჩათვლით#comment- კომენტარები დოკუმენტაციისთვის
შეარჩიეთ შესაბამისი საბაზისო Image-ები
საბაზისო image-ის შერჩევა მნიშვნელოვნად მოქმედებს image-ის ზომაზე, უსაფრთხოებასა და წარმადობაზე:
- გამოიყენეთ ოფიციალური slim ან alpine ვარიანტები
- Alpine: უკიდურესად მცირე (~5MB), მაგრამ იყენებს musl libc-ს glibc-ის ნაცვლად
- Slim ვარიანტები: შეკვეცილი ოფიციალური image-ები მინიმალური პაკეტებით (~40-60MB)
- Debian/Ubuntu-ზე დაფუძნებული image-ები: უკეთესი თავსებადობა, მაგრამ უფრო დიდი ზომა
- განიხილეთ distroless image-ები production-ისთვის
- შეიცავს მხოლოდ თქვენს აპლიკაციას და მის runtime დამოკიდებულებებს
- არ აქვს პაკეტების მენეჯერი, shell, ან სხვა უტილიტები
- მინიმალური თავდასხმის ზედაპირი და მცირე ზომა
- მაგალითები:
gcr.io/distroless/java,gcr.io/distroless/nodejs - რთული დებაგინგისთვის, მაგრამ შესანიშნავია უსაფრთხოებისთვის
- იყავით კონკრეტული image-ის თეგებთან
- ყოველთვის გამოიყენეთ ვერსიის ცხადი თეგები (მაგ.,
node:16.14.2-alpine3.15) - მოერიდეთ
latestთეგს განმეორებადი build-ებისთვის - განიხილეთ image-ის დაიჯესტების გამოყენება უცვლელობისთვის:
node@sha256:3e36d7d8458e14... - დააბალანსეთ სიახლე და სტაბილურობა ვერსიების არჩევისას
- ყოველთვის გამოიყენეთ ვერსიის ცხადი თეგები (მაგ.,
- აირჩიეთ აპლიკაციის მოთხოვნების მიხედვით
- CPU არქიტექტურის თავსებადობა (x86_64, ARM64 და ა.შ.)
- საჭირო სისტემური ბიბლიოთეკები და დამოკიდებულებები
- უსაფრთხოების პატჩების განახლების სიხშირე
- საზოგადოების მხარდაჭერა და დოკუმენტაცია
საბაზისო image-ის ზომის შედარება:
განიხილეთ სტანდარტიზებული, უსაფრთხოების თვალსაზრისით გამკაცრებული საბაზისო image-ების შექმნა თქვენი ორგანიზაციისთვის, რომლებიც მოიცავს საერთო კონფიგურაციებს, მონიტორინგის აგენტებსა და უსაფრთხოების პატჩებს.
Build-ის წარმადობა
მოახდინეთ თქვენი Docker build პროცესის ოპტიმიზაცია ამ ტექნიკით:
- ეფექტურად გამოიყენეთ build ქეში
- დაალაგეთ ინსტრუქციები ნაკლებად ხშირად ცვლადიდან ყველაზე ხშირად ცვლადამდე
- დაყავით გრძელი RUN ბრძანებები ცვლილების სიხშირის მიხედვით
- გამოიყენეთ COPY კონკრეტული გზებით COPY . .-ის ნაცვლად
- შეინახეთ დამოკიდებულებები აპლიკაციის კოდისგან ცალკე
- დაალაგეთ Dockerfile-ის ინსტრუქციები ცვლილების სიხშირის მიხედვით
- განათავსეთ OS განახლებები და ინსტრუმენტების ინსტალაციები პირველ რიგში
- დააინსტალირეთ დამოკიდებულებები აპლიკაციის კოდის კოპირებამდე
- განათავსეთ ხშირად ცვლადი ფაილები Dockerfile-ის ბოლოს
- დააჯგუფეთ დაკავშირებული ინსტალაციები ქეშის მაქსიმალური გამოყენებისთვის
- გამოიყენეთ BuildKit პარალელური build-ისთვის
- იძლევა დამოუკიდებელი build ეტაპების ერთდროულად დამუშავების საშუალებას
- უზრუნველყოფს გაუმჯობესებულ ქეშირების შესაძლებლობებს
- მხარს უჭერს build საიდუმლოებებს საბოლოო image-ში გაჟონვის გარეშე
- გვთავაზობს უფრო სწრაფ, უფრო ეფექტურ build-ებს ზოგადად
- ამუშავებს build მიმაგრებებს ეფემერული ოპერაციებისთვის
- დანერგეთ CI/CD ქეშირების სტრატეგიები
- დააქეშეთ დამოკიდებულებები მილსადენის გაშვებებს შორის
- გამოიყენეთ registry-ზე დაფუძნებული ფენების ქეშირება CI სისტემებში
- დანერგეთ ქეშის გახურება საერთო საბაზისო image-ებისთვის
- განიხილეთ ცალკეული მილსადენები საბაზისო და აპლიკაციის image-ებისთვის
- დააქეშეთ build არტეფაქტები მრავალეტაპიანი build-ებისთვის
- განიხილეთ დისტანციური build ქეშირება
- გააზიარეთ build ქეში სხვადასხვა მანქანებს/გარემოებს შორის
- დანერგეთ ცენტრალიზებული ქეშირების გადაწყვეტილებები
- გამოიყენეთ registry-ზე დაფუძნებული ქეშირება განაწილებული გუნდებისთვის
- დააკონფიგურირეთ inline ქეშის მეტამონაცემები ქეშის განაწილებისთვის
- დააბალანსეთ ქეშის ზომა და მოვლის ზედნადები
Dockerfile-ში გამოიყენეთ BuildKit-სპეციფიური ფუნქციები სინტაქსის დირექტივით:
კონტეინერის Runtime ოპტიმიზაცია
Runtime ოპტიმიზაცია უზრუნველყოფს, რომ კონტეინერები მუშაობენ ეფექტურად, საიმედოდ და უსაფრთხოდ deployment-ისას. ეს ოპტიმიზაციები გავლენას ახდენს რესურსების გამოყენებაზე, გაშვების დროზე, სტაბილურობასა და უსაფრთხოების მდგომარეობაზე.
რესურსების შეზღუდვები
შესაბამისი რესურსების ლიმიტების დაყენება ხელს უშლის კონტეინერებს გადაჭარბებული რესურსების მოხმარებაში ან მეზობელ კონტეინერებზე ზემოქმედებაში:
ამ შეზღუდვებს რამდენიმე უპირატესობა აქვს:
- პროგნოზირებადი წარმადობა რესურსების იზოლაციის გზით
- დაცვა "ხმაურიანი მეზობლის" პრობლემებისგან
- გაუმჯობესებული ჰოსტის სტაბილურობა რესურსების გამოფიტვის თავიდან აცილებით
- უფრო ზუსტი სიმძლავრის დაგეგმვა და დაგეგმვა
- უკეთესი მომსახურების ხარისხის (QoS) მართვა
რესურსების შეზღუდვები უნდა იყოს მორგებული თითოეული აპლიკაციის საჭიროებებზე და დაფუძნებული წარმადობის პროფაილირებაზე და არა თვითნებურ მნიშვნელობებზე.
მხოლოდ წაკითხვადი ფაილური სისტემა
მხოლოდ წაკითხვადი ფაილური სისტემების გამოყენება მნიშვნელოვან უსაფრთხოების უპირატესობებს იძლევა, კონტეინერის შინაარსის runtime-ში მოდიფიკაციის თავიდან აცილებით:
ეს მიდგომა:
- ხელს უშლის აპლიკაციის ბინარების runtime მოდიფიკაციას
- ამსუბუქებს გარკვეული ტიპის შეტევების გავლენას
- აიძულებს მუდმივი მონაცემების სათანადო ექსტერნალიზაციას
- ხდის კონტეინერებს უფრო უცვლელსა და პროგნოზირებადს
- ეხმარება აპლიკაციის ვარაუდების იდენტიფიცირებაში ფაილურ სისტემაზე წვდომის შესახებ
აპლიკაციებს შეიძლება დასჭირდეთ ადაპტაცია მხოლოდ წაკითხვად ფაილურ სისტემებთან სამუშაოდ, განსაკუთრებით მათ, რომლებიც ცდილობენ ჩაწერონ თავიანთ ინსტალაციის დირექტორიებში ან ელიან დროებითი ფაილების შექმნას არასტანდარტულ ადგილებში.
სათანადო გაჩერების სიგნალი
შესაბამისი გაჩერების სიგნალების კონფიგურაცია უზრუნველყოფს კონტეინერის კორექტულ შეწყვეტას, მონაცემთა კორუფციისა და სერვისის შეფერხების თავიდან აცილებით:
კონტეინერის სასიცოცხლო ციკლის სიგნალების გაგება:
- SIGTERM (ნაგულისხმევი): ითხოვს კორექტულ შეწყვეტას, იძლევა გასუფთავების საშუალებას
- SIGKILL: დაუყოვნებლივი იძულებითი შეწყვეტა, გასუფთავება შეუძლებელია
- SIGINT: ტერმინალის შეწყვეტა (Ctrl+C-ს მსგავსად), შეიძლება განსხვავებულად დამუშავდეს
- SIGHUP: ტერმინალის გათიშვა, ზოგიერთი აპლიკაცია იყენებს კონფიგურაციის ხელახლა ჩატვირთვისთვის
სათანადო შეწყვეტის დამუშავება მოიცავს:
- აპლიკაცია იჭერს და ამუშავებს SIGTERM-ს
- ასრულებს მიმდინარე ტრანზაქციებს
- სწორად ხურავს მონაცემთა ბაზის კავშირებს
- ასრულებს დისკზე ჩაწერას და ასუფთავებს ბუფერებს
- რეგისტრაციიდან იხსნება სერვისების აღმოჩენისას
- აბრუნებს შესაბამის გასვლის კოდს
მორგებული აპლიკაციებისთვის, დანერგეთ სათანადო სიგნალების დამმუშავებლები:
Healthcheck-ები
Healthcheck-ები ეხმარება Docker-ს კონტეინერის ჯანმრთელობის მონიტორინგში და არაჯანსაღი კონტეინერების ავტომატურ გადატვირთვაში. ისინი განასხვავებენ გაშვებულ კონტეინერებსა და გამართულად მომუშავე აპლიკაციებს შორის:
Healthcheck-ის პარამეტრების ახსნა:
- interval: დრო შემოწმებებს შორის (ნაგულისხმევი: 30წმ)
- timeout: მაქსიმალური დრო შემოწმების დასასრულებლად (ნაგულისხმევი: 30წმ)
- start-period: საშეღავათო პერიოდი ინიციალიზაციისთვის (ნაგულისხმევი: 0წმ)
- retries: ზედიზედ წარუმატებლობების რაოდენობა არაჯანსაღად ჩათვლამდე (ნაგულისხმევი: 3)
ეფექტური healthcheck ბრძანებები უნდა:
- იყოს მსუბუქი და სწრაფად შესრულებადი
- ამოწმებდეს კრიტიკულ აპლიკაციის ფუნქციონალობას
- ჰქონდეს მინიმალური დამოკიდებულებები
- აბრუნებდეს შესაბამის გასვლის კოდებს (0 = ჯანსაღი, 1 = არაჯანსაღი)
- თავიდან აიცილოს ცრუ დადებითი/უარყოფითი შედეგები
- მოიცავდეს გონივრულ тайმაუტებს
მაგალითები სხვადასხვა ტიპის აპლიკაციებისთვის:
Healthcheck-ები საშუალებას აძლევს ორკესტრაციის პლატფორმებს მიიღონ ინტელექტუალური დაგეგმვის გადაწყვეტილებები და უზრუნველყონ წარუმატებელი კონტეინერების ავტომატური გამოსწორება.
ქსელის წარმადობა
ქსელის წარმადობამ შეიძლება მნიშვნელოვნად იმოქმედოს კონტეინერებს შორის კომუნიკაციის შეყოვნებაზე, გამტარუნარიანობასა და აპლიკაციის საერთო წარმადობაზე. Docker გთავაზობთ რამდენიმე ქსელის ოპტიმიზაციის ოფციას:
ქსელის რეჟიმის მოსაზრებები:
- bridge: ნაგულისხმევი რეჟიმი, უზრუნველყოფს იზოლაციას NAT-ით (მცირე ზედნადები)
- host: იზიარებს ჰოსტის ქსელის სტეკს (საუკეთესო წარმადობა, შემცირებული იზოლაცია)
- overlay: მრავალ-ჰოსტიანი ქსელი, უფრო მაღალი ზედნადები, მაგრამ აუცილებელია swarm-ისთვის
- macvlan: ანიჭებს MAC მისამართს კონტეინერს (თითქმის მშობლიური წარმადობა)
- none: ქსელური კავშირის გარეშე, უმაღლესი იზოლაცია
წარმადობაზე მოქმედი ფაქტორები:
- კონტეინერებს შორის კომუნიკაციის ზედნადები
- NAT წარმადობა მაღალი გამტარუნარიანობის სერვისებზე
- DNS რეზოლუციის შეყოვნება
- MTU-ს შეუსაბამობა, რომელიც იწვევს ფრაგმენტაციას
- ქსელის დრაივერის იმპლემენტაციის განსხვავებები
საცავის ოპტიმიზაცია
საცავის კონფიგურაცია მნიშვნელოვნად მოქმედებს Docker-ის წარმადობაზე, საიმედოობასა და მონაცემთა მდგრადობაზე:
- აირჩიეთ შესაბამისი საცავის დრაივერი
- overlay2 (ნაგულისხმევი): საუკეთესო ზოგადი დანიშნულების ოფცია თანამედროვე სისტემებისთვის
- devicemapper: უკეთესია მაღალი I/O დატვირთვისთვის (გამოიყენეთ direct-lvm რეჟიმი)
- btrfs/zfs: გაფართოებული ფუნქციები, მაგრამ მოითხოვს კონკრეტული ფაილური სისტემის მხარდაჭერას
- aufs: მოძველებული ოფცია, ზოგადად მოერიდეთ ახალ deployment-ებში
- შეამოწმეთ სხვადასხვა დრაივერები თქვენი კონკრეტული სამუშაო დატვირთვისთვის
- გაითვალისწინეთ გავლენა image-ის ფენებსა და build-ის წარმადობაზე
- გამოიყენეთ volume mount-ები I/O ინტენსიური ოპერაციებისთვის
- გვერდი აუარეთ საცავის დრაივერის ზედნადებს მონაცემთა ბაზებისა და ჩაწერა-ინტენსიური დატვირთვებისთვის
- დასახელებული volume-ები უზრუნველყოფს საუკეთესო წარმადობას მუდმივი მონაცემებისთვის
- მოერიდეთ bind mount-ებს production-ში, როდესაც შესაძლებელია
- განიხილეთ ლოკალური SSD volume-ები წარმადობა-კრიტიკული დატვირთვებისთვის
- გამოიყენეთ tmpfs mount-ები ეფემერული, მაღალსიჩქარიანი მონაცემებისთვის
- მაგალითი:
docker run -v db-data:/var/lib/postgresql/data postgres:13
- დააკონფიგურირეთ volume mount ოფციები კონკრეტული სამუშაო დატვირთვებისთვის
- გამოიყენეთ
delegatedანcachedmount-ის თანმიმდევრულობა development-ისთვის - დანერგეთ volume დრაივერები კონკრეტული საცავის backend-ებისთვის
- დააკონფიგურირეთ შესაბამისი ფაილური სისტემის თვისებები (noatime, nodiratime)
- განიხილეთ ფაილური სისტემის ტიპები, რომლებიც ოპტიმიზირებულია კონკრეტული დატვირთვებისთვის
- გამოიყენეთ შესაბამისი volume ლეიბლები ორგანიზაციისთვის
- მაგალითი:
docker run -v $(pwd):/code:cached,ro my-app:latest
- გამოიყენეთ
- დააკვირდეთ საცავის გამოყენებას
- თვალყური ადევნეთ კონტეინერის, volume-ისა და image-ის დისკის გამოყენებას
- დააყენეთ შეტყობინებები დისკის სივრცის ზღვრებისთვის
- დანერგეთ მონიტორინგი I/O წარმადობის მეტრიკებისთვის
- გამოიყენეთ
docker system dfსივრცის გამოყენების გასაანალიზებლად - დააკვირდეთ საცავის გაჟონვას ლოგებიდან ან დროებითი ფაილებიდან
- იდენტიფიცირეთ კონტეინერები გადაჭარბებული ჩაწერის გაძლიერებით
- დანერგეთ რეგულარული გასუფთავება
- მოახდინეთ გამოუყენებელი კონტეინერების, volume-ებისა და image-ების გასუფთავების ავტომატიზაცია
- დანერგეთ ლოგების როტაცია და ზომის ლიმიტები
- დააკონფიგურირეთ შესაბამისი კონტეინერის გადატვირთვის პოლიტიკები
- დააყენეთ დაგეგმილი მოვლის ფანჯრები
- შექმენით გასუფთავების პოლიტიკები ასაკისა და გამოყენების ნიმუშების მიხედვით
- მაგალითი:
docker system prune --volumes --filter "until=168h"
მეხსიერების მართვა
მეხსიერების სათანადო მართვა კრიტიკულია კონტეინერის სტაბილურობის, ჰოსტის დაცვისა და რესურსების ეფექტური გამოყენებისთვის. მეხსიერების ლიმიტების გარეშე კონტეინერებს შეუძლიათ მოიხმარონ მთელი ხელმისაწვდომი სისტემის მეხსიერება, რაც იწვევს არასტაბილურობას.
მეხსიერების ლიმიტები
- დააყენეთ შესაბამისი მეხსიერების ლიმიტები
- აპლიკაციის პროფაილირებაზე დაყრდნობით და არა ვარაუდით
- ჩართეთ ზღვარი garbage collection-ისა და პიკური გამოყენებისთვის
- გაითვალისწინეთ როგორც resident set size (RSS), ასევე ვირტუალური მეხსიერება
- დააბალანსეთ ზედმეტად შემზღუდველ (ავარიები) და ზედმეტად გულუხვ (დანაკარგი) ლიმიტებს შორის
- მაგალითი:
--memory=512m --memory-reservation=384m - სხვადასხვა აპლიკაციას აქვს მეხსიერების გამოყენების სხვადასხვა ნიმუში:
- JVM: გაითვალისწინეთ heap ზომა + metaspace + მშობლიური მეხსიერება
- Node.js: V8 heap + ბუფერების განაწილება
- Python: ინტერპრეტატორის ზედნადები + აპლიკაციის მეხსიერება
- დააკონფიგურირეთ swap-ის ქცევა
--memory-swap: მთლიანი მეხსიერება+swap ლიმიტი--memory-swappiness=0: შეამცირეთ swap-ი მინიმუმამდე- მთლიანად გამორთეთ swap შეყოვნება-მგრძნობიარე აპლიკაციებისთვის
- მონაცემთა ბაზებისთვის, დააკონფიგურირეთ შესაბამისი swappiness
- მაგალითი:
--memory=1g --memory-swap=1g(swap-ის გარეშე)
- დააკვირდეთ მეხსიერების გამოყენებას
- თვალყური ადევნეთ როგორც მიმდინარე, ასევე პიკურ მეხსიერების გამოყენებას
- იდენტიფიცირეთ მეხსიერების გაჟონვა ტრენდული მონაცემებით
- დააკვირდეთ garbage collection-ის სიხშირესა და ხანგრძლივობას
- გააანალიზეთ OOM kill მოვლენები
- ინსტრუმენტები:
docker stats, cAdvisor, Prometheus მეტრიკები - ბრძანებები:
- გამოიყენეთ cgroup შეზღუდვები
- ბირთვის მეხსიერების ლიმიტები:
--kernel-memory=64m - CPU-სა და მეხსიერების წნევის კორელაცია
- რბილი vs მყარი ლიმიტები: რეზერვაცია vs ლიმიტი
- cgroup v2 მხარდაჭერა გაუმჯობესებული მეხსიერების აღრიცხვისთვის
- მაგალითი:
--memory-reservation=256m --memory=512m
- ბირთვის მეხსიერების ლიმიტები:
- დანერგეთ OOM დამუშავება
--oom-kill-disable: თავიდან აიცილეთ OOM killer (გამოიყენეთ სიფრთხილით)--oom-score-adj: დაარეგულირეთ OOM kill პრიორიტეტი (-1000-დან 1000-მდე)- სათანადო აპლიკაციის დონის შეცდომების დამუშავება
- კორექტული დეგრადაცია მეხსიერების წნევის ქვეშ
- ჯანმრთელობის მონიტორინგი მეხსიერებასთან დაკავშირებული პრობლემების გამოსავლენად
- OOM-ცნობიერი აპლიკაციის დიზაინი
- მაგალითი:
--oom-score-adj=-500(ნაკლებად სავარაუდოა, რომ გაითიშოს)
მეხსიერების პარამეტრები Compose-ში
განსაზღვრეთ ყოვლისმომცველი მეხსიერების შეზღუდვები Docker Compose-ში განმეორებადი მრავალკონტეინერიანი deployment-ებისთვის:
Production-ში გამოყენებისთვის, განიხილეთ ეს დამატებითი მეხსიერების ოპტიმიზაციის ტექნიკა:
- JVM/runtime-სპეციფიური მეხსიერების დროშების დაყენება გარემოს ცვლადების საშუალებით
- აპლიკაციის სერვერის პარამეტრების კორექტირება (workers, threads, connection pools)
- მონაცემთა ბაზის მეხსიერების განაწილების პარამეტრების დაზუსტება
- კორექტული დეგრადაციის დანერგვა მეხსიერების წნევის ქვეშ
- health check-ების გამოყენება, რომლებიც აკვირდებიან მეხსიერების გამოყენებას
მეხსიერების მონიტორინგი
მეხსიერების ყოვლისმომცველი მონიტორინგი ეხმარება პრობლემების იდენტიფიცირებას, სანამ ისინი შეფერხებებს გამოიწვევენ და უზრუნველყოფს მონაცემებს სათანადო ზომის დასადგენად:
მეხსიერების ანალიზის გაფართოებული ინსტრუმენტები:
cAdvisorდეტალური კონტეინერის მეხსიერების მეტრიკებისთვისPrometheus + Grafanaვიზუალიზაციისა და შეტყობინებებისთვისdocker-topპროცესის დონის მეხსიერების ხილვადობისთვის კონტეინერებშიmemory-profilerაპლიკაცია-სპეციფიური მეხსიერების ანალიზისთვისpmapპროცესის მეხსიერების მიბმისთვის (მოითხოვს პრივილეგირებულ წვდომას)
მეხსიერების გამოყენების ნიმუშები
CPU-ს ოპტიმიზაცია
CPU-ს სათანადო მართვა უზრუნველყოფს რესურსების სამართლიან განაწილებას, პროგნოზირებად წარმადობასა და ეფექტურ ჰოსტის გამოყენებას:
CPU-ს განაწილების ოფციების გაგება:
- cpus: მარტივი აბსოლუტური ლიმიტი (მაგ., 0.5 = ნახევარი CPU ბირთვი)
- cpu-shares: შედარებითი წონა კონკურენციისას (არ აქვს ეფექტი, როდესაც CPU უხვადაა)
- cpuset-cpus: მყარი მიბმა კონკრეტულ CPU ბირთვებზე
- cpu-period/cpu-quota: დეტალური CFS კონტროლი (quota/period = CPU ლიმიტი)
CPU-ს ოპტიმიზაციის მოსაზრებები:
- შეუსაბამეთ CPU ლიმიტები აპლიკაციის საჭიროებებს პროფაილირებაზე დაყრდნობით
- გაითვალისწინეთ NUMA ეფექტები მეხსიერება-ინტენსიური აპლიკაციებისთვის
- დააბალანსეთ იზოლაცია და რესურსების ეფექტური გამოყენება
- დააკვირდეთ CPU-ს შეზღუდვის მეტრიკებს არასწორი კონფიგურაციის გამოსავლენად
- განიხილეთ CPU affinity ქეშ-მგრძნობიარე დატვირთვებისთვის
- დააყენეთ შესაბამისი ლიმიტები როგორც პიკური, ასევე მდგრადი დატვირთვებისთვის
Docker Daemon-ის ოპტიმიზაცია
თავად Docker daemon-ი შეიძლება დარეგულირდეს უკეთესი წარმადობის, უსაფრთხოებისა და რესურსების გამოყენებისთვის. ეს პარამეტრები გავლენას ახდენს ჰოსტზე არსებულ ყველა კონტეინერზე.
Daemon-ის კონფიგურაცია
შეცვალეთ /etc/docker/daemon.json გლობალური პარამეტრების კონფიგურაციისთვის:
მნიშვნელოვანი daemon-ის პარამეტრები გასათვალისწინებლად:
- storage-driver: შეარჩიეთ შესაბამისი დრაივერი სამუშაო დატვირთვისთვის (overlay2 რეკომენდებულია)
- live-restore: შეინარჩუნეთ კონტეინერები გაშვებული daemon-ის გადატვირთვისას
- max-concurrent-downloads/uploads: დაარეგულირეთ ქსელისა და დისკის I/O-ს მიხედვით
- registry-mirrors: დააყენეთ pull-through ქეში ხშირად გამოყენებული image-ებისთვის
- default-runtime: შეარჩიეთ კონტეინერის runtime (runc, containerd და ა.შ.)
- init: ყოველთვის გამოიყენეთ init პროცესი უკეთესი სიგნალების დამუშავებისა და zombie-ების თავიდან აცილებისთვის
- icc: კონტეინერებს შორის კომუნიკაციის კონტროლი (false უკეთესი უსაფრთხოებისთვის)
- default-ulimits: დააყენეთ შესაბამისი ფაილების დესკრიპტორისა და პროცესის ლიმიტები
- metrics-addr: ჩართეთ Prometheus მეტრიკების ენდფოინთი
ლოგირების კონფიგურაცია
- გამოიყენეთ შესაბამისი ლოგ დრაივერები
json-file: ნაგულისხმევი, ინახავს ლოგებს JSON ფაილებად ჰოსტზეlocal: ახალი ოპტიმიზირებული ლოკალური ლოგირების დრაივერიsyslog: გადაგზავნა syslog daemon-თანjournald: გადაგზავნა systemd journal-თანsplunk,awslogs,gelf: გაგზავნა გარე ლოგირების სისტემებშიnone: ლოგირების გამორთვა წარმადობა-კრიტიკული აპლიკაციებისთვის
- დააკონფიგურირეთ ლოგების როტაცია
- დააყენეთ
max-sizeინდივიდუალური ლოგ ფაილის ზომის შესაზღუდად - დააყენეთ
max-fileშესანახი ლოგ ფაილების რაოდენობის გასაკონტროლებლად - ჩართეთ
compressდისკის გამოყენების შესამცირებლად - განიხილეთ დროზე დაფუძნებული როტაცია შესაბამისობის მოთხოვნებისთვის
- დანერგეთ ჰოსტის დონის ლოგების მართვა Docker-ის საკუთარი ლოგებისთვის
- დააყენეთ
- განიხილეთ ცენტრალიზებული ლოგირება
- მოახდინეთ კონტეინერის ლოგების აგრეგაცია Elasticsearch-ში, Splunk-ში ან მსგავს სისტემაში
- დანერგეთ სტრუქტურირებული ლოგირება უკეთესი ძებნადობისთვის
- დააკონფიგურირეთ სათანადო შენახვის პოლიტიკები სხვადასხვა ტიპის ლოგებისთვის
- დააყენეთ მონიტორინგი და შეტყობინებები ლოგების ნიმუშებზე დაყრდნობით
- შეინახეთ ლოგები ეფემერული კონტეინერებიდან
- შეზღუდეთ ლოგ ფაილის ზომა
- თავიდან აიცილეთ დისკის სივრცის გამოფიტვა "მოლაპარაკე" კონტეინერებისგან
- დააყენეთ შესაბამისი ლიმიტები აპლიკაციის სიტყვაუხვიანობის მიხედვით
- დააკვირდეთ ლოგების მოცულობასა და ზრდის ტემპს
- შეატყობინეთ ლოგების მოცულობის უჩვეულო ზრდაზე
- დანერგეთ საგანგებო გასუფთავება უკონტროლო ლოგირებისთვის
- აკონტროლეთ ლოგირების სიტყვაუხვიანობა
- დააკონფიგურირეთ აპლიკაციის ლოგების დონეები შესაბამისად
- გაფილტრეთ არარელევანტური ლოგები შენახვამდე
- დანერგეთ ნიმუშების აღება მაღალი მოცულობის ლოგების წყაროებისთვის
- გამოიყენეთ გარემოს ცვლადები ლოგების სიტყვაუხვიანობის გასაკონტროლებლად
- განიხილეთ სხვადასხვა სიტყვაუხვიანობა სხვადასხვა გარემოსთვის
სისტემის დონის ოპტიმიზაციები
- გაზარდეთ ფაილების დესკრიპტორების ლიმიტები ჰოსტ OS-ში
- დააკონფიგურირეთ შესაბამისი I/O scheduler-ი საცავის მოწყობილობებისთვის
- დაარეგულირეთ ბირთვის პარამეტრები კონტეინერის დატვირთვებისთვის:
- გამორთეთ SWAP პროგნოზირებადი კონტეინერის წარმადობისთვის
- გამოიყენეთ მაღალი წარმადობის საცავი Docker-ის მონაცემთა დირექტორიისთვის
- დააკონფიგურირეთ შესაბამისი CPU governor-ი სამუშაო დატვირთვის ტიპისთვის
Development-ის ოპტიმიზაცია
მოახდინეთ თქვენი development სამუშაო პროცესის ოპტიმიზაცია უფრო სწრაფი იტერაციებისა და უკეთესი დეველოპერის გამოცდილებისთვის:
- გამოიყენეთ bind mount-ები საწყისი კოდისთვის development-ის დროს
- მიამაგრეთ ლოკალური საწყისი კოდის დირექტორიები პირდაპირ კონტეინერებში
- ცვლილებები დაუყოვნებლივ აისახება image-ების ხელახალი build-ის გარეშე
- გამოიყენეთ შესაბამისი mount-ის თანმიმდევრულობის ოფციები წარმადობისთვის
- მაგალითი:
docker run -v $(pwd):/app:cached my-dev-image - გაითვალისწინეთ წარმადობაზე გავლენა სხვადასხვა პლატფორმაზე
- დანერგეთ hot reloading
- დააკონფიგურირეთ აპლიკაციები ავტომატურად გადაიტვირთოს კოდის ცვლილებებზე
- გამოიყენეთ development სერვერები watch შესაძლებლობებით (nodemon, webpack-dev-server და ა.შ.)
- შეინარჩუნეთ აპლიკაციის მდგომარეობა კოდის ცვლილებების დროს
- შეამცირეთ კონტეინერის გადატვირთვის საჭიროება
- მაგალითი (Node.js): გამოიყენეთ nodemon watch დირექტორიებით
- გააზიარეთ დამოკიდებულების ქეშები build-ებს შორის
- მიამაგრეთ პაკეტების მენეჯერის ქეშები როგორც volume-ები
- დრამატულად შეამცირეთ დამოკიდებულების ჩამოტვირთვის დრო
- შეინარჩუნეთ ცალკეული volume-ები სხვადასხვა პროექტებისთვის
- მაგალითები:
- გამოიყენეთ dev-სპეციფიური Docker Compose კონფიგურაციები
- შექმენით development-სპეციფიური compose ფაილები
- გადაფარეთ production პარამეტრები development-ისთვის
- ჩართეთ დებაგინგი, hot reload და dev ინსტრუმენტები
- მიამაგრეთ საწყისი კოდი და development უტილიტები
- მაგალითი:
- გამოიყენეთ Development Containers
- გამოიყენეთ Visual Studio Code Remote Containers ან GitHub Codespaces
- შექმენით თანმიმდევრული development გარემოები გუნდში
- თავიდან აიცილეთ "ჩემს მანქანაზე მუშაობს" პრობლემები
- ჩართეთ dev ინსტრუმენტები, გაფართოებები და კონფიგურაციები
- შეინარჩუნეთ development კონტეინერის სპეციფიკაციები ვერსიების კონტროლში
- მაგალითი
.devcontainer/devcontainer.json:
Production-ის ოპტიმიზაცია
Production გარემოსთვის, მოახდინეთ კონტეინერების ოპტიმიზაცია საიმედოობის, უსაფრთხოების, წარმადობისა და დაკვირვებადობისთვის:
Production-ის ოპტიმიზაცია მოიცავს მრავალ განზომილებას:
- მაღალი ხელმისაწვდომობა: რეპლიკები, მოძრავი განახლებები, health check-ები
- უსაფრთხოება: მხოლოდ წაკითხვადი ფაილური სისტემა, მოშორებული შესაძლებლობები, seccomp პროფილები
- რესურსების მართვა: ზუსტი CPU/მეხსიერების ლიმიტები და რეზერვაციები
- დაკვირვებადობა: ლოგირება, health check-ები, მონიტორინგი
- წარმადობის რეგულირება: აპლიკაცია-სპეციფიური ოპტიმიზაციები
- დამოკიდებულების მართვა: სათანადო გაშვების რიგი და health check-ები
- საიდუმლოებების დამუშავება: რწმუნებათა სიგელებისა და სერტიფიკატების უსაფრთხო ინექცია
- მონაცემთა მდგრადობა: სათანადოდ კონფიგურირებული volume-ები შესაბამისი დრაივერებით
წარმადობის გაზომვა
სისტემატური წარმადობის გაზომვა აუცილებელია ოპტიმიზაციების ვალიდაციისა და ბოთლის ყელების იდენტიფიცირებისთვის. დანერგეთ ყოვლისმომცველი ბენჩმარკინგისა და მონიტორინგის პრაქტიკები კონტეინერის წარმადობის მახასიათებლების გასაგებად.
ბენჩმარკინგი
- გამოიყენეთ Docker stats რეალურ დროში მეტრიკებისთვის
- დანერგეთ აპლიკაციის დონის მეტრიკები
- ინსტრუმენტირება გაუკეთეთ კოდს Prometheus კლიენტის ბიბლიოთეკებით
- გაზომეთ კრიტიკული ბიზნეს ოპერაციების შეყოვნება
- თვალყური ადევნეთ რესურსების გამოყენებას აპლიკაციის შიგნიდან
- დააკვირდეთ ქეშის დარტყმის სიხშირესა და მონაცემთა ბაზის მოთხოვნების წარმადობას
- თვალყურის დევნების მეტრიკების მაგალითი:
- მოთხოვნის შეყოვნების პროცენტილები (p50, p95, p99)
- მოთხოვნის გამტარუნარიანობა (მოთხოვნები წამში)
- შეცდომების სიხშირე და ტიპები
- ბიზნეს ტრანზაქციები წამში
- რიგის სიღრმეები და დამუშავების დროები
- შეადარეთ ოპტიმიზაციებამდე და შემდეგ
- შექმენით განმეორებადი ბენჩმარკის სცენარები
- დაადოკუმენტირეთ საბაზისო წარმადობის მეტრიკები
- იზოლირება გაუკეთეთ ცვლადებს ცვლილებების ტესტირებისას
- გაზომეთ გავლენა როგორც საშუალო, ასევე კუდის შეყოვნებაზე
- გაითვალისწინეთ ოპტიმიზაციების ხარჯები
- ბენჩმარკინგის სამუშაო პროცესის მაგალითი:
- თვალყური ადევნეთ build-ისა და გაშვების დროს
- გაზომეთ სრული CI/CD მილსადენის ხანგრძლივობა
- დაყავით build-ის ფაზები მიზნობრივი ოპტიმიზაციისთვის
- თვალყური ადევნეთ image-ის pull-ის დროს სხვადასხვა გარემოში
- გაზომეთ დრო პირველ მოთხოვნამდე აპლიკაციებისთვის
- დააკვირდეთ ცივი და თბილი გაშვების წარმადობას
- გაზომვის სკრიპტის მაგალითი:
- გაზომეთ image-ების ზომები
- თვალყური ადევნეთ ფენების შემადგენლობასა და ზომებს
- შეადარეთ შეკუმშული და არაშეკუმშული image-ების ზომები
- გააანალიზეთ image-ის შემადგენლობა ისეთი ინსტრუმენტებით, როგორიცაა dive
- დააკავშირეთ image-ის ზომა pull-ის დროსთან
- თვალყური ადევნეთ image-ის ზომის ევოლუციას დროთა განმავლობაში
- ბრძანებების მაგალითი:
მონიტორინგის ინსტრუმენტები
- Docker stats: ძირითადი ჩაშენებული რესურსების მონიტორინგი
- cAdvisor: კონტეინერ-სპეციფიური მეტრიკები ისტორიული მონაცემებით
- Prometheus: დროის სერიების მეტრიკების შენახვა და გამოთხოვა
- შეაგროვეთ კონტეინერისა და ჰოსტის მეტრიკები
- შეინახეთ ისტორიული წარმადობის მონაცემები
- შექმენით შეტყობინებები წარმადობის ზღვრებზე დაყრდნობით
- PromQL მაგალითები კონტეინერის მონიტორინგისთვის:
- Grafana dashboards: ვიზუალიზაცია და დაფები
- შექმენით მორგებული დაფები სხვადასხვა დაინტერესებული მხარეებისთვის
- დააყენეთ შეტყობინებები წარმადობის ზღვრებზე დაყრდნობით
- მოახდინეთ ტრენდების ვიზუალიზაცია დროთა განმავლობაში
- დააკავშირეთ მეტრიკები სისტემის კომპონენტებს შორის
- დაფის პანელების მაგალითი:
- კონტეინერის CPU-სა და მეხსიერების გამოყენება
- ქსელის I/O კონტეინერის მიხედვით
- დისკის ოპერაციები და გამტარუნარიანობა
- აპლიკაცია-სპეციფიური მეტრიკები
- Health check-ის სტატუსი და ისტორია
- Docker Desktop მეტრიკები: ლოკალური development-ის მონიტორინგი
- რესურსების გამოყენების მონიტორინგი Docker Desktop-ში
- კონტეინერის ინსპექტირება და პრობლემების მოგვარება
- ქსელის ტრაფიკის ვიზუალიზაცია
- დისკის გამოყენების ანალიზი
- გაფართოების პლაგინები გაუმჯობესებული მონიტორინგისთვის
- სპეციალიზებული მონიტორინგის ინსტრუმენტები
- Sysdig: კონტეინერისა და სისტემის ღრმა მონიტორინგი
- Datadog: კომერციული APM და ინფრასტრუქტურის მონიტორინგი
- New Relic: აპლიკაციისა და ინფრასტრუქტურის წარმადობა
- Dynatrace: სრული სტეკის მონიტორინგი AI შესაძლებლობებით
- Elastic APM: ღია კოდის აპლიკაციის წარმადობის მონიტორინგი
გასუფთავება და მოვლა
რეგულარული გასუფთავება და მოვლა აუცილებელია ჯანსაღი Docker გარემოს შესანარჩუნებლად, დისკის სივრცის პრობლემების თავიდან ასაცილებლად და წარმადობის ოპტიმიზაციისთვის:
მოვლის საუკეთესო პრაქტიკები:
- რეგულარული გასუფთავება: დანერგეთ დაგეგმილი გასუფთავებები შესაბამისი ფილტრებით
- მონიტორინგი: დააყენეთ შეტყობინებები დისკის სივრცის გამოყენებაზე Docker დირექტორიებში
- იარუსიანი მიდგომა: გამოიყენეთ სხვადასხვა გასუფთავების სტრატეგიები გარემოს კრიტიკულობის მიხედვით
- შენახვის პოლიტიკები: განსაზღვრეთ, რამდენ ხანს შეინახოთ გამოუყენებელი რესურსები
- Image-ის სასიცოცხლო ციკლი: დაადგინეთ პოლიტიკები image-ების ვერსიონირებისა და გასუფთავებისთვის
- მნიშვნელოვანი მონაცემების სარეზერვო ასლის შექმნა: დარწმუნდით, რომ მნიშვნელოვანი მონაცემების მქონე volume-ები დარეზერვებულია
- Image-ების გამოყენების აუდიტი: რეგულარულად გადახედეთ, რომელი image-ები გამოიყენება აქტიურად
- ლოგების მართვა: დააკონფიგურირეთ სათანადო ლოგების როტაცია და შენახვა
გაფართოებული ოპტიმიზაციის ტექნიკები
სპეციალიზებული სამუშაო დატვირთვებისთვის, რომლებსაც აქვთ ექსტრემალური წარმადობის, უსაფრთხოების ან საიმედოობის მოთხოვნები, განიხილეთ ეს გაფართოებული ტექნიკა:
- მორგებული init სისტემები
- შეცვალეთ ნაგულისხმევი init სპეციალიზებული ალტერნატივებით
- გამოიყენეთ tini სათანადო სიგნალების დამუშავებისა და zombie-ების მოსაშორებლად
- დანერგეთ s6 ან dumb-init უფრო რთული ინიციალიზაციისთვის
- შექმენით მსუბუქი init კონკრეტული აპლიკაციის საჭიროებებისთვის
- დააკონფიგურირეთ როგორც ნაგულისხმევი daemon.json-ში ან Dockerfile-ში:
- ბირთვის გაფართოებული რეგულირება
- დააკონფიგურირეთ sysctl-ები კონკრეტული სამუშაო დატვირთვის ნიმუშებისთვის
- მოახდინეთ მეხსიერების მართვის პარამეტრების ოპტიმიზაცია
- Tune network stack for high-throughput or low-latency
- დაარეგულირეთ I/O scheduler-ი სამუშაო დატვირთვის მახასიათებლებისთვის
- Example sysctls for high-performance applications:
- კონტეინერ-სპეციფიური sysctl-ები
- გამოიყენეთ კონკრეტული ბირთვის პარამეტრები ინდივიდუალურ კონტეინერებზე
- შექმენით მორგებული sysctl პროფილები სხვადასხვა სამუშაო დატვირთვის ტიპებისთვის
- დანერგეთ namespace-სპეციფიური sysctl-ები იზოლაციისთვის
- გამოიყენეთ პრივილეგირებული კონტეინერები გაძლიერებული შესაძლებლობებისთვის (სიფრთხილით)
- Example container with real-time scheduling:
- ქსელის პაკეტების ოპტიმიზაცია
- დააკონფიგურირეთ jumbo frame-ები მაღალი გამტარუნარიანობის დატვირთვებისთვის
- დანერგეთ TSO/GSO/GRO offloading ქსელის წარმადობისთვის
- დაარეგულირეთ TCP პარამეტრები კონკრეტული ქსელის პირობებისთვის
- გამოიყენეთ DPDK ან SR-IOV პირდაპირი აპარატურული წვდომისთვის
- Configure low-latency network settings:
- სპეციალიზებული საცავის დრაივერები
- შეარჩიეთ ოპტიმალური საცავის დრაივერი სამუშაო დატვირთვის ნიმუშისთვის
- დანერგეთ პირდაპირი volume mount-ები I/O-ინტენსიური ოპერაციებისთვის
- გამოიყენეთ volume პლაგინები სპეციალიზებული საცავის სისტემებისთვის
- დააკონფიგურირეთ ფაილური სისტემა-სპეციფიური mount ოფციები
- Example high-performance storage configuration:
- მორგებული უსაფრთხოების პროფილები
- შექმენით აპლიკაცია-სპეციფიური seccomp პროფილები
- დანერგეთ AppArmor ან SELinux პოლიტიკები
- გამოიყენეთ მინიმალური შესაძლებლობების ნაკრებები
- დააკონფიგურირეთ namespacing და იზოლაცია
- Example with custom security profiles:
- CPU-ს იზოლაცია და NUMA ოპტიმიზაცია
- მიაბით კონტეინერები კონკრეტულ NUMA კვანძებს
- დააკონფიგურირეთ CPU ნაკრებები წარმადობა-კრიტიკული დატვირთვებისთვის
- გამოიყენეთ CPU იზოლაცია ბირთვის პარამეტრებით
- დანერგეთ მეხსიერებისა და I/O NUMA ცნობიერება
- NUMA-ცნობიერი კონტეინერის მაგალითი:
- მეხსიერების მორგებული მართვა
- დააკონფიგურირეთ huge page-ები მონაცემთა ბაზის ან მაღალი წარმადობის აპლიკაციებისთვის
- დანერგეთ მეხსიერების განაწილების სტრატეგიები
- ოპტიმიზაცია მოახდინეთ მეხსიერების პულებისა და ბუფერების ზომებზე
- აკონტროლეთ მეხსიერების აღდგენის პოლიტიკები
- დააკონფიგურირეთ ტრანსპარენტული huge page-ები შესაბამისი დატვირთვებისთვის
- huge page-ების კონფიგურაციის მაგალითი:
ოპტიმიზაციის ჩამონათვალი
Docker-ის ოპტიმიზაციის ყოვლისმომცველი მიდგომა უნდა მოიცავდეს კონტეინერის სასიცოცხლო ციკლის ყველა ასპექტს, image-ის აგებიდან runtime წარმადობამდე.
Image-ის ოპტიმიზაცია
- მრავალეტაპიანი build-ები
- გამოყავით build-დროის და runtime დამოკიდებულებები
- გამოიყენეთ შესაბამისი საბაზისო image-ები თითოეული ეტაპისთვის
- დააკოპირეთ მხოლოდ აუცილებელი არტეფაქტები ეტაპებს შორის
- განიხილეთ ცალკეული ეტაპები ტესტირებისა და production-ისთვის
- მინიმალური საბაზისო image-ები
- გამოიყენეთ მსუბუქი ვარიანტები (alpine, slim, distroless)
- წაშალეთ არასაჭირო პაკეტები და ინსტრუმენტები
- შეარჩიეთ შესაბამისი ბაზა თავსებადობის vs. ზომის მიხედვით
- განიხილეთ მორგებული ორგანიზაციული საბაზისო image-ები
- განაახლეთ საბაზისო image-ები უსაფრთხოებისთვის
- ფენების ოპტიმიზაცია
- გააერთიანეთ დაკავშირებული ოპერაციები ერთ RUN ინსტრუქციაში
- დაალაგეთ ფენები ნაკლებად ხშირად ცვლადიდან ყველაზე ხშირად ცვლადამდე
- გაასუფთავეთ პაკეტების მენეჯერის ქეშები იმავე ფენაში
- გამოიყენეთ მრავალხაზიანი არგუმენტები წაკითხვადობისთვის
- შეინარჩუნეთ ფენების რაოდენობა გონივრულ ფარგლებში (20-ზე ნაკლები)
- სათანადო ქეშირება
- გამოიყენეთ BuildKit-ის გაუმჯობესებული ქეშირება
- გამოიყენეთ .dockerignore არასაჭირო კონტექსტის თავიდან ასაცილებლად
- დაყავით დამოკიდებულებები და აპლიკაციის კოდი
- განიხილეთ ქეშის ცხადი მიმაგრება დამოკიდებულებებისთვის
- დანერგეთ registry-ზე დაფუძნებული ქეშირება CI/CD-სთვის
- ეფექტური COPY და RUN
- დააკოპირეთ მხოლოდ ის, რაც საჭიროა (მოერიდეთ COPY . .)
- გამოიყენეთ wildcard ნიმუშები დაკავშირებული ფაილებისთვის
- დანერგეთ ჯაჭვური ბრძანებები სათანადო გასუფთავებით
- დააყენეთ შესაბამისი სამუშაო დირექტორიები
- გამოიყენეთ ADD მხოლოდ მაშინ, როდესაც ამოღების ფუნქციონალია საჭირო
Build-ის ოპტიმიზაცია
- BuildKit-ი ჩართულია
- დააყენეთ DOCKER_BUILDKIT=1 გარემოს ცვლადი
- დააკონფიგურირეთ daemon.json-ში სისტემის მასშტაბით გამოყენებისთვის
- გამოიყენეთ BuildKit-სპეციფიური ფუნქციები, როდესაც მიზანშეწონილია
- დანერგეთ SSH და საიდუმლოების მიმაგრება უსაფრთხო build-ებისთვის
- გამოიყენეთ პარალელური ეტაპის შესრულება
- დალაგებული ინსტრუქციები
- განათავსეთ იშვიათად ცვლადი ბრძანებები პირველ რიგში
- დააჯგუფეთ დაკავშირებული ბრძანებები ლოგიკურად
- დაყავით გრძელი RUN ბრძანებები სტრატეგიულად
- მოაწყვეთ მაქსიმალური ქეშის ეფექტურობისთვის
- შეინარჩუნეთ წაკითხვადობა და შენარჩუნებადობა
- Build-ის ქეშირება
- დანერგეთ სათანადო ფენების ქეშირების სტრატეგია
- გამოიყენეთ ქეშის მიმაგრებები პაკეტების მენეჯერებისთვის
- განიხილეთ გარე ქეშის საცავი CI/CD-სთვის
- დანერგეთ ქეშის გახურება ხშირად აგებული image-ებისთვის
- პერიოდულად გაასუფთავეთ გამოუყენებელი ქეში
- CI/CD ინტეგრაცია
- დააკონფიგურირეთ შესაბამისი ქეშირება მილსადენებში
- დანერგეთ მატრიცული build-ები, სადაც მიზანშეწონილია
- გამოიყენეთ build არგუმენტები გარემო-სპეციფიური build-ებისთვის
- დაათეგეთ image-ები მნიშვნელოვანი მეტამონაცემებით
- დანერგეთ მოწყვლადობის სკანირება მილსადენში
- პარალელური build-ები
- დააპროექტეთ მრავალეტაპიანი build-ები პარალელიზაციისთვის
- შეინარჩუნეთ ეტაპები დამოუკიდებელი, სადაც შესაძლებელია
- გამოიყენეთ BuildKit-ის ავტომატური პარალელიზაცია
- მოახდინეთ build ინფრასტრუქტურის შესაბამისი მასშტაბირება
- დააკვირდეთ build-ის წარმადობის მეტრიკებს
Runtime-ის ოპტიმიზაცია
- რესურსების ლიმიტები
- დააყენეთ შესაბამისი CPU-სა და მეხსიერების შეზღუდვები
- დააკონფიგურირეთ სათანადო swap-ის ქცევა
- დანერგეთ რესურსების მონიტორინგი
- გამოიყენეთ რესურსების რეზერვაციები ორკესტრაციაში
- დააბალანსეთ რესურსების ეფექტურობა და საიმედოობა
- სათანადო ქსელი
- შეარჩიეთ შესაბამისი ქსელის დრაივერები
- ოპტიმალურად დააკონფიგურირეთ DNS პარამეტრები
- დანერგეთ კავშირების pooling
- განიხილეთ service mesh რთული აპლიკაციებისთვის
- დააკვირდეთ ქსელის წარმადობის მეტრიკებს
- Volume-ის ოპტიმიზაცია
- გამოიყენეთ შესაბამისი volume დრაივერები დატვირთვებისთვის
- დანერგეთ ქეშირების სტრატეგიები მიმაგრებული volume-ებისთვის
- დააკონფიგურირეთ სათანადო mount ოფციები
- დააკვირდეთ volume-ის წარმადობას
- განიხილეთ სპეციალიზებული საცავი I/O-ინტენსიური დატვირთვებისთვის
- ლოგირების კონფიგურაცია
- შეარჩიეთ შესაბამისი ლოგირების დრაივერები
- დანერგეთ ლოგების როტაცია და ზომის ლიმიტები
- განიხილეთ სტრუქტურირებული ლოგირების ფორმატები
- დააკონფიგურირეთ ცენტრალიზებული ლოგირება
- დანერგეთ ლოგების დონის მართვა
- მონიტორინგის დაყენება
- განათავსეთ ყოვლისმომცველი კონტეინერის მონიტორინგი
- დანერგეთ health check-ები
- დააკონფიგურირეთ შეტყობინებები რესურსების შეზღუდვებზე
- თვალყური ადევნეთ აპლიკაცია-სპეციფიკურ მეტრიკებს
- დანერგეთ tracing განაწილებული სისტემებისთვის
წარმადობის პრობლემების მოგვარება
წარმადობის პრობლემების დიაგნოსტიკისას:
- იდენტიფიცირეთ ბოთლის ყელები მეტრიკების გამოყენებით
- გამოიყენეთ
docker statsრესურსების გამოყენების შესამოწმებლად - დააკვირდით CPU-ს, მეხსიერების, I/O-სა და ქსელის მეტრიკებს
- მოძებნეთ რესურსების გაჯერება ან შეზღუდვა
- გააანალიზეთ მეტრიკები დროთა განმავლობაში, არა მხოლოდ დროის მომენტში
- შეამოწმეთ კორელაციები მეტრიკებს შორის
- გამოიყენეთ
- შეადარეთ საბაზისო წარმადობას
- შეინახეთ ისტორიული წარმადობის მონაცემები
- დაადოკუმენტირეთ მოსალოდნელი წარმადობის მახასიათებლები
- გაზომეთ გადახრა ნორმალური ნიმუშებიდან
- გამოიყენეთ პროცენტილზე დაფუძნებული გაზომვები, არა მხოლოდ საშუალოები
- განიხილეთ დატვირთვის ტესტირება პრობლემების რეპროდუცირებისთვის
- იზოლირება გაუკეთეთ კონტეინერის vs. ჰოსტის პრობლემებს
- შეამოწმეთ ჰოსტის დონის რესურსების გამოყენება
- შეამოწმეთ სხვადასხვა კონტეინერის კონფიგურაციებით
- გაუშვით კონტეინერები სხვადასხვა ჰოსტზე, თუ შესაძლებელია
- გააანალიზეთ მეზობელი კონტეინერების გავლენა
- განიხილეთ ბირთვისა და OS-ის დონის პარამეტრები
- გადახედეთ რესურსების განაწილებას
- დაადასტურეთ კონტეინერის რესურსების ლიმიტები და მოთხოვნები
- შეამოწმეთ CPU-ს შეზღუდვა (
docker statsCPU% >100%) - მოძებნეთ მეხსიერების წნევა და swapping
- გააანალიზეთ დისკის I/O ლოდინის დროები
- შეამოწმეთ ქსელის გამტარუნარიანობის შეზღუდვები
- შეამოწმეთ რესურსების კონკურენცია
- მოძებნეთ "ხმაურიანი მეზობლები" გაზიარებულ ჰოსტებზე
- გააანალიზეთ დისკის I/O კონკურენცია
- შეამოწმეთ ქსელის კონკურენცია
- დააკვირდეთ CPU steal დროს ვირტუალიზებულ გარემოში
- განიხილეთ გამოყოფილი რესურსები კრიტიკული დატვირთვებისთვის
- გაანალიზეთ აპლიკაცია-სპეციფიური მეტრიკები
- გადახედეთ აპლიკაციის ლოგებს შეცდომების ან გაფრთხილებებისთვის
- შეამოწმეთ კავშირების pooling-ის ეფექტურობა
- გააანალიზეთ მონაცემთა ბაზის მოთხოვნების წარმადობა
- დააკვირდეთ აპლიკაციის thread/process-ების რაოდენობას
- შეამოწმეთ garbage collection-ის ნიმუშები
- საჭიროების შემთხვევაში, გაუკეთეთ პროფაილირება აპლიკაციის კოდს
- გავრცელებული წარმადობის პრობლემები და გადაწყვეტილებები:
- მაღალი CPU გამოყენება: კოდის ოპტიმიზაცია, CPU ლიმიტების გაზრდა, ან ჰორიზონტალური მასშტაბირება
- მეხსიერების გაჟონვა: აპლიკაციის კოდის გასწორება, მონიტორინგის გაზრდა, სათანადო GC-ს დანერგვა
- I/O ბოთლის ყელები: volume mount-ების გამოყენება, უფრო სწრაფი საცავი, ან I/O-ს რეგულირება
- ქსელის შეყოვნება: ქსელის სტეკის ოპტიმიზაცია, ზონებს შორის ტრაფიკის შემცირება
- ნელი გაშვება: image-ის ზომის ოპტიმიზაცია, lazy loading-ის დანერგვა, ქეშების გახურება