Docker-ის კონტექსტები

ისწავლეთ როგორ მართოთ მრავალი Docker-ის გარემო Docker-ის კონტექსტებით სხვადასხვა Docker-ის ენდფოინთებს შორის შეუფერხებელი გადართვისთვის

Docker-ის კონტექსტები

Docker-ის კონტექსტები საშუალებას გაძლევთ მართოთ კავშირები მრავალ Docker-ის ძრავასთან ერთი Docker CLI კლიენტიდან. ეს მძლავრი ფუნქცია უზრუნველყოფს შეუფერხებელ გადართვას სხვადასხვა Docker-ის გარემოს შორის, როგორიცაა ლოკალური დეველოპმენტი, დისტანციური სერვერები, Kubernetes კლასტერები და ღრუბლოვანი პროვაიდერები. Docker 19.03-ში წარმოდგენილი კონტექსტები აგვარებენ მრავალი Docker-ის გარემოს მართვის პრობლემას გარემოს ცვლადების ან კონფიგურაციის ფაილების ყოველ ჯერზე შეცვლის საჭიროების გარეშე.

კონტექსტების გაგება

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

  • Docker-ის კავშირების დასახელებული კონფიგურაციები, რომლებიც აერთიანებენ ყველა კავშირის პარამეტრს
  • ინახავენ ენდფოინთის ინფორმაციას, Docker-ის API სოკეტის მდებარეობის ჩათვლით (TCP, SSH, ან Unix სოკეტი)
  • მოიცავენ ავთენტიფიკაციის დეტალებს, როგორიცაა TLS სერთიფიკატები და API რწმუნებათა სიგელები
  • ერთი სამუშაო სადგურიდან მრავალი Docker-ის გარემოს მხარდაჭერა
  • გარემოს სწრაფი გადართვის საშუალება shell-ის კონფიგურაციის შეცვლის გარეშე
  • კავშირის მდგომარეობის შენარჩუნება CLI სესიებს შორის

ძირითადი უპირატესობები

  • მართეთ მრავალი გარემო ერთი CLI-დან კონფიგურაციის ფაილების შეცვლის გარეშე
  • შეამცირეთ კონფიგურაციის შეცდომები დადასტურებული კავშირის პარამეტრების შენახვით
  • გაამარტივეთ CI/CD პაიპლაინები გარემოს-სპეციფიკური გაშვების სამიზნეებით
  • გაამარტივეთ დეველოპმენტის სამუშაო პროცესები ლოკალურ და დისტანციურ Docker-ის ჰოსტებზე
  • გააუმჯობესეთ გუნდური თანამშრომლობა სტანდარტიზებული გარემოს განმარტებებით
  • ჰიბრიდული ღრუბლოვანი სტრატეგიების მხარდაჭერა თანმიმდევრული მართვის ინტერფეისებით
  • აღმოფხვრით SSH სესიების საჭიროება დისტანციურ Docker-ის ჰოსტებზე ბრძანებების გასაშვებად

კონტექსტების მართვა

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

# Docker Engine-ის კონტექსტი TLS უსაფრთხოებით
docker context create my-engine \
  --docker "host=tcp://192.168.1.10:2376,ca=~/certs/ca.pem,cert=~/certs/cert.pem,key=~/certs/key.pem"
# TCP კავშირი დისტანციურ Docker-ის ჰოსტთან TLS სერთიფიკატებით ავთენტიფიკაციისთვის
# სამი სერთიფიკატის ფაილი უზრუნველყოფს ორმხრივ TLS ავთენტიფიკაციას
# პორტი 2376 არის სტანდარტული უსაფრთხო Docker-ის დემონის პორტი

# Kubernetes-ის კონტექსტი (Docker+Kubernetes ოპერაციებისთვის)
docker context create my-kubernetes \
  --docker "host=unix:///var/run/docker.sock" \
  --kubernetes "config=/path/to/kubeconfig.yaml,context=my-cluster"
# აერთიანებს Docker-ისა და Kubernetes-ის ენდფოინთებს ერთ კონტექსტში
# უზრუნველყოფს შეუფერხებელ გადართვას კონტეინერისა და ორკესტრაციის ოპერაციებს შორის
# იყენებს ლოკალურ Docker-ის დემონს, მაგრამ დისტანციურ Kubernetes კლასტერს
# იყენებს არსებულ kubeconfig ფაილს Kubernetes-ის ავთენტიფიკაციისთვის

# ACI (Azure Container Instances) კონტექსტი
docker context create my-aci \
  --aci-subscription-id $AZURE_SUBSCRIPTION_ID
# უკავშირდება Azure Container Instances-ს სერვერ-გარეშე კონტეინერების გაშვებისთვის
# მოითხოვს Azure CLI-ის ავთენტიფიკაციას კონტექსტის შექმნამდე
# საშუალებას იძლევა ღრუბლოვანი კონტეინერების მართვას საკუთარი Kubernetes-ის გაშვების გარეშე
# აქვს პირდაპირი გაშვების მხარდაჭერა Docker-ის ბრძანებების გამოყენებით ღრუბლოვან კონტეინერებზე

კონტექსტის გავრცელებული სცენარები

დეველოპმენტის გარემო

  • ლოკალური Docker Desktop-ი დეველოპმენტისა და ტესტირებისთვის თქვენს სამუშაო სადგურზე
  • დეველოპმენტის სერვერები გაზიარებული გუნდური გარემოებისთვის ან სპეციალიზებული აპარატურისთვის
  • ტესტირების გარემო QA-სთვის, ინტეგრაციისა და წარმადობის ტესტირებისთვის
  • სტეიჯინგ სერვერები, რომლებიც ასახავენ პროდაქშენის კონფიგურაციას გაშვებამდე ვალიდაციისთვის
  • პროდაქშენის გარემო შეზღუდული წვდომითა და გაძლიერებული უსაფრთხოებით
  • დისტანციური დეველოპმენტის გარემო რესურს-ინტენსიური დატვირთვებისთვის

მრავალ-ღრუბლოვანი მართვა

  • AWS ECS/EKS კონტექსტები Amazon-ის კონტეინერების სერვისების სამართავად
  • Azure ACI/AKS კონტექსტები Microsoft-ის ღრუბლოვანი კონტეინერების ორკესტრაციისთვის
  • Google Cloud GKE კონტექსტები Google Kubernetes Engine-ის გაშვებისთვის
  • მორგებული ღრუბლოვანი პროვაიდერის დაყენებები სპეციალიზებული API-ებით ან კონფიგურაციებით
  • ჰიბრიდული გაშვებები, რომლებიც მოიცავს ლოკალურ და ღრუბლოვან გარემოს
  • მრავალ-ღრუბლოვანი სტრატეგიები, რომლებიც იყენებენ საუკეთესო სერვისებს სხვადასხვა პროვაიდერისგან
  • Edge გაშვებები IoT-სა და განაწილებული გამოთვლების სცენარებისთვის

კონტექსტი Docker Compose-ში

სპეციალიზებული კონტექსტების შექმნა

# კონტექსტის შექმნა TLS-ით
docker context create secure-context \
  --docker "host=tcp://secure-docker-host:2376,ca=./ca.pem,cert=./cert.pem,key=./key.pem"
# იყენებს TLS ორმხრივ ავთენტიფიკაციას უსაფრთხო დისტანციური კავშირებისთვის
# მოითხოვს სერტიფიკატის ავტორიტეტს, კლიენტის სერთიფიკატს და კლიენტის გასაღებს
# უზრუნველყოფს დაშიფრულ კომუნიკაციასა და ავთენტიფიკაციას
# რეკომენდებულია პროდაქშენის გარემოებისა და ინტერნეტთან დაკავშირებული Docker-ის ჰოსტებისთვის

# კონტექსტის შექმნა SSH-ით
docker context create ssh-context \
  --docker "host=ssh://user@remote-host"
# იყენებს SSH-ს უსაფრთხო კავშირისა და ავთენტიფიკაციისთვის
# იყენებს არსებულ SSH გასაღებებსა და კონფიგურაციას
# არ არის საჭირო Docker-ის დემონის TCP პორტის გამოჩენა
# მუშაობს bastion ჰოსტებისა და jump სერვერების საშუალებით
# შეუძლია გამოიყენოს არასტანდარტული SSH პორტები: ssh://user@remote-host:2222

# კონტექსტის შექმნა სოკეტის გზით
docker context create socket-context \
  --docker "host=unix:///custom/path/docker.sock"
# უკავშირდება Docker-ის დემონს Unix სოკეტის საშუალებით
# სასარგებლოა არასტანდარტული სოკეტის მდებარეობებისთვის
# გავრცელებულია მორგებულ ინსტალაციებში ან rootless Docker-ში
# ქსელური გამოჩენის გარეშე, უმაღლესი უსაფრთხოება ლოკალური კავშირებისთვის
# მაქსიმალური წარმადობა ლოკალური ოპერაციებისთვის

კონტექსტების გამოყენება სკრიპტებში

სკრიპტინგი კონტექსტებით

#!/bin/bash
# გაშვება მრავალ გარემოში
for ctx in dev staging prod; do
  echo "Deploying to $ctx environment..."
  docker --context $ctx stack deploy -c docker-compose.yml my-app
  
  # გაშვების სტატუსის შემოწმება
  docker --context $ctx service ls --filter name=my-app
  
  # დაელოდეთ გაშვების დასრულებას
  docker --context $ctx service ls --filter name=my-app \
    --format "{{.Replicas}}" | grep -q "[0-9]/[0-9]" && \
    echo "Deployment to $ctx complete"
done

# ეს სკრიპტი აჩვენებს:
# - თანმიმდევრულ გაშვებას გარემოებში
# - თანმიმდევრულ კონფიგურაციას იგივე compose ფაილის გამოყენებით
# - შემოწმების ნაბიჯებს თითოეული გაშვებისთვის
# - გარემოს-სპეციფიკურ მიზნობრიობას კონფიგურაციის ცვლილებების გარეშე

გარემოს ცვლადები

# კონტექსტის დაყენება გარემოს ცვლადით
export DOCKER_CONTEXT=production
# აყენებს ნაგულისხმევ კონტექსტს მიმდინარე shell სესიისთვის
# ყველა Docker-ის ბრძანება მიემართება პროდაქშენის გარემოს
# ნარჩუნდება shell სესიის დასრულებამდე ან ცვლადის შეცვლამდე

# ბრძანების გაშვება მიმდინარე კონტექსტით
docker ps
# იყენებს გარემოს ცვლადით დაყენებულ კონტექსტს (production)
# ჩამოთვლის პროდაქშენის გარემოში გაშვებულ კონტეინერებს
# არ არის საჭირო --context ფლაგის მითითება თითოეული ბრძანებისთვის

# გადაფარვა კონკრეტული კონტექსტით
DOCKER_CONTEXT=staging docker ps
# დროებით გადაფარავს მიმდინარე კონტექსტს ერთი ბრძანებისთვის
# უბრუნდება წინა კონტექსტს შემდგომი ბრძანებებისთვის
# არ ცვლის მუდმივ კონფიგურაციას
# სასარგებლოა სწრაფი ოპერაციებისთვის სხვა გარემოში

# სხვა გარემოს ცვლადებთან კომბინირება
DOCKER_CONTEXT=prod DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect myimage:latest
# შეუძლია მრავალი Docker-თან დაკავშირებული გარემოს ცვლადის კომბინირება
# უზრუნველყოფს მოქნილ კონფიგურაციას კონკრეტული ბრძანებებისთვის

CI/CD ინტეგრაცია

# GitHub Actions-ის მაგალითი
name: Multi-Environment Deployment

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Docker Context
        run: |
          docker context create production \
            --docker "host=ssh://user@prod-server,ssh-key=${{ secrets.SSH_KEY }}"
      
      - name: Deploy to Production
        run: |
          docker --context production stack deploy -c docker-compose.yml my-app

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

რწმუნებათა სიგელების დაცვა

  • შეინახეთ მგრძნობიარე მონაცემები რწმუნებათა სიგელების მენეჯერებში, როგორიცაა Docker Credential Helpers
  • გამოიყენეთ SSH გასაღებები პაროლით დისტანციური ჰოსტის ავთენტიფიკაციისთვის
  • დანერგეთ მინიმალური პრივილეგიის წვდომის კონტროლი თითოეული კონტექსტისთვის
  • რეგულარულად შეცვალეთ რწმუნებათა სიგელები (სერთიფიკატები, API გასაღებები, წვდომის ტოკენები)
  • გამოიყენეთ გარემოს-სპეციფიკური ნებართვები (მხოლოდ წაკითხვა dev-ისთვის, სრული წვდომა ადმინისტრატორებისთვის)
  • გამოყავით კონტექსტის მართვა რწმუნებათა სიგელების მართვისგან
  • დანერგეთ რწმუნებათა სიგელების გაუქმების პროცედურები კომპრომეტირებული გარემოებისთვის
  • შეამოწმეთ კონტექსტის გამოყენება და რწმუნებათა სიგელებზე წვდომის შაბლონები
  • გამოიყენეთ რწმუნებათა სიგელების დელეგირება, სადაც ეს მიზანშეწონილია (OIDC, IAM როლები)
  • დანერგეთ MFA პროდაქშენის კონტექსტებზე წვდომისთვის

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

# კონტექსტის შექმნა რწმუნებათა სიგელების დამხმარით
docker context create secure-context \
  --docker "host=tcp://secure-host:2376" \
  --description "Context with secure credentials"
# რწმუნებათა სიგელების დამხმარე ავტომატურად მართავს და იცავს ავთენტიფიკაციის ინფორმაციას
# docker credential helper უსაფრთხოდ შეინახავს და ამოიღებს რწმუნებათა სიგელებს საჭიროებისამებრ
# აქვს სხვადასხვა ბექენდის მხარდაჭერა: keychain (macOS), wincred (Windows), pass/libsecret (Linux)
# ცენტრალიზებული რწმუნებათა სიგელების მართვა კონტექსტის განმარტებებისგან ცალკე

# კონტექსტის ექსპორტი (მგრძნობიარე მონაცემების გარეშე)
docker context export secure-context --output secure-context.dockercontext
# ახდენს კონტექსტის კონფიგურაციის ექსპორტს მგრძნობიარე რწმუნებათა სიგელების ჩაშენების გარეშე
# უსაფრთხოა გუნდის წევრებთან გასაზიარებლად ან ვერსიების კონტროლში შესანახად
# მიმღებებს მაინც სჭირდებათ შესაბამისი რწმუნებათა სიგელები კონტექსტის გამოსაყენებლად
# უზრუნველყოფს კონტექსტის განმარტების გამოყოფას ავთენტიფიკაციისგან
# შესანიშნავია გუნდის დანერგვისა და სტანდარტიზაციისთვის

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

# კონტექსტის ექსპორტი
docker context export my-context --output my-context.dockercontext
# ქმნის პორტატულ კონტექსტის განმარტების ფაილს
# გამორიცხავს მგრძნობიარე ინფორმაციას, როგორიცაა TLS გასაღებები
# შეიძლება უსაფრთხოდ იყოს ვერსიების კონტროლის ქვეშ
# სასარგებლოა გუნდის სტანდარტიზაციისა და დანერგვისთვის

# კონტექსტის იმპორტი
docker context import new-context my-context.dockercontext
# ქმნის ახალ კონტექსტს ექსპორტირებული განმარტების ფაილიდან
# მომხმარებელმა უნდა მიაწოდოს საკუთარი რწმუნებათა სიგელები, თუ საჭიროა
# შეუძლია კონტექსტის სახელის შეცვლა იმპორტისას
# ამოწმებს კონტექსტის კონფიგურაციას იმპორტისას
# იმპორტის მაგალითი ახალი სახელით:
# docker context import production-eu my-context.dockercontext

კონტექსტის ორგანიზების სტრატეგიები

დასახელების კონვენციები

  • <გარემო>-<რეგიონი>-<როლი> იერარქიული დასახელების შაბლონი
  • dev-useast-manager დეველოპმენტის გარემოსთვის აშშ-ს აღმოსავლეთ რეგიონში მენეჯერის როლით
  • prod-euwest-worker პროდაქშენის გარემოსთვის ევროპის დასავლეთ რეგიონში მუშა როლით
  • staging-apac-registry სტეიჯინგის გარემოსთვის აზია-წყნარი ოკეანის რეგიონში რეესტრის სერვისით
  • ნათელი, თანმიმდევრული დასახელება, რომელიც შეიცავს კრიტიკულ ინფორმაციას
  • ანბანური დალაგება აჯგუფებს დაკავშირებულ კონტექსტებს
  • მარტივი ფილტრაცია და შაბლონების შეხამება სტანდარტული დასახელებით
  • მასშტაბირდება დიდ გარემოებზე მრავალი კონტექსტით
  • უზრუნველყოფს პროგრამულ კონტექსტის შერჩევას სკრიპტებში

დაჯგუფების სტრატეგიები

# კონტექსტების სია ფილტრით
docker context ls --format "{{if .Name | contains \"prod\"}}{{.Name}}: {{.Endpoints.docker.Host}}{{end}}"
# იყენებს Go-ს შაბლონირებას გამოტანის გასაფილტრად და დასაფორმატებლად
# აჩვენებს მხოლოდ პროდაქშენის კონტექსტებს მათი Docker-ის ენდფოინთებით
# მძლავრია სკრიპტინგისა და ავტომატიზაციისთვის
# შეუძლია გაფილტროს ნებისმიერი კონტექსტის თვისებით ან მეტამონაცემებით

# კონტექსტების შექმნა ლეიბლებით
docker context create prod-us \
  --docker "host=ssh://user@prod-us" \
  --description "Production US" \
  --label env=prod --label region=us
# ლეიბლები უზრუნველყოფენ მეტამონაცემებს ორგანიზებისა და ფილტრაციისთვის
# მრავალ ლეიბლს შეუძლია კონტექსტების კატეგორიზაცია სხვადასხვა გზით
# შეუძლია კონტექსტების გაფილტვრა ლეიბლით: --filter label=env=prod
# ლეიბლები არ მოქმედებს კონტექსტის ფუნქციონალზე
# სასარგებლოა დიდი რაოდენობის კონტექსტების ორგანიზებისთვის

# კონტექსტების სია ლეიბლით
docker context ls --format "table {{.Name}} {{.Labels.env}} {{.Labels.region}}" \
  --filter label=env=prod
# ქმნის კონტექსტების მორგებულ ცხრილის ხედს ლეიბლის მიხედვით
# შესანიშნავია გუნდის დოკუმენტაციისა და კონტექსტის ინვენტარიზაციისთვის

გავრცელებული გამოყენების შემთხვევები

კონტექსტი Docker Buildx-თან

# ბილდერის შექმნა კონკრეტული კონტექსტის გამოყენებით
docker buildx create --name remote-builder --use --context remote-server
# ქმნის BuildKit-ის ბილდერს, რომელიც იყენებს remote-server კონტექსტს
# გადააქვს ბილდის დამუშავება დისტანციურ Docker-ის ჰოსტზე
# სასარგებლოა რესურს-ინტენსიური ბილდებისთვის მძლავრ სერვერებზე
# --use ფლაგი ხდის მას ნაგულისხმევ ბილდერად მომავალი ბრძანებებისთვის

# აგება დისტანციური ბილდერის გამოყენებით
docker buildx build --builder remote-builder -t myimage:latest .
# აგებს იმიჯს კონტექსტში მითითებულ დისტანციურ სერვერზე
# ლოკალური ფაილები ავტომატურად გადაეცემა დისტანციურ ბილდის სერვერს
# საბოლოო იმიჯი ინახება დისტანციურ Docker-ის ჰოსტზე
# დაამატეთ --load, რომ იმიჯი ასევე იმპორტირდეს თქვენს ლოკალურ Docker-ში

# მრავალ-კონტექსტური, მრავალ-პლატფორმული ბილდი
docker buildx create --name builder1 --context context1
docker buildx create --name builder2 --context context2
docker buildx create --name multibuilder --driver docker-container \
  --use --bootstrap --append builder1 --append builder2
docker buildx build --platform linux/amd64,linux/arm64 -t myimage:latest .
# ქმნის განაწილებულ ბილდის ფერმას მრავალ კონტექსტში
# თითოეულ ბილდერს შეუძლია სხვადასხვა პლატფორმის ბილდების დამუშავება
# საშუალებას იძლევა მრავალ-არქიტექტურული იმიჯების პარალელურ აგებას
# ანაწილებს დატვირთვას მრავალ Docker-ის ჰოსტზე
# ამცირებს მთლიან ბილდის დროს რთული მრავალ-პლატფორმული იმიჯებისთვის

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

ხშირი პრობლემები

  • კავშირის დროის ამოწურვა, როდესაც ქსელის შეყოვნება მაღალია ან ფაირვოლები ბლოკავენ ტრაფიკს
  • ავთენტიფიკაციის შეცდომები ვადაგასული სერთიფიკატების ან არასწორი რწმუნებათა სიგელების გამო
  • ნებართვების პრობლემები არასაკმარისი მომხმარებლის უფლებებიდან დისტანციურ Docker-ის ჰოსტებზე
  • ქსელური კავშირის პრობლემები, გამოწვეული ფაირვოლის წესებით ან პროქსის კონფიგურაციებით
  • სერთიფიკატის ვალიდაციის შეცდომები ვადაგასული ან შეუსაბამო TLS სერთიფიკატებიდან
  • რესურსების შეზღუდვები, როდესაც დისტანციურ ჰოსტებს არ აქვთ საკმარისი მეხსიერება ან CPU ოპერაციებისთვის
  • SSH კავშირის პრობლემები, გასაღების ნებართვების პრობლემების ან აგენტის კავშირის ჩათვლით
  • API ვერსიების შეუსაბამობა Docker-ის კლიენტსა და დისტანციურ დემონის ვერსიებს შორის
  • კონტექსტის კონფიგურაციის შეცდომები ბეჭდვითი შეცდომების ან არასწორი ენდფოინთის სპეციფიკაციების გამო

დიაგნოსტიკური ბრძანებები

# კავშირის ტესტირება
docker --context my-context info
# ამოწმებს ძირითად კავშირს Docker-ის დემონთან
# აჩვენებს სისტემის მასშტაბით ინფორმაციას, კონფიგურაციის ჩათვლით
# სწრაფად ადგენს, მუშაობს თუ არა კონტექსტი სწორად
# პირველი ბრძანება, რომელიც უნდა გაუშვათ კონტექსტის პრობლემების მოგვარებისას

# ენდფოინთის ინფორმაციის შემოწმება
docker context inspect --format '{{json .Endpoints}}' my-context | jq
# გამოაქვს ნედლი ენდფოინთის კონფიგურაცია JSON ფორმატში
# სასარგებლოა კავშირის პარამეტრების შესამოწმებლად
# 'jq' ხელსაწყო აფორმატებს გამოტანილ შედეგს უკეთესი წაკითხვადობისთვის
# ეხმარება კონტექსტის განმარტებაში არასწორი კონფიგურაციის იდენტიფიცირებაში

# Docker-ის დემონის ვერსიის შემოწმება
docker --context my-context version
# აჩვენებს როგორც კლიენტის, ისე სერვერის ვერსიებს
# ადგენს API ვერსიების შეუსაბამობას
# ამოწმებს, რომ დისტანციური Docker-ის ძრავა პასუხობს
# უზრუნველყოფს TLS-ისა და ავთენტიფიკაციის ინფორმაციას

# ქსელური კავშირის ტესტირება
docker --context my-context run --rm alpine ping -c 1 google.com
# ამოწმებს, შეუძლიათ თუ არა კონტეინერებს ინტერნეტთან დაკავშირება
# ამოწმებს DNS რეზოლუციას დისტანციურ Docker-ის ჰოსტზე
# ამოწმებს, ფუნქციონირებს თუ არა კონტეინერის ქსელი
# სასარგებლოა ქსელის იზოლაციის პრობლემების დიაგნოსტირებისთვის

# რესურსების ხელმისაწვდომობის ტესტირება
docker --context my-context system df
# აჩვენებს დისკის გამოყენების ინფორმაციას დისტანციურ სისტემაზე
# ეხმარება რესურსების შეზღუდვების იდენტიფიცირებაში
# ამოწმებს, არის თუ არა საცავი ხელმისაწვდომი იმიჯებისა და კონტეინერებისთვის

კონტექსტის მიგრაცია

# შექმენით კონტექსტი ახალი გარემოსთვის
docker context create new-prod --docker "host=ssh://user@new-prod-server"

# შეამოწმეთ ახალი გარემო
docker --context new-prod stack deploy -c docker-compose.yml my-app-test

# გადართეთ პროდაქშენი ვალიდაციის შემდეგ
docker context use new-prod

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

კონტექსტის მართვა

  • დაადოკუმენტირეთ ყველა კონტექსტი დეტალური ინფორმაციით დანიშნულებისა და კონფიგურაციის შესახებ
  • გამოიყენეთ თანმიმდევრული დასახელების კონვენციები, რომლებიც შეიცავს გარემოს, რეგიონსა და როლს
  • შეზღუდეთ წვდომა პროდაქშენის კონტექსტებზე RBAC-ისა და რწმუნებათა სიგელების მართვის საშუალებით
  • დანერგეთ კონტექსტის როტაციის პროცედურები უსაფრთხოებისა და ინფრასტრუქტურის განახლებისთვის
  • რეგულარულად შეამოწმეთ კონტექსტის გამოყენება არაავტორიზებული წვდომის ან ბოროტად გამოყენების იდენტიფიცირებისთვის
  • გაუზიარეთ დეველოპმენტის კონტექსტები გუნდის წევრებს ექსპორტირებული კონფიგურაციების გამოყენებით
  • შექმენით დანერგვის დოკუმენტაცია ახალი გუნდის წევრებისთვის
  • დაამყარეთ პროცედურები კონტექსტის სასიცოცხლო ციკლის მართვისთვის (შექმნიდან პენსიაზე გასვლამდე)
  • დანერგეთ კონტექსტის კონფიგურაციების ავტომატური ვალიდაცია
  • შექმენით საგანგებო პროცედურები კონტექსტზე წვდომისთვის ინციდენტების დროს

სამუშაო პროცესის ინტეგრაცია

  • ინტეგრაცია shell-ის ალიასებთან სწრაფი კონტექსტის გადართვისთვის
    • მაგალითი: alias dprod="docker --context production"
    • მაგალითი: alias dswitch="docker context use"
  • გამოიყენეთ Docker Compose-ის გარემოსთან თანმიმდევრული მრავალ-სერვისიანი გაშვებებისთვის
  • ჩართეთ გაშვების სკრიპტებში სათანადო შეცდომების დამუშავებითა და ლოგირებით
  • დაადოკუმენტირეთ პროექტის README ფაილებში მაგალითებითა და წინაპირობებით
  • ავტომატიზირეთ კონტექსტის გადართვა git-ის ტოტების ან პროექტის დირექტორიების საფუძველზე
  • შექმენით გარემოს-სპეციფიკური პარამეტრების ფაილები, რომლებიც მიბმულია კონკრეტულ კონტექსტებზე
  • შექმენით კონტექსტზე-დამოკიდებული shell-ის მოთხოვნები, რომლებიც აჩვენებენ აქტიურ კონტექსტს
  • დანერგეთ CI/CD ჰუკები, რომლებიც ირჩევენ შესაბამის კონტექსტებს
  • შექმენით კონტექსტის ჯგუფები საერთო ოპერაციებისთვის მრავალ გარემოში
  • შეიმუშავეთ კონტექსტ-სპეციფიკური მონიტორინგისა და შეტყობინებების კონფიგურაციები

რეალური მაგალითები

# ბილდერის შექმნა კონკრეტული კონტექსტის გამოყენებით
docker buildx create --name remote-builder --use --context remote-server
# ქმნის BuildKit-ის ბილდერს, რომელიც იყენებს remote-server კონტექსტს
# გადააქვს ბილდის დამუშავება დისტანციურ Docker-ის ჰოსტზე
# სასარგებლოა რესურს-ინტენსიური ბილდებისთვის მძლავრ სერვერებზე
# --use ფლაგი ხდის მას ნაგულისხმევ ბილდერად მომავალი ბრძანებებისთვის

# აგება დისტანციური ბილდერის გამოყენებით
docker buildx build --builder remote-builder -t myimage:latest .
# აგებს იმიჯს კონტექსტში მითითებულ დისტანციურ სერვერზე
# ლოკალური ფაილები ავტომატურად გადაეცემა დისტანციურ ბილდის სერვერს
# საბოლოო იმიჯი ინახება დისტანციურ Docker-ის ჰოსტზე
# დაამატეთ --load, რომ იმიჯი ასევე იმპორტირდეს თქვენს ლოკალურ Docker-ში

# მრავალ-კონტექსტური, მრავალ-პლატფორმული ბილდი
docker buildx create --name builder1 --context context1
docker buildx create --name builder2 --context context2
docker buildx create --name multibuilder --driver docker-container \
  --use --bootstrap --append builder1 --append builder2
docker buildx build --platform linux/amd64,linux/arm64 -t myimage:latest .
# ქმნის განაწილებულ ბილდის ფერმას მრავალ კონტექსტში
# თითოეულ ბილდერს შეუძლია სხვადასხვა პლატფორმის ბილდების დამუშავება
# საშუალებას იძლევა მრავალ-არქიტექტურული იმიჯების პარალელურ აგებას
# ანაწილებს დატვირთვას მრავალ Docker-ის ჰოსტზე
# ამცირებს მთლიან ბილდის დროს რთული მრავალ-პლატფორმული იმიჯებისთვის

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

ხშირი პრობლემები

  • კავშირის დროის ამოწურვა, როდესაც ქსელის შეყოვნება მაღალია ან ფაირვოლები ბლოკავენ ტრაფიკს
  • ავთენტიფიკაციის შეცდომები ვადაგასული სერთიფიკატების ან არასწორი რწმუნებათა სიგელების გამო
  • ნებართვების პრობლემები არასაკმარისი მომხმარებლის უფლებებიდან დისტანციურ Docker-ის ჰოსტებზე
  • ქსელური კავშირის პრობლემები, გამოწვეული ფაირვოლის წესებით ან პროქსის კონფიგურაციებით
  • სერთიფიკატის ვალიდაციის შეცდომები ვადაგასული ან შეუსაბამო TLS სერთიფიკატებიდან
  • რესურსების შეზღუდვები, როდესაც დისტანციურ ჰოსტებს არ აქვთ საკმარისი მეხსიერება ან CPU ოპერაციებისთვის
  • SSH კავშირის პრობლემები, გასაღების ნებართვების პრობლემების ან აგენტის კავშირის ჩათვლით
  • API ვერსიების შეუსაბამობა Docker-ის კლიენტსა და დისტანციურ დემონის ვერსიებს შორის
  • კონტექსტის კონფიგურაციის შეცდომები ბეჭდვითი შეცდომების ან არასწორი ენდფოინთის სპეციფიკაციების გამო

დიაგნოსტიკური ბრძანებები

# კავშირის ტესტირება
docker --context my-context info
# ამოწმებს ძირითად კავშირს Docker-ის დემონთან
# აჩვენებს სისტემის მასშტაბით ინფორმაციას, კონფიგურაციის ჩათვლით
# სწრაფად ადგენს, მუშაობს თუ არა კონტექსტი სწორად
# პირველი ბრძანება, რომელიც უნდა გაუშვათ კონტექსტის პრობლემების მოგვარებისას

# ენდფოინთის ინფორმაციის შემოწმება
docker context inspect --format '{{json .Endpoints}}' my-context | jq
# გამოაქვს ნედლი ენდფოინთის კონფიგურაცია JSON ფორმატში
# სასარგებლოა კავშირის პარამეტრების შესამოწმებლად
# 'jq' ხელსაწყო აფორმატებს გამოტანილ შედეგს უკეთესი წაკითხვადობისთვის
# ეხმარება კონტექსტის განმარტებაში არასწორი კონფიგურაციის იდენტიფიცირებაში

# Docker-ის დემონის ვერსიის შემოწმება
docker --context my-context version
# აჩვენებს როგორც კლიენტის, ისე სერვერის ვერსიებს
# ადგენს API ვერსიების შეუსაბამობას
# ამოწმებს, რომ დისტანციური Docker-ის ძრავა პასუხობს
# უზრუნველყოფს TLS-ისა და ავთენტიფიკაციის ინფორმაციას

# ქსელური კავშირის ტესტირება
docker --context my-context run --rm alpine ping -c 1 google.com
# ამოწმებს, შეუძლიათ თუ არა კონტეინერებს ინტერნეტთან დაკავშირება
# ამოწმებს DNS რეზოლუციას დისტანციურ Docker-ის ჰოსტზე
# ამოწმებს, ფუნქციონირებს თუ არა კონტეინერის ქსელი
# სასარგებლოა ქსელის იზოლაციის პრობლემების დიაგნოსტირებისთვის

# რესურსების ხელმისაწვდომობის ტესტირება
docker --context my-context system df
# აჩვენებს დისკის გამოყენების ინფორმაციას დისტანციურ სისტემაზე
# ეხმარება რესურსების შეზღუდვების იდენტიფიცირებაში
# ამოწმებს, არის თუ არა საცავი ხელმისაწვდომი იმიჯებისა და კონტეინერებისთვის

კონტექსტის მიგრაცია

# შექმენით კონტექსტი ახალი გარემოსთვის
docker context create new-prod --docker "host=ssh://user@new-prod-server"

# შეამოწმეთ ახალი გარემო
docker --context new-prod stack deploy -c docker-compose.yml my-app-test

# გადართეთ პროდაქშენი ვალიდაციის შემდეგ
docker context use new-prod

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

კონტექსტის მართვა

  • დაადოკუმენტირეთ ყველა კონტექსტი დეტალური ინფორმაციით დანიშნულებისა და კონფიგურაციის შესახებ
  • გამოიყენეთ თანმიმდევრული დასახელების კონვენციები, რომლებიც შეიცავს გარემოს, რეგიონსა და როლს
  • შეზღუდეთ წვდომა პროდაქშენის კონტექსტებზე RBAC-ისა და რწმუნებათა სიგელების მართვის საშუალებით
  • დანერგეთ კონტექსტის როტაციის პროცედურები უსაფრთხოებისა და ინფრასტრუქტურის განახლებისთვის
  • რეგულარულად შეამოწმეთ კონტექსტის გამოყენება არაავტორიზებული წვდომის ან ბოროტად გამოყენების იდენტიფიცირებისთვის
  • გაუზიარეთ დეველოპმენტის კონტექსტები გუნდის წევრებს ექსპორტირებული კონფიგურაციების გამოყენებით
  • შექმენით დანერგვის დოკუმენტაცია ახალი გუნდის წევრებისთვის
  • დაამყარეთ პროცედურები კონტექსტის სასიცოცხლო ციკლის მართვისთვის (შექმნიდან პენსიაზე გასვლამდე)
  • დანერგეთ კონტექსტის კონფიგურაციების ავტომატური ვალიდაცია
  • შექმენით საგანგებო პროცედურები კონტექსტზე წვდომისთვის ინციდენტების დროს

სამუშაო პროცესის ინტეგრაცია

  • ინტეგრაცია shell-ის ალიასებთან სწრაფი კონტექსტის გადართვისთვის
    • მაგალითი: alias dprod="docker --context production"
    • მაგალითი: alias dswitch="docker context use"
  • გამოიყენეთ Docker Compose-ის გარემოსთან თანმიმდევრული მრავალ-სერვისიანი გაშვებებისთვის
  • ჩართეთ გაშვების სკრიპტებში სათანადო შეცდომების დამუშავებითა და ლოგირებით
  • დაადოკუმენტირეთ პროექტის README ფაილებში მაგალითებითა და წინაპირობებით
  • ავტომატიზირეთ კონტექსტის გადართვა git-ის ტოტების ან პროექტის დირექტორიების საფუძველზე
  • შექმენით გარემოს-სპეციფიკური პარამეტრების ფაილები, რომლებიც მიბმულია კონკრეტულ კონტექსტებზე
  • შექმენით კონტექსტზე-დამოკიდებული shell-ის მოთხოვნები, რომლებიც აჩვენებენ აქტიურ კონტექსტს
  • დანერგეთ CI/CD ჰუკები, რომლებიც ირჩევენ შესაბამის კონტექსტებს
  • შექმენით კონტექსტის ჯგუფები საერთო ოპერაციებისთვის მრავალ გარემოში
  • შეიმუშავეთ კონტექსტ-სპეციფიკური მონიტორინგისა და შეტყობინებების კონფიგურაციები

რეალური მაგალითები