Docker Swarm-ი არის Docker-ის შიდა კლასტერირებისა და ორკესტრაციის გადაწყვეტა, რომელიც Docker-ის ჰოსტების ჯგუფს ერთ ვირტუალურ ჰოსტად აქცევს, რაც უზრუნველყოფს მაღალ ხელმისაწვდომობასა და დატვირთვის დაბალანსებას კონტეინერიზებული აპლიკაციებისთვის. გარე ორკესტრატორებისგან განსხვავებით, Swarm-ი ჩაშენებულია Docker-ის ძრავაში, რაც გვთავაზობს კონტეინერების ორკესტრაციის უფრო მარტივ მიდგომას მინიმალური დაყენების დანახარჯებით, Docker CLI-ის ნაცნობი გამოცდილების შენარჩუნებით.
მუშა კვანძები (Worker nodes): ასრულებენ კონტეინერიზებულ დატვირთვებს მენეჯერების მიერ მინიჭებისამებრ; შეუძლიათ ათასობით კვანძამდე მასშტაბირება
დავალების შესრულება: აწარმოებენ კონტეინერის ინსტანციებს ორკესტრაციის ფენის მითითებით ჯანმრთელობის მონიტორინგით
კონტეინერის გარემო (Container runtime): სტანდარტული Docker-ის ძრავა, რომელიც მუშაობს თითოეულ კვანძზე კონტეინერის თანმიმდევრული შესრულებისთვის
ქსელის ოვერლეი (Network overlay): მრავალ-ჰოსტიანი ქსელი ავტომატური სერვისების აღმოჩენითა და დატვირთვის დაბალანსებით
დატვირთვის განაწილება: ანაწილებს სერვისებს კვანძებს შორის განთავსების შეზღუდვების, რესურსების ხელმისაწვდომობისა და მაღალი ხელმისაწვდომობის მოთხოვნების საფუძველზე
# ახალი swarm-ის ინიციალიზაცია (მენეჯერ კვანძზე)
docker swarm init --advertise-addr <MANAGER-IP>
# --advertise-addr მიუთითებს მისამართს, რომელსაც სხვა კვანძები გამოიყენებენ ამ მენეჯერთან დასაკავშირებლად
# თუ გამოტოვებულია, Docker-ი შეეცდება IP-ის ავტომატურად აღმოჩენას, რაც შეიძლება არასწორი იყოს მრავალ-ინტერფეისიან სერვერებზე
# გამოტანილი შედეგი მოგცემთ ტოკენს მუშა კვანძების დასამატებლად
# მაგალითი:
# docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c <MANAGER-IP>:2377
# ეს ტოკენი ახდენს ახალი კვანძების ავთენტიფიკაციას swarm-ში, რაც უზრუნველყოფს კლასტერის უსაფრთხო გაფართოებას
# კვანძის დამატება როგორც მუშა
docker swarm join --token <TOKEN> <MANAGER-IP>:2377
# მუშა კვანძები იღებენ და ასრულებენ დავალებებს, მაგრამ არ შეუძლიათ კლასტერის მდგომარეობის მართვა
# პორტი 2377 არის swarm-ის მართვის სტანდარტული პორტი
# კვანძის დამატება როგორც მენეჯერი
docker swarm join-token manager
# ეს ბრძანება აგენერირებს სხვა ტოკენს სპეციალურად მენეჯერი კვანძებისთვის
# შემდეგ გამოიყენეთ მოწოდებული ტოკენი მენეჯერად დასამატებლად
docker swarm join --token <MANAGER-TOKEN> <MANAGER-IP>:2377
# მენეჯერი კვანძები მონაწილეობენ Raft კონსენსუსში და შეუძლიათ კლასტერის მართვა
# კვანძების სია swarm-ში
docker node ls
# აჩვენებს ყველა კვანძს მათი როლებით, ხელმისაწვდომობის სტატუსით და მენეჯერის სტატუსით
# MANAGER STATUS სვეტი აჩვენებს "Leader"-ს მთავარი მენეჯერი კვანძისთვის
Docker Swarm-ში სერვისები არის მენეჯერ ან მუშა კვანძებზე შესასრულებელი დავალებების განმარტებები:
სერვისები განსაზღვრავენ კონტეინერის იმიჯს, რეპლიკებს, ქსელებს და სხვას, რაც ქმნის აპლიკაციების გასაშვებად ძირითად აბსტრაქციის ფენას
დავალებები არის ინდივიდუალური კონტეინერები, რომლებიც მუშაობენ swarm-ის მასშტაბით, თითოეული დავალება შეესაბამება ერთ კონტეინერის ინსტანციას
გრაფიკის შემდგენელი (scheduler) ანაწილებს დავალებებს ხელმისაწვდომ კვანძებს შორის რესურსების ხელმისაწვდომობის, განთავსების შეზღუდვებისა და სერვისის მოთხოვნების საფუძველზე
ორკესტრატორი ინარჩუნებს სასურველ მდგომარეობას ფაქტობრივი მდგომარეობის მუდმივი მონიტორინგითა და სასურველ კონფიგურაციასთან შეჯერებით, ავტომატურად ცვლის წარუმატებელ კონტეინერებს და ამუშავებს მასშტაბირების ოპერაციებს
სერვისები მიჰყვებიან დეკლარაციულ მოდელს, სადაც თქვენ მიუთითებთ თქვენი აპლიკაციის სასურველ მდგომარეობას (რა გსურთ რომ მოხდეს), და Swarm-ი მუდმივად მუშაობს იმის უზრუნველსაყოფად, რომ ეს მდგომარეობა შენარჩუნდეს, ავტომატურად ამუშავებს შეცდომებსა და განახლებებს.
ჩაშენებული დატვირთვის დაბალანსება: გამჭვირვალე დატვირთვის დაბალანსება გამოქვეყნებული პორტებისთვის Linux IPVS-ის გამოყენებით
მარშრუტიზაციის ბადე (Routing mesh) სერვისის პორტებისთვის: სერვისების გამოჩენა ყველა კვანძზე, მიუხედავად იმისა, მუშაობს თუ არა ამ კვანძზე ამ სერვისის ინსტანცია
მოთხოვნების განაწილება კვანძებს შორის: შემომავალი მოთხოვნების გადამისამართება ნებისმიერი კვანძიდან აქტიურ კონტეინერზე, თუნდაც ის სხვა კვანძზე მუშაობდეს
სერვისების ავტომატური აღმოჩენა: სერვისებს შეუძლიათ კომუნიკაცია სახელის მიხედვით ხელით დაკავშირების ან IP კონფიგურაციის გარეშე
კონტეინერებს შორის კომუნიკაცია: კონტეინერებს შეუძლიათ უსაფრთხოდ კომუნიკაცია ჰოსტებს შორის იმავე ოვერლეი ქსელში
შემომავალი ქსელი იყენებს მდგომარეობის არმქონე (stateless) დატვირთვის დაბალანსების მექანიზმს:
# სერვისის შექმნა კონკრეტული გამოქვეყნების რეჟიმით
docker service create --name web \
--publish mode=host,target=80,published=8080 \
nginx
# 'host' რეჟიმი გვერდს უვლის მარშრუტიზაციის ბადეს, მაგრამ მოითხოვს პორტების ხელით მინიჭებას თითოეულ კვანძზე
Docker Swarm-ი უზრუნველყოფს ჩაშენებულ სერვისების აღმოჩენას, რაც კონტეინერებს საშუალებას აძლევს იპოვონ და დაუკავშირდნენ ერთმანეთს სერვისის სახელების გამოყენებით:
# სერვისების აღმოჩენის მაგალითი
docker service create --name db \
--network backend-network \
# ოვერლეი ქსელში გაწევრიანება
--mount type=volume,source=db-data,target=/var/lib/postgresql/data \
# მუდმივი საცავი
--env POSTGRES_PASSWORD_FILE=/run/secrets/db_password \
# საიდუმლოებების გამოყენება უსაფრთხოებისთვის
--replicas 1 \
# მონაცემთა ბაზა ჩვეულებრივ ერთ ინსტანციას აწარმოებს
postgres:13 # მონაცემთა ბაზის იმიჯი
docker service create --name api \
--network backend-network \
# იგივე ქსელი, რაც db სერვისს
--env DB_HOST=db \
# მონაცემთა ბაზაზე მითითება სერვისის სახელით
--env DB_PORT=5432 \
# სტანდარტული PostgreSQL პორტი
--replicas 3 \
# მრავალი API ინსტანციის გაშვება
--update-order start-first \
# განახლებისას ახალი დავალებების დაწყება ძველების შეჩერებამდე
myapi:latest # API იმიჯი
სერვისების აღმოჩენა მუშაობს:
შიდა DNS სერვერის საშუალებით: Swarm-ის ყველა კონტეინერს შეუძლია ჩაშენებულ DNS სერვერთან დაკავშირება
სერვისის VIP-ების (ვირტუალური IP-ები) საშუალებით: თითოეული სერვისი იღებს ვირტუალურ IP-ს ოვერლეი ქსელში
DNS round-robin-ის საშუალებით: კონტეინერებს შეუძლიათ სერვისის სახელების გადაჭრა ყველა დავალების IP-ზე DNS-ის გამოყენებით
კავშირის მაგალითი კონტეინერის შიგნიდან:
# მონაცემთა ბაზასთან დაკავშირება api კონტეინერის შიგნიდან
docker exec -it $(docker ps -q -f name=api) bash
ping db # გადაიჭრება სერვისის VIP-ად
psql -h db -U postgres -d myapp # მონაცემთა ბაზასთან დაკავშირება სერვისის სახელით
მრავალი რეპლიკის მქონე სერვისებისთვის, კავშირები ავტომატურად ნაწილდება:
# ფრონტენდ სერვისის შექმნა, რომელიც უკავშირდება API-ს
docker service create --name frontend \
--network backend-network \
--env API_URL=http://api:8000/ \
# API სერვისის სახელი ავტომატურად გადაიჭრება და დატვირთვა დაბალანსდება
--publish 80:80 \
frontend:latest
სტეკები საშუალებას გაძლევთ განსაზღვროთ და გაუშვათ სრული აპლიკაციები მრავალი სერვისით compose ფაილის გამოყენებით:
# სტეკის გაშვება
docker stack deploy -c docker-compose.yml myapp
# ეს ქმნის ყველა სერვისს, ქსელს და დისკს, რომლებიც განსაზღვრულია compose ფაილში
# ყველა რესურსი აღინიშნება სტეკის სახელით მარტივი მართვისთვის
# სერვისების სახელებია: <stack-name>_<service-name>
# სტეკების სია
docker stack ls
# აჩვენებს ყველა სტეკს თითოეულში სერვისების რაოდენობით
# სტეკში სერვისების სია
docker stack services myapp
# აჩვენებს დეტალურ ინფორმაციას სტეკის თითოეული სერვისის შესახებ, მათ შორის:
# - რეპლიკის სტატუსი (მიმდინარე/სასურველი)
# - იმიჯი და კონფიგურაცია
# - პორტების მიბმა
# სტეკში დავალებების სია
docker stack ps myapp
# აჩვენებს სტეკის ყველა გაშვებულ კონტეინერს:
# - სტატუსით (გაშვებული, შეცდომა და ა.შ.)
# - შეცდომის შეტყობინებებით, თუ ეს შესაძლებელია
# - კვანძზე მინიჭებით
# - მიმდინარე და სასურველი მდგომარეობით
# სტეკის წაშლა
docker stack rm myapp
# შლის სტეკის მიერ შექმნილ ყველა სერვისს, ქსელს
# არ შლის დისკებს მონაცემების დასაცავად
სტეკებს რამდენიმე უპირატესობა აქვთ:
დეკლარაციული გაშვება: განსაზღვრეთ მთელი აპლიკაციის ტოპოლოგია ერთ ფაილში
ვერსიების კონტროლი: შეინახეთ compose ფაილები საწყისი კოდის კონტროლში აპლიკაციის ვერსიონირებისთვის
აპლიკაციის მთლიანობა: გაუშვით ან წაშალეთ ყველა კომპონენტი ერთად
გამარტივებული მართვა: დააჯგუფეთ დაკავშირებული სერვისები მარტივი მონიტორინგისა და განახლებისთვის
რესურსების იზოლაცია: თითოეულ სტეკს აქვს საკუთარი სახელების სივრცე სერვისებისთვის
# საიდუმლოს შექმნა
echo "mypassword" | docker secret create db_password -
# საიდუმლოებები ინახება დაშიფრული სახით Raft ლოგში
# ისინი არასოდეს იწერება დისკზე დაშიფვრის გარეშე
# `-` ბოლოს მიუთითებს stdin-დან შეყვანას
# სერვისის შექმნა საიდუმლოთი
docker service create --name db \
--secret db_password \
# შექმნილ საიდუმლოზე მითითება
--env POSTGRES_PASSWORD_FILE=/run/secrets/db_password \
# აპლიკაციისთვის მითითება, სად იპოვოს იგი
--secret source=ssl_cert,target=server.crt \
# საიდუმლოსთვის მორგებული სამიზნე გზა
--secret source=ssl_key,target=server.key,mode=0400 \
# მორგებული ფაილის უფლებები
postgres:13
# კონტეინერის შიგნით, საიდუმლოებები ჩანს როგორც ფაილები /run/secrets/-ში
# მაგალითი:
# /run/secrets/db_password
# /run/secrets/server.crt
# /run/secrets/server.key
# საიდუმლოებების სია
docker secret ls
# აჩვენებს ყველა საიდუმლოს შექმნის დროითა და ID-ით
# საიდუმლოს შემოწმება (აჩვენებს მხოლოდ მეტამონაცემებს, არა რეალურ შინაარსს)
docker secret inspect db_password
# საიდუმლოს წაშლა
docker secret rm db_password
# შენიშვნა: არ შეიძლება გაშვებული სერვისების მიერ გამოყენებული საიდუმლოებების წაშლა
# ჯერ უნდა განაახლოთ ან წაშალოთ სერვისები
# საიდუმლოს შექმნა ფაილიდან
docker secret create ssl_cert ./server.crt
კონფიგურაციები საშუალებას გაძლევთ შეინახოთ და გაავრცელოთ კონფიგურაციის ფაილები swarm-ის მასშტაბით:
# კონფიგურაციის შექმნა
docker config create nginx_conf nginx.conf
# კონფიგურაციები საიდუმლოებების მსგავსია, მაგრამ განკუთვნილია არა-მგრძნობიარე მონაცემებისთვის
# შეიძლება იყოს საიდუმლოებებზე დიდი (რამდენიმე მბ-მდე)
# ასევე ინახება Swarm Raft ლოგში გასავრცელებლად
# სერვისის შექმნა კონფიგურაციით
docker service create --name webserver \
--config source=nginx_conf,target=/etc/nginx/nginx.conf \
# კონკრეტულ გზაზე დამონტაჟება
--config source=proxy_params,target=/etc/nginx/proxy.conf,mode=0444 \
# მხოლოდ წაკითხვადი
--publish 80:80 \
nginx:latest
# კონტეინერის შიგნით, კონფიგურაციები ჩანს როგორც ფაილები მითითებულ გზებზე
# დისკებისგან განსხვავებით, კონფიგურაციები შექმნის შემდეგ უცვლელია
# კონფიგურაციის განახლებისთვის, შექმენით ახალი და განაახლეთ სერვისი
# კონფიგურაციების სია
docker config ls
# კონფიგურაციის შემოწმება
docker config inspect nginx_conf
# აჩვენებს მეტამონაცემებსა და შექმნის ინფორმაციას
# კონფიგურაციის წაშლა
docker config rm nginx_conf
# საიდუმლოებების მსგავსად, გამოყენებაში მყოფი კონფიგურაციების წაშლა შეუძლებელია
# სერვისის განახლება ახალი კონფიგურაციის გამოსაყენებლად
docker service update --config-rm nginx_conf --config-add source=nginx_conf_v2,target=/etc/nginx/nginx.conf webserver
კონფიგურაციები იდეალურია:
აპლიკაციის კონფიგურაციის ფაილებისთვის
სტატიკური ვებ კონტენტისთვის
ნაგულისხმევი პარამეტრებისთვის
SSL სერთიფიკატებისთვის (თუ არ არის მგრძნობიარე)
ნებისმიერი ფაილისთვის, რომელიც იდენტური უნდა იყოს ყველა სერვისის ინსტანციაში
# წინა ვერსიაზე დაბრუნება
docker service update --rollback webserver
# ეს აბრუნებს კონფიგურაციას ბოლო განახლებამდე
# დაბრუნების ქცევის კონფიგურაცია
docker service update \
--rollback-parallelism 3 \
# ერთდროულად 3 დავალების დაბრუნება
--rollback-delay 10s \
# ჯგუფებს შორის 10 წამის დაყოვნება
--rollback-failure-action continue \
# დაბრუნების გაგრძელება, თუნდაც დავალებები ვერ შესრულდეს
--rollback-order stop-first \
# ძველი დავალებების შეჩერება ახლების დაწყებამდე
--rollback-monitor 10s \
# ახალი დავალებების მონიტორინგი 10 წამის განმავლობაში გაგრძელებამდე
webserver
# განახლების/დაბრუნების სტატუსის შემოწმება
docker service inspect --pretty webserver
# აჩვენებს მიმდინარე განახლების სტატუსს, პროგრესს და კონფიგურაციას
# განახლების ისტორიის ნახვა
docker service ps --no-trunc webserver
# აჩვენებს დავალებების ყველა წინა ვერსიას მათი იმიჯებით
მოძრავი განახლებები და დაბრუნებები საშუალებას გაძლევთ:
# swarm-ის მდგომარეობის სარეზერვო ასლის შექმნა (მენეჯერ კვანძზე)
# ჯერ, შექმენით სრული სარეზერვო ასლი
tar -czvf swarm-backup.tar.gz /var/lib/docker/swarm
# ეს მოიცავს:
# - Raft ლოგებსა და კონსენსუსის მონაცემებს
# - TLS სერთიფიკატებსა და გასაღებებს
# - საიდუმლო მონაცემებს (დაშიფრული)
# - კვანძის ინფორმაციასა და შეერთების ტოკენებს
# უფრო სრულყოფილი სარეზერვო ასლისთვის, ჩართეთ:
docker service ls > services.txt
docker service inspect $(docker service ls -q) > service-details.json
docker secret ls > secrets.txt
docker config ls > configs.txt
docker network ls --filter driver=overlay > networks.txt
# swarm-ის აღდგენა
# 1. შეაჩერეთ Docker-ი მენეჯერზე
systemctl stop docker
# 2. აღადგინეთ სარეზერვო ასლი
tar -xzvf swarm-backup.tar.gz -C /
# სარეზერვო ასლი უნდა აღდგეს იმავე გზის სტრუქტურაზე
# 3. გაუშვით Docker-ი
systemctl start docker
# Docker-ი ინიციალიზაციას მოახდენს აღდგენილი swarm-ის მდგომარეობის გამოყენებით
# კვანძი განაახლებს თავის როლს (ლიდერი ან მიმდევარი)
# 4. შეამოწმეთ აღდგენა
docker node ls
docker service ls
# ალტერნატიული სარეზერვო ასლის მიდგომა მენეჯერის UCP-ის გამოყენებით
# შეინახეთ UCP სარეზერვო ფაილი, რომელიც მოიცავს swarm-ის კონფიგურაციას
docker container run --log-driver none --rm -i --name ucp \
-v /var/run/docker.sock:/var/run/docker.sock \
docker/ucp:latest backup --id $(docker container ls -q --filter name=ucp-controller) \
--passphrase "secret" > ucp-backup.tar.gz
სრული კატასტროფის აღდგენის გეგმისთვის:
swarm-ის მდგომარეობის რეგულარული ავტომატური სარეზერვო ასლები
ყველა მორგებული კონფიგურაციის დოკუმენტაცია
სკრიპტები სერვისების ხელახლა შესაქმნელად, თუ სარეზერვო ასლი მიუწვდომელია
აღდგენის პროცედურების ტესტირება საცდელ გარემოში
მდგომარეობის მქონე სერვისებისა და მათი მონაცემების გათვალისწინება
მიზეზები: ქსელის პრობლემები, აპარატურის შეცდომა, არასწორი მასშტაბირება
გადაწყვეტა: აღადგინეთ მენეჯერი კვანძები, უზრუნველყავით სათანადო განაწილება
# შეამოწმეთ მენეჯერის სტატუსი
docker node ls
# მოძებნეთ "Leader", "Reachable", ან "Unreachable" MANAGER STATUS სვეტში
ქსელური კავშირის პრობლემები
სიმპტომები: სერვისები ვერ უკავშირდებიან, DNS რეზოლუციის შეცდომები
მიზეზები: ფაირვოლის წესები, ოვერლეი ქსელის პრობლემები, DNS კონფიგურაცია
გადაწყვეტა: შეამოწმეთ ფაირვოლი, შეამოწმეთ ქსელის კონფიგურაცია
# შეამოწმეთ ოვერლეი ქსელის კონფიგურაცია
docker network inspect service_network
# შეამოწმეთ, არის თუ არა საჭირო პორტები ღია კვანძებს შორის
# TCP პორტი 2377 - კლასტერის მართვა
# TCP/UDP პორტი 7946 - კვანძებს შორის კომუნიკაცია
# UDP პორტი 4789 - ოვერლეი ქსელის ტრაფიკი
nc -zv manager-node 2377
დავალების განთავსების შეზღუდვები
სიმპტომები: დავალებები მომლოდინეა, მაგრამ არ იწყება, "შესაფერისი კვანძი არ არის" შეცდომები
მიზეზები: შეუძლებელი შეზღუდვები, რესურსების მიუწვდომლობა
გადაწყვეტა: შეცვალეთ შეზღუდვები, დაამატეთ რესურსები
# იხილეთ წარუმატებელი დავალების დეტალები
docker service ps --no-trunc service_name
# შეამოწმეთ განთავსების შეზღუდვები
docker service inspect --format '{{.Spec.TaskTemplate.Placement}}' service_name
# შეზღუდვების შესაბამისი კვანძების სია
docker node ls --filter node.label=region=east
რესურსების შეზღუდვები
სიმპტომები: სერვისები ვერ იწყება, OOM კლავს
მიზეზები: არასაკმარისი მეხსიერება/CPU, არასწორი რესურსების სპეციფიკაციები
გადაწყვეტა: შეცვალეთ რესურსების ლიმიტები, გაზარდეთ ინფრასტრუქტურა
# შეამოწმეთ კვანძის რესურსები
docker node inspect node_name --format '{{.Description.Resources}}'
# იხილეთ სერვისის რესურსების მოთხოვნები
docker service inspect --format '{{.Spec.TaskTemplate.Resources}}' service_name
# აკონტროლეთ რესურსების გამოყენება
docker stats $(docker ps --format "{{.Names}}" --filter label=com.docker.swarm.service.name=service_name)
იმიჯის ხელმისაწვდომობა
სიმპტომები: "image not found" შეცდომები, სერვისები "preparing" მდგომარეობაშია გაჭედილი
მიზეზები: კერძო რეესტრის ავთენტიფიკაციის პრობლემები, იმიჯი არ არსებობს, ქსელის პრობლემები
გადაწყვეტა: შეამოწმეთ რეესტრზე წვდომა, შეამოწმეთ იმიჯის გზა
# შეამოწმეთ swarm-ის სტატუსი
docker info | grep Swarm
# შეამოწმეთ, არის თუ არა კვანძი swarm რეჟიმში და მისი როლი (manager/worker)
# იხილეთ დავალების ლოგები
docker service logs service_name
# დაამატეთ --details მეტამონაცემების სანახავად, მათ შორის რომელი კვანძი აწარმოებს თითოეულ დავალებას
docker service logs --details service_name
# შეამოწმეთ წარუმატებელი დავალებები
docker service ps --filter "desired-state=running" --filter "actual-state=failed" service_name
# აჩვენებს დავალებებს, რომლებიც უნდა მუშაობდნენ, მაგრამ ვერ შესრულდა, შეცდომის შეტყობინებებით
# იხილეთ დავალების ისტორია
docker service ps --no-trunc service_name
# აჩვენებს ყველა დავალებას, მათ შორის წინა წარუმატებელ მცდელობებს
# შეამოწმეთ ქსელური კავშირი
docker run --rm --network service_network alpine ping service_name
# ამოწმებს DNS რეზოლუციასა და კავშირს ოვერლეი ქსელში
# შეამოწმეთ სერვისის კონფიგურაცია
docker service inspect --pretty service_name
# ადამიანისთვის წაკითხვადი სერვისის კონფიგურაცია
# შეამოწმეთ ქსელის კონფიგურაცია
docker network inspect service_network
# აჩვენებს ქსელის დეტალებს, დაკავშირებულ კონტეინერებსა და ქვექსელის ინფორმაციას
# შეამოწმეთ კვანძის სტატუსი და ჯანმრთელობა
docker node inspect --pretty node_name
# ადამიანისთვის წაკითხვადი კვანძის ინფორმაცია, ჯანმრთელობის სტატუსის ჩათვლით
# იხილეთ სერვისის შეზღუდვები
docker service inspect --format '{{.Spec.TaskTemplate.Placement.Constraints}}' service_name
# აჩვენებს განთავსების შეზღუდვებს, რომლებმაც შეიძლება ხელი შეუშალონ დაგეგმვას
# სერვისების აღმოჩენის გამართვა
docker run --rm --network service_network nicolaka/netshoot \
dig service_name
# ქსელის გაფართოებული გამართვა სპეციალიზებული ინსტრუმენტების გამოყენებით
::