რა არის კონტეინერები?
კონტეინერები არის მსუბუქი, დამოუკიდებელი და შესრულებადი პროგრამული პაკეტები, რომლებიც შეიცავს ყველაფერს, რაც საჭიროა პროგრამის გასაშვებად, მათ შორის კოდს, runtime-ს, სისტემურ ინსტრუმენტებს, ბიბლიოთეკებსა და პარამეტრებს.
კონტეინერები წყვეტენ "ჩემს კომპიუტერზე მუშაობს" პრობლემას, აპლიკაციების დამოკიდებულებებთან ერთად შეფუთვით, რაც უზრუნველყოფს თანმიმდევრულ შესრულებას სხვადასხვა გარემოში. ისინი უზრუნველყოფენ იზოლირებულ შესრულების გარემოს, რომელიც:
- უზრუნველყოფს თანმიმდევრულ ქცევას development, testing და production გარემოში
- საშუალებას აძლევს აპლიკაციებს საიმედოდ იმუშაონ ერთი გამოთვლითი გარემოდან მეორეში გადატანისას
- ხელს უწყობს მიკროსერვისების არქიტექტურას ინდივიდუალური კომპონენტების იზოლირებით
- ხელს უწყობს DevOps პრაქტიკას განმეორებადი deployment-ებით
- მაქსიმალურად ზრდის რესურსების გამოყენებას ტრადიციულ deployment მეთოდებთან შედარებით
თავის არსში, კონტეინერები ეყრდნობა Linux-ის ბირთვის ისეთ ფუნქციებს, როგორიცაა namespaces იზოლაციისთვის და cgroups რესურსების შეზღუდვისთვის. Docker ამატებს ინსტრუმენტების ფენას, რომელიც ამ შესაძლებლობებს ხელმისაწვდომს და მართვადს ხდის.
კონტეინერები vs ვირტუალური მანქანები
ვირტუალური მანქანებისგან განსხვავებით, კონტეინერები ახდენენ ოპერაციული სისტემის ვირტუალიზაციას და არა აპარატურის. ეს მათ უფრო მსუბუქს და პორტატულს ხდის.
ძირითადი განსხვავებები:
| მახასიათებელი | კონტეინერები | ვირტუალური მანქანები |
|---|---|---|
| ვირტუალიზაცია | OS-დონის ვირტუალიზაცია | აპარატურის ვირტუალიზაცია |
| ზომა | როგორც წესი, მბ | როგორც წესი, გბ |
| გაშვების დრო | წამები | წუთები |
| რესურსების ზედნადები | მინიმალური | მნიშვნელოვანი |
| იზოლაცია | პროცესის იზოლაცია | სრული იზოლაცია |
| ოპერაციული სისტემა | იზიარებს მასპინძელი OS-ის ბირთვს | აწარმოებს სრულ OS-ს |
| სიმჭიდროვე | მაღალი (ათობით ასეულამდე თითო მასპინძელზე) | დაბალი (როგორც წესი, 5-10 თითო მასპინძელზე) |
კონტეინერები უზრუნველყოფენ თითქმის ბუნებრივ შესრულებას მინიმალური ზედნადებით, ხოლო VM-ები გვთავაზობენ უფრო ძლიერ იზოლაციას, მაგრამ მეტი რესურსის მოთხოვნით. ბევრი თანამედროვე ინფრასტრუქტურა იყენებს ორივე ტექნოლოგიას ერთად, კონტეინერების გამოყენებით აპლიკაციებისთვის და VM-ების ინფრასტრუქტურის სეგმენტაციისთვის.
ძირითადი კონცეფციები
Image-ები
Docker image-ები არის მხოლოდ წაკითხვადი შაბლონები, რომლებიც გამოიყენება კონტეინერების შესაქმნელად. ისინი შეიცავენ:
- აპლიკაციის კოდს
- Runtime გარემოს
- დამოკიდებულებებს
- სისტემურ ინსტრუმენტებს
- სისტემურ ბიბლიოთეკებს
Image-ები აგებულია ფენებად, სადაც თითოეული ფენა წარმოადგენს ფაილური სისტემის ცვლილებების ერთობლიობას. ეს ფენოვანი მიდგომა უზრუნველყოფს ეფექტურ შენახვასა და გადაცემას, რადგან იდენტური ფენების გაზიარება შესაძლებელია მრავალ image-ს შორის. Image-ები განისაზღვრება Dockerfile-ებით, რომლებიც შეიცავს image-ის აგების ინსტრუქციებს.
კონტეინერები
კონტეინერები არის Docker image-ების გაშვებული ინსტანციები, რომელთა:
- გაშვება
- შეჩერება
- გადაადგილება
- წაშლა შესაძლებელია
თითოეულ კონტეინერს აქვს საკუთარი:
- ფაილური სისტემა (ჩაწერადი ფენით მხოლოდ წაკითხვადი image-ის თავზე)
- ქსელის ინტერფეისი საკუთარი IP მისამართით
- პროცესების namespace (იზოლაცია სხვა პროცესებისგან)
- რესურსების განაწილება (CPU და მეხსიერების ლიმიტები)
კონტეინერები დიზაინით ეფემერულია, რაც ნიშნავს, რომ მათი შექმნა და განადგურება შესაძლებელია აპლიკაციის ფუნქციონირებაზე ზემოქმედების გარეშე.
Registry
Registry ინახავს Docker image-ებს. Docker Hub არის ნაგულისხმევი საჯარო registry.
Registry-ები ემსახურება როგორც ცენტრალიზებული საცავები Docker image-ების შესანახად და გასავრცელებლად. ისინი უზრუნველყოფენ:
- კონტეინერის image-ების ვერსიების კონტროლს
- გუნდის წევრებს შორის თანამშრომლობას
- უწყვეტი ინტეგრაციისა და deployment-ის სამუშაო პროცესებს
- საჯარო და კერძო image-ების გავრცელებას
Docker Hub-ის გარდა, არსებობს მრავალი registry-ის ვარიანტი, მათ შორის:
- GitHub Container Registry
- Amazon Elastic Container Registry (ECR)
- Google Container Registry (GCR)
- Azure Container Registry (ACR)
- თვით-ჰოსტირებული ვარიანტები, როგორიცაა Harbor ან Nexus
კონტეინერის ძირითადი ბრძანებები
თითოეულ ამ ბრძანებას აქვს დამატებითი ოფციები, რომლებიც კონტეინერის ქცევის დეტალური კონტროლის საშუალებას იძლევა. გამოიყენეთ docker <command> --help ნებისმიერი ბრძანების ოფციების სრული სპექტრის სანახავად.
საუკეთესო პრაქტიკები
- გამოიყენეთ ოფიციალური image-ები, როდესაც შესაძლებელია
- ოფიციალური image-ები შენარჩუნებულია, უსაფრთხოების პატჩებით და იცავენ საუკეთესო პრაქტიკებს
- ისინი უზრუნველყოფენ თანმიმდევრულ ბაზას თქვენი აპლიკაციებისთვის
- მათი წარმომავლობა დამოწმებულია, რაც ამცირებს მიწოდების ჯაჭვის რისკებს
- შეინარჩუნეთ კონტეინერები ეფემერულად
- შექმენით კონტეინერები ისე, რომ იყვნენ stateless და ადვილად ჩანაცვლებადი
- შეინახეთ მუდმივი მონაცემები volume-ებში და არა კონტეინერების შიგნით
- დანერგეთ სათანადო გაშვებისა და გათიშვის დამუშავება
- უზრუნველყავით უწყვეტი მასშტაბირება და მაღალი ხელმისაწვდომობა
- გამოიყენეთ .dockerignore ფაილები
- გამორიცხეთ არასაჭირო ფაილები build context-იდან
- გააუმჯობესეთ build-ის წარმადობა და შეამცირეთ image-ის ზომა
- თავიდან აიცილეთ მგრძნობიარე ფაილების შემთხვევითი ჩართვა
- მაგალითად: გამორიცხეთ
.git,node_modules, ლოგები და დროებითი ფაილები
- შეამცირეთ ფენების რაოდენობა
- გააერთიანეთ დაკავშირებული ბრძანებები ერთ RUN ინსტრუქციაში
- გამოიყენეთ მრავალხაზიანი ბრძანებები
&&-ით ინსტალაციისა და გასუფთავებისთვის - გახსოვდეთ, რომ Dockerfile-ის თითოეული ინსტრუქცია ქმნის ფენას
- ნაკლები ფენა ხშირად იწვევს უფრო მცირე image-ებს
- გამოიყენეთ multi-stage build-ები უფრო მცირე image-ებისთვის
- გამოყავით build გარემო runtime გარემოსგან
- საბოლოო image-ში ჩართეთ მხოლოდ აუცილებელი არტეფაქტები
- დრამატულად შეამცირეთ image-ის ზომა build ინსტრუმენტების გამორიცხვით
- გააუმჯობესეთ უსაფრთხოება თავდასხმის ზედაპირის შემცირებით
კონტეინერის სიცოცხლის ციკლი
კონტეინერის სიცოცხლის ციკლის გაგება აუცილებელია ეფექტური კონტეინერიზაციისთვის:
- შექმნა: კონტეინერი იქმნება image-იდან
docker createანdocker runბრძანებით - გაშვებული: კონტეინერი ასრულებს თავის მთავარ პროცესს
- დაპაუზებული: კონტეინერი შეიძლება დროებით დაპაუზდეს
docker pause-ით - შეჩერებული: კონტეინერი გამოვიდა, მაგრამ კვლავ არსებობს და მისი ხელახლა გაშვება შესაძლებელია
- წაშლილი: კონტეინერი სამუდამოდ იშლება
docker rm-ით
თითოეულ მდგომარეობას შორის გადასვლამ შეიძლება გამოიწვიოს მოვლენები, რომელთა მონიტორინგი და რეაგირება შესაძლებელია, რაც საშუალებას იძლევა რთული კონტეინერების ორკესტრაციის სამუშაო პროცესების შექმნას.
კონტეინერების ქსელი
კონტეინერებს შეუძლიათ კომუნიკაცია რამდენიმე ქსელის რეჟიმის საშუალებით:
- Bridge: ნაგულისხმევი ქსელის რეჟიმი შიდა Docker ქსელით
- Host: კონტეინერი იზიარებს მასპინძლის ქსელის namespace-ს
- None: კონტეინერს არ აქვს ქსელის ინტერფეისი
- Overlay: მრავალ-მასპინძლიანი ქსელი (Docker Swarm-ისთვის)
- Macvlan: კონტეინერი ჩანს როგორც ფიზიკური მოწყობილობა თქვენს ქსელში
- Custom networks: მომხმარებლის მიერ განსაზღვრული bridge ქსელები კონტეინერების იზოლაციისთვის
სწორი ქსელის კონფიგურაცია გადამწყვეტია კონტეინერიზებული აპლიკაციებისთვის, განსაკუთრებით მიკროსერვისების არქიტექტურებში.