Docker ქსელები
Docker-ის ქსელები საშუალებას აძლევს კონტეინერებს დაუკავშირდნენ ერთმანეთს და გარე სამყაროს. ქსელების გაგება გადამწყვეტია განაწილებული აპლიკაციების შესაქმნელად.
თავის არსში, Docker-ის ქსელები აგებულია Linux-ის ქსელურ შესაძლებლობებზე, რაც უზრუნველყოფს მოქნილ და მძლავრ სისტემას კონტეინერების დასაკავშირებლად. Docker იყენებს ჩართვად არქიტექტურას, რომელიც მხარს უჭერს სხვადასხვა ქსელის დრაივერებს სხვადასხვა გამოყენების შემთხვევებისთვის, მარტივი ერთ-ჰოსტიანი აპლიკაციებიდან რთულ მრავალ-ჰოსტიან განაწილებულ სისტემებამდე.
Docker-ის ქსელური ქვესისტემა შექმნილია იმისთვის, რომ იყოს:
- იზოლირებული: კონტეინერებს აქვთ საკუთარი ქსელის namespace
- კონფიგურირებადი: მრავალი ქსელის ტიპი სხვადასხვა მოთხოვნებისთვის
- წარმადი: ოპტიმიზირებულია კონტეინერებს შორის კომუნიკაციისთვის
- უსაფრთხო: ქსელის სეგმენტაციისა და წვდომის კონტროლის მხარდაჭერა
- გაფართოებადი: ჩართვადი არქიტექტურა მორგებული ქსელური გადაწყვეტილებებისთვის
ქსელის ტიპები
Bridge ქსელი
- ნაგულისხმევი ქსელის ტიპი (
bridgeდრაივერი) - გამოიყენება, როდესაც კონტეინერებს სჭირდებათ კომუნიკაცია იმავე Docker ჰოსტზე
- უზრუნველყოფს ქსელურ იზოლაციას კონტეინერებს შორის
- კონტეინერებს შეუძლიათ კომუნიკაცია კონტეინერის სახელების, როგორც DNS-ის, გამოყენებით
- ქმნის ვირტუალურ bridge ინტერფეისს ჰოსტზე (ჩვეულებრივ
docker0) - ანიჭებს კონტეინერებს კერძო ქვექსელს (ჩვეულებრივ 172.17.0.0/16)
- ნაგულისხმევი bridge ქსელი არ უზრუნველყოფს ავტომატურ DNS რეზოლუციას
- მორგებული bridge ქსელები მხარს უჭერენ DNS რეზოლუციას კონტეინერის სახელით
- თითოეული კონტეინერი იღებს საკუთარ IP მისამართს ქვექსელში
Host ქსელი
- შლის ქსელურ იზოლაციას კონტეინერსა და ჰოსტს შორის (
hostდრაივერი) - კონტეინერი პირდაპირ იყენებს ჰოსტის ქსელს (იზიარებს ჰოსტის ქსელის namespace-ს)
- უკეთესი წარმადობა, მაგრამ ნაკლებად უსაფრთხო (ქსელური იზოლაციის გარეშე)
- სასარგებლოა კონკრეტული შემთხვევებისთვის, რომლებიც მოითხოვს ჰოსტის ქსელზე პირდაპირ წვდომას
- პორტების მიბმა არ არის საჭირო, რადგან კონტეინერის პორტები პირდაპირ ჰოსტზეა გამოტანილი
- პოტენციური პორტების კონფლიქტები ჰოსტის სერვისებთან ან სხვა კონტეინერებთან
- შემოიფარგლება ერთ ჰოსტზე გაშვებული სერვისებით
- არ არის თავსებადი Docker Swarm რეჟიმის სერვისებთან
Overlay ქსელი
- საშუალებას აძლევს კომუნიკაციას კონტეინერებს შორის მრავალ Docker ჰოსტზე
- გამოიყენება Docker Swarm რეჟიმში (
overlayდრაივერი) - უზრუნველყოფს მრავალ-ჰოსტიან ქსელს "ყუთიდან"
- მხარს უჭერს კონტეინერებს შორის დაშიფვრას
- იყენებს VXLAN ენკაფსულაციას ჰოსტებს შორის ტრაფიკისთვის
- ავტომატურად მართავს IP-ების განაწილებას კლასტერში
- საშუალებას აძლევს სერვისების აღმოჩენას მთელ swarm-ში
- ინტეგრირდება swarm-ის დატვირთვის ბალანსირებასთან განაწილებული სერვისებისთვის
- მხარს უჭერს როგორც swarm სერვისებს, ასევე დამოუკიდებელ კონტეინერებს
Macvlan ქსელი
- ანიჭებს MAC მისამართს კონტეინერებს (
macvlanდრაივერი) - კონტეინერები ჩანან როგორც ფიზიკური მოწყობილობები ქსელში
- სასარგებლოა მოძველებული აპლიკაციებისთვის
- უზრუნველყოფს უკეთეს ქსელურ წარმადობას
- აძლევს თითოეულ კონტეინერს უნიკალურ MAC და IP მისამართს ფიზიკურ ქსელში
- მოითხოვს promiscuous რეჟიმის მხარდაჭერას ჰოსტის ქსელის ინტერფეისზე
- შეუძლია კონტეინერების პირდაპირ დაკავშირება არსებულ VLAN-ებთან
- შეიძლება მოითხოვოს ფიზიკური ქსელის აღჭურვილობის კონფიგურაცია
- კარგია აპლიკაციებისთვის, რომლებიც მოელიან ფიზიკურ ქსელთან პირდაპირ დაკავშირებას
None ქსელი
- კონტეინერს არ აქვს ქსელური კავშირი (
noneდრაივერი) - სრული ქსელური იზოლაცია
- კონტეინერს არ შეუძლია კომუნიკაცია გარე ქსელებთან ან სხვა კონტეინერებთან
- სასარგებლოა სურათული დამუშავების სამუშაოებისთვის, სადაც ქსელზე წვდომა არ არის საჭირო
- მაქსიმალური უსაფრთხოების იზოლაცია ქსელის პერსპექტივიდან
- საჭიროების შემთხვევაში, კვლავ შეუძლია გამოიყენოს IPC ან volume-ების გაზიარება კომუნიკაციისთვის
IPvlan ქსელი
- macvlan-ის ალტერნატივა, რომელიც არ მოითხოვს promiscuous რეჟიმს
- იზიარებს MAC მისამართს ჰოსტთან, მაგრამ ანიჭებს უნიკალურ IP მისამართებს კონტეინერებს
- მხარს უჭერს L2 და L3 რეჟიმებს სხვადასხვა მარშრუტიზაციის მოთხოვნებისთვის
- კარგია გარემოებისთვის, სადაც promiscuous რეჟიმი შეზღუდულია
- ხშირად უფრო ეფექტურია ფართომასშტაბიანი deployment-ებისთვის
ქსელის ძირითადი ბრძანებები
ეს ბრძანებები შეიძლება გაერთიანდეს სხვა Docker ბრძანებებთან და ოფციებთან, რათა შეიქმნას რთული ქსელური კონფიგურაციები თქვენი კონტეინერიზებული აპლიკაციებისთვის.
ქსელის კონფიგურაციის მაგალითები
მომხმარებლის მიერ განსაზღვრული ქსელის შექმნა
კონტეინერების დაკავშირება
Docker Compose ქსელები
პორტების მიბმა
პორტების მიბმა საშუალებას იძლევა კონტეინერის სერვისებზე წვდომა ჰოსტიდან:
პორტების მიბმა მუშაობს ჰოსტზე iptables წესების კონფიგურაციით, რომლებიც გადაამისამართებენ ტრაფიკს ჰოსტის პორტიდან კონტეინერის პორტზე. ეს საშუალებას იძლევა:
- გარე წვდომა კონტეინერის სერვისებზე
- სერვისის ხელმისაწვდომობა ცნობილ პორტებზე
- დატვირთვის ბალანსირება მრავალ კონტეინერზე
- უსაფრთხოება კონტროლირებადი გამოაშკარავებით
გაითვალისწინეთ, რომ პორტების მიბმა ვრცელდება მხოლოდ bridge ქსელებზე და არა host ქსელის რეჟიმში მყოფ კონტეინერებზე (რომლებიც უკვე პირდაპირ ამხელენ ყველა პორტს).
DNS და სერვისების აღმოჩენა
Docker უზრუნველყოფს ავტომატურ DNS რეზოლუციას ერთსა და იმავე ქსელში მყოფ კონტეინერებს შორის:
- კონტეინერებს შეუძლიათ ერთმანეთს სახელით მიმართონ
- ჩაშენებული DNS სერვერი 127.0.0.11-ზე
- სერვისების ავტომატური აღმოჩენა მომხმარებლის მიერ განსაზღვრულ ქსელებში
როგორ მუშაობს Docker DNS
- კონტეინერის DNS კონფიგურაცია: Docker ავტომატურად აკონფიგურირებს თითოეული კონტეინერის
/etc/resolv.conf-ს, რომ გამოიყენოს Docker DNS სერვერი: - სახელის რეზოლუციის პროცესი:
- კონტეინერის მოთხოვნები იგზავნება Docker-ის ჩაშენებულ DNS სერვერზე
- DNS სერვერი ინახავს ჩანაწერებს იმავე ქსელში მყოფი ყველა კონტეინერისთვის
- თუ სახელი ემთხვევა კონტეინერს, ის აბრუნებს კონტეინერის IP მისამართს
- წინააღმდეგ შემთხვევაში, ის გადაამისამართებს მოთხოვნას გარე DNS სერვერებზე, რომლებიც მითითებულია ჰოსტის
/etc/resolv.conf-ში
- ქსელის მოქმედების არეალი: DNS რეზოლუცია მუშაობს მხოლოდ ერთსა და იმავე მომხმარებლის მიერ განსაზღვრულ ქსელში მყოფ კონტეინერებს შორის; ნაგულისხმევი bridge ქსელი არ უჭერს მხარს ამ ფუნქციას
სერვისების აღმოჩენა Swarm რეჟიმში
Docker Swarm რეჟიმში, DNS-ზე დაფუძნებული სერვისების აღმოჩენა გაძლიერებულია:
- თითოეული სერვისი იღებს DNS ჩანაწერს
service_nameფორმატში - დატვირთვის ბალანსირება ავტომატურად ხდება სერვისის რეპლიკებს შორის
- ვირტუალური IP (VIP) რეჟიმი უზრუნველყოფს ერთ IP-ს, რომელიც ანაწილებს დატვირთვას ყველა რეპლიკაზე
- DNS Round Robin (DNSRR) რეჟიმი აბრუნებს ყველა კონტეინერის IP-ს კლიენტის მხარეს დატვირთვის ბალანსირებისთვის
მორგებული DNS კონფიგურაცია
შეგიძლიათ შეცვალოთ კონტეინერის DNS პარამეტრები:
ქსელის უსაფრთხოების საუკეთესო პრაქტიკები
- გამოიყენეთ მომხმარებლის მიერ განსაზღვრული ქსელები ნაგულისხმევი bridge-ის ნაცვლად
- მორგებული ქსელები უზრუნველყოფენ კონტეინერის სახელის DNS რეზოლუციას
- უკეთესი იზოლაცია კონტეინერების ჯგუფებს შორის
- მეტი კონტროლი ქვექსელისა და IP-ის მინიჭებაზე
- მაგალითი:
docker network create --internal db-networkმონაცემთა ბაზის ქსელისთვის ინტერნეტის გარეშე
- შეზღუდეთ კონტეინერის ქსელზე წვდომა
- გამოიყენეთ
--internalდროშა ქსელების შესაქმნელად გარე კავშირის გარეშე - შეზღუდეთ გამოაშკარავებული პორტები მხოლოდ აუცილებლით
- საჭიროების შემთხვევაში, მიაბით კონკრეტულ ინტერფეისებს:
docker run -p 127.0.0.1:8080:80 nginx - დანერგეთ drop-all iptables პოლიტიკები და დაამატეთ კონკრეტული წესები
- გამოიყენეთ
- გამოიყენეთ ქსელის სეგმენტაცია
- შექმენით ცალკეული ქსელები აპლიკაციის სხვადასხვა დონისთვის
- განათავსეთ frontend, backend და მონაცემთა ბაზის კონტეინერები გამოყოფილ ქსელებში
- დააკავშირეთ gateway კონტეინერები მრავალ ქსელთან კონტროლირებადი კომუნიკაციისთვის
- მაგალითი: სამ-დონიანი არქიტექტურა frontend, backend და მონაცემთა ბაზის ქსელებით
- ჩართეთ ქსელის დაშიფვრა overlay ქსელებში
- გამოიყენეთ
--opt encrypted=trueoverlay ქსელების შექმნისას - იცავს კონტეინერებს შორის კომუნიკაციას ჰოსტებს შორის
- იცავს მგრძნობიარე მონაცემებს ტრანზიტისას
- გაითვალისწინეთ წარმადობაზე გავლენა (დაახლოებით 10% ზედნადები)
- გამოიყენეთ
- რეგულარულად შეამოწმეთ ქსელის კონფიგურაციები
- გადახედეთ ქსელის რესურსებს
docker network lsდაdocker network inspectბრძანებებით - შეამოწმეთ კონტეინერების კავშირები
docker inspect --format='{{json .NetworkSettings.Networks}}' container-name-ით - დააკვირდეთ ქსელის ტრაფიკს ისეთი ინსტრუმენტებით, როგორიცაა tcpdump ან Wireshark
- გამოიყენეთ ლოგირება კავშირის მცდელობების თვალყურის დევნებისთვის
- გადახედეთ ქსელის რესურსებს
- დაიცავით მინიმალური პრივილეგიების პრინციპი
- კონტეინერები უნდა დაუკავშირდნენ მხოლოდ იმ ქსელებს, რომლებიც მათ სჭირდებათ
- დანერგეთ აპლიკაციის დონის ავთენტიფიკაცია კონტეინერებს შორისაც კი
- გამოიყენეთ მხოლოდ წაკითხვადი ფაილური სისტემები, როდესაც შესაძლებელია
- მოაშორეთ არასაჭირო შესაძლებლობები:
docker run --cap-drop=NET_ADMIN nginx
- დამატებითი უსაფრთხოების ზომები
- განიხილეთ ქსელის პლაგინები გაფართოებული უსაფრთხოების ფუნქციებით
- დანერგეთ ქსელის პოლიტიკები (Kubernetes-ით ან მორგებული გადაწყვეტილებებით)
- გამოიყენეთ TLS ყველა სერვისებს შორის კომუნიკაციისთვის
- განათავსეთ service mesh გაფართოებული უსაფრთხოების კონტროლისთვის დიდ deployment-ებში
ქსელის გავრცელებული პრობლემების მოგვარება
გავრცელებული ქსელური პრობლემები და გადაწყვეტილებები
| პრობლემა | სიმპტომები | პრობლემის მოგვარების ნაბიჯები |
|---|---|---|
| კონტეინერი ვერ უკავშირდება ინტერნეტს | ping google.com ვერ სრულდება | შეამოწმეთ კონტეინერის DNS, დაადასტურეთ ჰოსტის ქსელი, შეამოწმეთ NAT კონფიგურაცია |
| კონტეინერები ვერ პოულობენ ერთმანეთს | სახელის რეზოლუცია ვერ სრულდება | დარწმუნდით, რომ ისინი ერთ ქსელში არიან, შეამოწმეთ სერვისის სახელები, შეამოწმეთ DNS კონფიგურაცია |
| პორტების მიბმა არ მუშაობს | გარე კავშირი უარყოფილია | დაადასტურეთ, რომ აპლიკაცია უსმენს სწორ ინტერფეისს (0.0.0.0), შეამოწმეთ პორტების კონფლიქტები |
| Overlay ქსელის პრობლემები | მრავალ-ჰოსტიანი კომუნიკაცია ვერ სრულდება | დაადასტურეთ, რომ საჭირო პორტები ღიაა (2377, 7946, 4789), შეამოწმეთ VXLAN კონფიგურაცია |
| წარმადობის პრობლემები | მაღალი შეყოვნება, დაბალი გამტარობა | დააკვირდით ქსელის მეტრიკებს, შეამოწმეთ პაკეტების დაკარგვა, დაადასტურეთ დრაივერის კონფიგურაცია |
| IP მისამართების კონფლიქტები | კონტეინერები ვერ იწყებენ მუშაობას | გამოიყენეთ მორგებული ქვექსელები, შეამოწმეთ გადაფარვა არსებულ ქსელებთან |
გაფართოებული თემები
ქსელის პლაგინები
- Docker მხარს უჭერს მესამე მხარის ქსელის პლაგინებს Container Network Interface (CNI) საშუალებით
- აფართოებს ქსელურ შესაძლებლობებს ჩაშენებული დრაივერების მიღმა
- საშუალებას იძლევა ინტეგრაცია SDN გადაწყვეტილებებთან (Software-Defined Networking)
- მხარს უჭერს მორგებულ ქსელურ იმპლემენტაციებს სპეციალიზებული მოთხოვნებისთვის
- ცნობილი პლაგინები:
- Calico: გაფართოებული ქსელის პოლიტიკები და უსაფრთხოება
- Weave: მარტივი, მდგრადი, მრავალ-ჰოსტიანი ქსელი
- Cilium: eBPF-ზე დაფუძნებული ქსელი გაძლიერებული დაკვირვებადობითა და უსაფრთხოებით
- Flannel: მარტივი overlay ქსელი, რომელიც ფოკუსირებულია Kubernetes-ზე
- Contiv: პოლიტიკაზე დაფუძნებული ქსელი საწარმოო გარემოებისთვის
დატვირთვის ბალანსირება
- ჩაშენებული დატვირთვის ბალანსირება Swarm რეჟიმში ingress routing mesh-ის გამოყენებით
- სერვისების აღმოჩენა DNS round-robin-ით განაწილებული სერვისის წვდომისთვის
- გარე დატვირთვის ბალანსერების მხარდაჭერა გამოაშკარავებული პორტების საშუალებით
- Health check-ები და კონტეინერების ავტომატური ჩანაცვლება სერვისის მდგრადობისთვის
- მუშაობის რეჟიმები:
- VIP (ვირტუალური IP): ერთი ვირტუალური IP ანაწილებს დატვირთვას ყველა სერვისის ამოცანაზე
- DNSRR (DNS Round-Robin): აბრუნებს ყველა კონტეინერის IP-ს კლიენტის მხარეს დატვირთვის ბალანსირებისთვის
- კონფიგურაციის მაგალითი:
ქსელის პოლიტიკები
- აკონტროლეთ ტრაფიკის ნაკადი კონტეინერებს შორის დეტალური წესებით
- განსაზღვრეთ დაშვებული საკომუნიკაციო გზები პორტების, პროტოკოლებისა და წყაროების მიხედვით
- დანერგეთ მიკრო-სეგმენტაცია სიღრმისეული დაცვისთვის
- გაძლიერებული უსაფრთხოების კონტროლი მრავალ-მოიჯარიან გარემოებში
- იმპლემენტაციის ვარიანტები:
- Kubernetes Network Policies (Kubernetes-ის გამოყენებისას)
- Calico Network Policies
- მორგებული iptables წესები კონტეინერებში
- აპლიკაციის დონის ავტორიზაცია
სერვისების გამოაშკარავება
- კონტეინერიზებული სერვისების გამოაშკარავების მრავალი ნიმუში:
- პორტის გამოქვეყნება: გამოაშკარავება ჰოსტზე
-pდროშით - Ingress routing mesh: Swarm-ის ჩაშენებული დატვირთვის ბალანსერი
- Reverse proxy: Traefik, Nginx, ან HAProxy კონტეინერების გამოყენებით
- Service mesh: გაფართოებული მარშრუტიზაცია Istio-თი ან Linkerd-ით
- პორტის გამოქვეყნება: გამოაშკარავება ჰოსტზე
- გასათვალისწინებელი საკითხები:
- უსაფრთხოება (გამოაშკარავების ზედაპირი)
- დატვირთვის ბალანსირების მოთხოვნები
- SSL/TLS ტერმინაცია
- აუთენტიფიკაცია და ავტორიზაცია
კონტეინერის ქსელის Namespaces
- გაფართოებული მანიპულაცია სპეციალიზებული ქსელებისთვის:
წარმადობის ოპტიმიზაცია
- MTU ოპტიმიზაცია გაუმჯობესებული გამტარობისთვის
- TCP პარამეტრების კორექტირება კონკრეტული სამუშაო დატვირთვებისთვის
- ქსელის რეჟიმის შერჩევა წარმადობის მოთხოვნების მიხედვით
- ქსელის წარმადობის მონიტორინგი:
- დრაივერის სპეციფიური ოპტიმიზაციები