Docker ქსელები

ისწავლეთ Docker-ის ქსელური კონცეფციები, ტიპები და მართვა

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 network ls

# ქსელების სია მეტი დეტალით
docker network ls --format "table {{.ID}}\t{{.Name}}\t{{.Driver}}\t{{.Scope}}"

# ქსელის შექმნა
docker network create my-network

# ქსელის შექმნა კონკრეტული დრაივერით
docker network create --driver overlay my-swarm-network

# კონტეინერის დაკავშირება ქსელთან
docker network connect my-network container-name

# სტატიკური IP მისამართით დაკავშირება
docker network connect --ip 172.18.0.10 my-network container-name

# კონტეინერის გათიშვა ქსელიდან
docker network disconnect my-network container-name

# ქსელის შემოწმება
docker network inspect my-network

# კონკრეტული დეტალების შემოწმება ფორმატით
docker network inspect -f '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{end}}' my-network

# ქსელის წაშლა
docker network rm my-network

# ყველა გამოუყენებელი ქსელის წაშლა
docker network prune

# ქსელების ფილტრაცია კრიტერიუმებით
docker network ls --filter driver=bridge

# კონტეინერის შექმნა კონკრეტული ქსელით
docker run --network=my-network -d nginx

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

ქსელის კონფიგურაციის მაგალითები

მომხმარებლის მიერ განსაზღვრული ქსელის შექმნა

# bridge ქსელის შექმნა მორგებული ქვექსელით
docker network create --driver bridge \
  --subnet=172.18.0.0/16 \
  --gateway=172.18.0.1 \
  my-custom-network

# ქსელის შექმნა IP მისამართების დიაპაზონით
docker network create --driver bridge \
  --subnet=172.20.0.0/16 \
  --ip-range=172.20.5.0/24 \
  --gateway=172.20.0.1 \
  my-range-network

# overlay ქსელის შექმნა დაშიფვრით
docker network create --driver overlay \
  --opt encrypted=true \
  --attachable \
  secure-overlay-network

# macvlan ქსელის შექმნა
docker network create --driver macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 \
  macvlan-network

კონტეინერების დაკავშირება

# კონტეინერის გაშვება ქსელთან ერთად
docker run -d --network my-network --name container1 nginx

# სხვა კონტეინერის გაშვება იმავე ქსელში
docker run -d --network my-network --name container2 nginx

# გაშვებული კონტეინერის დაკავშირება დამატებით ქსელთან
docker network connect my-second-network container1

# კონტეინერის შექმნა სტატიკური IP-ით
docker run -d --network my-network --ip 172.18.0.10 --name fixed-ip-container nginx

# კონტეინერის დაკავშირება მრავალ ქსელთან შექმნისას
docker run -d --network my-network --network my-second-network --name multi-network-container nginx

# კომუნიკაციის ტესტირება კონტეინერებს შორის
docker exec container1 ping container2

# კონტეინერის ქსელის პარამეტრების შემოწმება
docker inspect --format='{{json .NetworkSettings.Networks}}' container1

Docker Compose ქსელები

# docker-compose.yml მაგალითი მორგებული ქსელებით
version: '3.8'
services:
  web:
    image: nginx
    networks:
      - frontend
  api:
    image: my-api:latest
    networks:
      - frontend
      - backend
  db:
    image: postgres:13
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # ინტერნეტზე წვდომის გარეშე გაძლიერებული უსაფრთხოებისთვის

პორტების მიბმა

DNS და სერვისების აღმოჩენა

Docker უზრუნველყოფს ავტომატურ DNS რეზოლუციას ერთსა და იმავე ქსელში მყოფ კონტეინერებს შორის:

  • კონტეინერებს შეუძლიათ ერთმანეთს სახელით მიმართონ
  • ჩაშენებული DNS სერვერი 127.0.0.11-ზე
  • სერვისების ავტომატური აღმოჩენა მომხმარებლის მიერ განსაზღვრულ ქსელებში

როგორ მუშაობს Docker DNS

  1. კონტეინერის DNS კონფიგურაცია: Docker ავტომატურად აკონფიგურირებს თითოეული კონტეინერის /etc/resolv.conf-ს, რომ გამოიყენოს Docker DNS სერვერი:
    nameserver 127.0.0.11
    options ndots:0
    
  2. სახელის რეზოლუციის პროცესი:
    • კონტეინერის მოთხოვნები იგზავნება Docker-ის ჩაშენებულ DNS სერვერზე
    • DNS სერვერი ინახავს ჩანაწერებს იმავე ქსელში მყოფი ყველა კონტეინერისთვის
    • თუ სახელი ემთხვევა კონტეინერს, ის აბრუნებს კონტეინერის IP მისამართს
    • წინააღმდეგ შემთხვევაში, ის გადაამისამართებს მოთხოვნას გარე DNS სერვერებზე, რომლებიც მითითებულია ჰოსტის /etc/resolv.conf-ში
  3. ქსელის მოქმედების არეალი: DNS რეზოლუცია მუშაობს მხოლოდ ერთსა და იმავე მომხმარებლის მიერ განსაზღვრულ ქსელში მყოფ კონტეინერებს შორის; ნაგულისხმევი bridge ქსელი არ უჭერს მხარს ამ ფუნქციას

სერვისების აღმოჩენა Swarm რეჟიმში

Docker Swarm რეჟიმში, DNS-ზე დაფუძნებული სერვისების აღმოჩენა გაძლიერებულია:

  • თითოეული სერვისი იღებს DNS ჩანაწერს service_name ფორმატში
  • დატვირთვის ბალანსირება ავტომატურად ხდება სერვისის რეპლიკებს შორის
  • ვირტუალური IP (VIP) რეჟიმი უზრუნველყოფს ერთ IP-ს, რომელიც ანაწილებს დატვირთვას ყველა რეპლიკაზე
  • DNS Round Robin (DNSRR) რეჟიმი აბრუნებს ყველა კონტეინერის IP-ს კლიენტის მხარეს დატვირთვის ბალანსირებისთვის
# სერვისების აღმოჩენის მაგალითი Swarm-ში
docker service create --name db --network app-network postgres
docker service create --name api --network app-network --env DB_HOST=db my-api

მორგებული DNS კონფიგურაცია

შეგიძლიათ შეცვალოთ კონტეინერის DNS პარამეტრები:

# მორგებული DNS სერვერების დაყენება
docker run --dns 8.8.8.8 --dns 8.8.4.4 nginx

# DNS საძიებო დომენების დაყენება
docker run --dns-search example.com nginx

# DNS ოფციების დაყენება
docker run --dns-opt timeout:3 nginx

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

ქსელის გავრცელებული პრობლემების მოგვარება

# კონტეინერის ქსელის შემოწმება
docker inspect container-name

# ქსელის სპეციფიური ინფორმაციის ნახვა
docker inspect -f '{{json .NetworkSettings.Networks}}' container-name | jq

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

# კონტეინერის ქსელური კავშირის შემოწმება
docker exec container-name ping other-container

# DNS რეზოლუციის ტესტირება კონტეინერში
docker exec container-name nslookup other-service

# შეამოწმეთ, ნამდვილად უსმენენ თუ არა პორტები
docker exec container-name netstat -tulpn

# ქსელის პრობლემების მოსაგვარებელი ინსტრუმენტების ინსტალაცია კონტეინერში
docker exec container-name sh -c "apt-get update && apt-get install -y iputils-ping net-tools curl dnsutils"

# კონტეინერის მარშრუტიზაციის ცხრილის შემოწმება
docker exec container-name route -n

# პორტების მიბმის შემოწმება
docker port container-name

# ყველა კონტეინერის IP-ის ნახვა
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)

# ქსელის ინტერფეისის კონფიგურაციის შემოწმება კონტეინერში
docker exec container-name ip addr show

# overlay ქსელის დებაგინგი
docker network inspect -v overlay-network-name

# ქსელის ტრაფიკის დაჭერა
docker run --net=container:target-container nicolaka/netshoot tcpdump -i eth0

# Docker DNS კონფიგურაციის შემოწმება
docker exec container-name cat /etc/resolv.conf

გავრცელებული ქსელური პრობლემები და გადაწყვეტილებები

პრობლემასიმპტომებიპრობლემის მოგვარების ნაბიჯები
კონტეინერი ვერ უკავშირდება ინტერნეტს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-ს კლიენტის მხარეს დატვირთვის ბალანსირებისთვის
  • კონფიგურაციის მაგალითი:
    # სერვისის შექმნა რეპლიკებზე დაფუძნებული დატვირთვის ბალანსირებით
    docker service create --name web --replicas 5 --publish 80:80 nginx
    
    # სერვისის შექმნა DNSRR რეჟიმით
    docker service create --name api --endpoint-mode dnsrr --replicas 3 my-api
    

ქსელის პოლიტიკები

  • აკონტროლეთ ტრაფიკის ნაკადი კონტეინერებს შორის დეტალური წესებით
  • განსაზღვრეთ დაშვებული საკომუნიკაციო გზები პორტების, პროტოკოლებისა და წყაროების მიხედვით
  • დანერგეთ მიკრო-სეგმენტაცია სიღრმისეული დაცვისთვის
  • გაძლიერებული უსაფრთხოების კონტროლი მრავალ-მოიჯარიან გარემოებში
  • იმპლემენტაციის ვარიანტები:
    • 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

  • გაფართოებული მანიპულაცია სპეციალიზებული ქსელებისთვის:
    # ქსელის namespace-ის გაზიარება კონტეინერებს შორის
    docker run --network=container:another-container nginx
    
    # ჰოსტის PID namespace-ის გამოყენება, მაგრამ კონტეინერის ქსელის
    docker run --pid=host --network=bridge nginx
    
    # კონტეინერის შექმნა გაშვების გარეშე ქსელის კონფიგურაციისთვის
    docker create --name network-config nginx
    docker run --network=container:network-config ubuntu
    

წარმადობის ოპტიმიზაცია

  • MTU ოპტიმიზაცია გაუმჯობესებული გამტარობისთვის
    docker network create --opt com.docker.network.driver.mtu=1400 my-network
    
  • TCP პარამეტრების კორექტირება კონკრეტული სამუშაო დატვირთვებისთვის
  • ქსელის რეჟიმის შერჩევა წარმადობის მოთხოვნების მიხედვით
  • ქსელის წარმადობის მონიტორინგი:
    docker run --rm --net=container:target nicolaka/netshoot iperf -c iperf-server
    
  • დრაივერის სპეციფიური ოპტიმიზაციები