Docker კონტეინერები

Docker კონტეინერების და მათი საფუძვლების გაგება

რა არის კონტეინერები?

კონტეინერები არის მსუბუქი, დამოუკიდებელი და შესრულებადი პროგრამული პაკეტები, რომლებიც შეიცავს ყველაფერს, რაც საჭიროა პროგრამის გასაშვებად, მათ შორის კოდს, 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 run <image-name>

# ინტერაქტიული ტერმინალით გაშვება და შეჩერებისას წაშლა
docker run -it --rm <image-name> /bin/bash

# კონტეინერის ფონურ რეჟიმში გაშვება (detached mode)
docker run -d <image-name>

# პორტის მიბმით გაშვება (host-port:container-port)
docker run -p 8080:80 <image-name>

# volume-ის მიმაგრებით გაშვება (host-path:container-path)
docker run -v /host/path:/container/path <image-name>

# გარემოს ცვლადებით გაშვება
docker run -e VARIABLE_NAME=value <image-name>

# გაშვებული კონტეინერების სია
docker ps

# ყველა კონტეინერის სია (შეჩერებულების ჩათვლით)
docker ps -a

# კონტეინერის შეჩერება
docker stop <container-id>

# კონტეინერის იძულებით შეჩერება (kill -9-ის მსგავსად)
docker kill <container-id>

# კონტეინერის წაშლა
docker rm <container-id>

# ყველა შეჩერებული კონტეინერის წაშლა
docker container prune

# კონტეინერის ლოგების ნახვა
docker logs <container-id>

# კონტეინერის ლოგების თვალყურის დევნება (tail -f-ის მსგავსად)
docker logs -f <container-id>

# ბრძანების შესრულება გაშვებულ კონტეინერში
docker exec -it <container-id> /bin/bash

# კონტეინერის დეტალების შემოწმება
docker inspect <container-id>

თითოეულ ამ ბრძანებას აქვს დამატებითი ოფციები, რომლებიც კონტეინერის ქცევის დეტალური კონტროლის საშუალებას იძლევა. გამოიყენეთ docker <command> --help ნებისმიერი ბრძანების ოფციების სრული სპექტრის სანახავად.

საუკეთესო პრაქტიკები

კონტეინერის სიცოცხლის ციკლი

კონტეინერის სიცოცხლის ციკლის გაგება აუცილებელია ეფექტური კონტეინერიზაციისთვის:

  1. შექმნა: კონტეინერი იქმნება image-იდან docker create ან docker run ბრძანებით
  2. გაშვებული: კონტეინერი ასრულებს თავის მთავარ პროცესს
  3. დაპაუზებული: კონტეინერი შეიძლება დროებით დაპაუზდეს docker pause-ით
  4. შეჩერებული: კონტეინერი გამოვიდა, მაგრამ კვლავ არსებობს და მისი ხელახლა გაშვება შესაძლებელია
  5. წაშლილი: კონტეინერი სამუდამოდ იშლება docker rm-ით

თითოეულ მდგომარეობას შორის გადასვლამ შეიძლება გამოიწვიოს მოვლენები, რომელთა მონიტორინგი და რეაგირება შესაძლებელია, რაც საშუალებას იძლევა რთული კონტეინერების ორკესტრაციის სამუშაო პროცესების შექმნას.

კონტეინერების ქსელი

კონტეინერებს შეუძლიათ კომუნიკაცია რამდენიმე ქსელის რეჟიმის საშუალებით:

სწორი ქსელის კონფიგურაცია გადამწყვეტია კონტეინერიზებული აპლიკაციებისთვის, განსაკუთრებით მიკროსერვისების არქიტექტურებში.