Docker Volume-ები

ისწავლეთ Docker volume-ების, მონაცემთა მდგრადობის და შენახვის მართვის შესახებ

Docker Volume-ები

Volume-ები არის სასურველი მექანიზმი Docker კონტეინერების მიერ გენერირებული და გამოყენებული მონაცემების შესანარჩუნებლად. ისინი სრულად იმართება Docker-ის მიერ და რამდენიმე უპირატესობას გვთავაზობს bind mount-ებთან შედარებით.

კონტეინერის მონაცემები ნაგულისხმევად ეფემერულია - როდესაც კონტეინერი იშლება, მისი ყველა მონაცემი იკარგება. Docker volume-ები ამ პრობლემას წყვეტენ მუდმივი საცავის უზრუნველყოფით, რომელიც კონტეინერებისგან დამოუკიდებლად არსებობს. ისინი აუცილებელია stateful აპლიკაციებისთვის, როგორიცაა მონაცემთა ბაზები, კონტენტის მართვის სისტემები და ნებისმიერი აპლიკაცია, რომელსაც სჭირდება მონაცემების შენარჩუნება კონტეინერის გადატვირთვებს შორის.

Docker volume-ები შექმნილია იმისთვის, რომ იყოს:

  • მუდმივი: მონაცემები უძლებს კონტეინერის სიცოცხლის ციკლს
  • პორტატული: ადვილად გადაადგილდება ჰოსტებს შორის
  • მართვადი: სრული სიცოცხლის ციკლის მართვა Docker ბრძანებებით
  • წარმადი: ოპტიმიზირებულია I/O ოპერაციებისთვის
  • უსაფრთხო: იზოლაცია ჰოსტის ჩვეულებრივი ფაილური სისტემის გზებისგან

საცავის ტიპები

Volume-ები

  • იმართება Docker-ის მიერ
  • ინახება /var/lib/docker/volumes/-ში
  • საუკეთესო პრაქტიკა მუდმივი მონაცემებისთვის
  • შეიძლება გაზიარდეს კონტეინერებს შორის
  • მარტივი სარეზერვო ასლის შექმნა და მიგრაცია
  • სრულად იზოლირებულია ჰოსტის ფაილური სისტემის იერარქიისგან
  • volume დრაივერების მხარდაჭერა, რაც ღრუბლოვანი და დისტანციური საცავების გამოყენების საშუალებას იძლევა
  • ეფექტური volume-ის მფლობელობისა და უფლებების მართვა
  • წინასწარ ივსება მონაცემებით კონტეინერის image-იდან, თუ მიმაგრების წერტილი შეიცავს მონაცემებს
  • შეიძლება შეიქმნას კონტეინერებისგან დამოუკიდებლად docker volume create-ით

Bind Mount-ები

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

tmpfs Mount-ები

  • ინახება ჰოსტის მეხსიერებაში
  • დროებითი საცავი
  • გაუმჯობესებული წარმადობა
  • მონაცემები იკარგება კონტეინერის გაჩერებისას
  • სასარგებლოა მგრძნობიარე ინფორმაციისთვის
  • არასდროს იწერება ჰოსტის ფაილურ სისტემაზე
  • უკიდურესად სწრაფი I/O წარმადობა
  • ზომა შეზღუდულია ჰოსტის ხელმისაწვდომი მეხსიერებით
  • არ შეიძლება გაზიარდეს კონტეინერებს შორის
  • კარგია დროებითი ფაილებისთვის, ქეშისთვის და მგრძნობიარე ინფორმაციისთვის, როგორიცაა საიდუმლოებები ::

Volume-ის ბრძანებები

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

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

# volume-ის შექმნა ლეიბლებით ორგანიზაციისთვის
docker volume create --label project=myapp --label environment=prod my-labeled-volume

# volume-ის შექმნა კონკრეტული დრაივერის ოფციებით
docker volume create --driver local \
  --opt type=nfs \
  --opt o=addr=192.168.1.1,rw \
  --opt device=:/path/to/dir \
  nfs-volume

# volume-ების სია
docker volume ls

# volume-ების სია ფილტრაციით
docker volume ls --filter "label=project=myapp"

# volume-ების სია მორგებული ფორმატით
docker volume ls --format "{{.Name}}: {{.Driver}}"

# volume-ის შემოწმება
docker volume inspect my-volume

# მრავალი volume-ის შემოწმება
docker volume inspect my-volume1 my-volume2

# inspect-ის გამოსავლის ფორმატირება კონკრეტული ინფორმაციის ამოსაღებად
docker volume inspect --format '{{.Mountpoint}}' my-volume

# volume-ის წაშლა
docker volume rm my-volume

# volume-ის იძულებით წაშლა (თუნდაც გამოყენებაში იყოს)
docker volume rm --force my-volume

# მრავალი volume-ის წაშლა
docker volume rm my-volume1 my-volume2

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

# volume-ების წაშლა დადასტურების გარეშე
docker volume prune --force

# volume-ების წაშლა ფილტრით
docker volume prune --filter "label=environment=test"

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

Volume-ების გამოყენება კონტეინერებთან

ძირითადი Volume-ის მიმაგრება

# სახელდებული volume-ის შექმნა და გამოყენება
docker run -v my-volume:/app/data nginx

# შემოკლებული სინტაქსის გამოყენება
docker run -v my-volume:/app/data nginx

# გრძელი ფორმატის გამოყენება (უფრო ცხადი)
docker run --mount source=my-volume,target=/app/data nginx

# ანონიმური volume-ის შექმნა (იმართება Docker-ის მიერ, მაგრამ მომხმარებლისთვის მოსახერხებელი სახელის გარეშე)
docker run -v /app/data nginx

მხოლოდ წაკითხვადი Volume

# volume-ის მიმაგრება მხოლოდ წაკითხვის რეჟიმში მოკლე სინტაქსით
docker run -v my-volume:/app/data:ro nginx

# volume-ის მიმაგრება მხოლოდ წაკითხვის რეჟიმში გრძელი სინტაქსით
docker run --mount source=my-volume,target=/app/data,readonly nginx

# მიმაგრება კონკრეტული SELinux კონტექსტის ლეიბლით
docker run -v my-volume:/app/data:ro,Z nginx

სახელდებული Volume Docker Compose-ში

version: "3.8"
services:
  web:
    image: nginx
    volumes:
      - my-volume:/app/data
      - cache-volume:/tmp/cache
      - config-volume:/etc/nginx/conf.d:ro

  api:
    image: my-api
    volumes:
      - my-volume:/shared/data # იგივე volume გაზიარებულია web სერვისთან
      - api-logs:/var/log/api

volumes:
  my-volume:
    # ნაგულისხმევი ოფციების გამოყენება
  cache-volume:
    driver_opts:
      type: tmpfs
      device: tmpfs
  config-volume:
    external: true # წინასწარ არსებული volume-ის გამოყენება
  api-logs:
    labels:
      retention: "14days"

Bind Mount-ის მაგალითები

# მიმდინარე დირექტორიის მიმაგრება კონტეინერზე
docker run -v $(pwd):/app nginx

# კონკრეტული ჰოსტის გზის მიმაგრება კონტეინერზე
docker run -v /host/config:/etc/nginx/conf.d:ro nginx

# მიმაგრება SELinux კონტექსტით (გაზიარებული კონტენტისთვის)
docker run -v /host/data:/container/data:z nginx

tmpfs Mount-ის მაგალითები

# მეხსიერებაში მიმაგრების შექმნა
docker run --tmpfs /app/cache nginx

# შექმნა ზომისა და უფლებების ოფციებით
docker run --tmpfs /app/cache:size=100M,uid=1000 nginx

# mount ფორმატის გამოყენება
docker run --mount type=tmpfs,destination=/app/cache,tmpfs-size=100M nginx

Volume-ის გამოყენების შემთხვევები

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