Docker Buildx

ისწავლეთ Docker Buildx-ის შესახებ კონტეინერის იმიჯების აგების გაფართოებული შესაძლებლობებისა და მრავალ-პლატფორმული მხარდაჭერისთვის

Docker Buildx

Docker Buildx არის Docker-ის build ბრძანების გაფართოებული და გაუმჯობესებული ვერსია, რომელიც გთავაზობთ ისეთ გაფართოებულ ფუნქციებს, როგორიცაა მრავალ-არქიტექტურული ბილდები, ბილდის ქეშის მართვა და ერთდროული ბილდის პროცესები. ის წარმოადგენს Docker-ის შემდეგი თაობის ბილდერს, რომელიც შექმნილია ძველი docker build ბრძანების ჩასანაცვლებლად დამატებითი ფუნქციონალით, უკუთავსებადობის შენარჩუნებით.

Buildx აგებულია BuildKit ბილდ სისტემაზე, რაც უზრუნველყოფს უმაღლეს წარმადობას, გაუმჯობესებულ ქეშირებასა და პარალელური დამუშავების შესაძლებლობებს, რომლებიც არ იყო ხელმისაწვდომი ტრადიციულ ბილდერში. ეს დეველოპერებს საშუალებას აძლევს შექმნან უფრო ეფექტური კონტეინერის იმიჯები სხვადასხვა პლატფორმისთვის ერთი ბილდის ბრძანებით.

ძირითადი მახასიათებლები

მრავალ-პლატფორმული ბილდები

  • ერთდროულად ააგეთ მრავალი არქიტექტურისთვის (მაგ., AMD64, ARM64, ARM/v7)
  • სხვადასხვა CPU არქიტექტურისა და ოპერაციული სისტემების მხარდაჭერა
  • ერთი ბრძანება კროს-პლატფორმული იმიჯების შესაქმნელად
  • გამარტივებული CI/CD პაიპლაინები ჰეტეროგენული გარემოებისთვის
  • მომავალზე ორიენტირებული კონტეინერის სტრატეგია edge computing-ისთვის, IoT-სა და ღრუბლოვანი გაშვებებისთვის
  • აქრობს სხვადასხვა არქიტექტურისთვის ცალკე ბილდის ინფრასტრუქტურის საჭიროებას

BuildKit ინტეგრაცია

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

Buildx-ის გამოყენების დაწყება

მრავალ-არქიტექტურული ბილდები

# მრავალ-პლატფორმული იმიჯის აგება და ატვირთვა
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 \
  -t username/myapp:latest \
  --push .
# ეს ერთდროულად აგებს იმიჯებს სამი სხვადასხვა არქიტექტურისთვის და ტვირთავს მათ რეესტრში
# რეესტრი შეინახავს მათ როგორც მრავალ-არქიტექტურულ მანიფესტს, რომლიდანაც Docker-ის კლიენტებს შეუძლიათ ავტომატურად არჩევა

# მრავალ-პლატფორმული იმიჯის ლოკალურად აგება
docker buildx build --platform linux/amd64,linux/arm64 \
  -t username/myapp:latest \
  --load .
# --load ფლაგი ახდენს იმიჯის იმპორტს Docker-ის ლოკალურ იმიჯების საცავში
# შენიშვნა: --load ამჟამად მუშაობს მხოლოდ ერთ-პლატფორმიან ბილდებთან, ასე რომ ეს ააგებს მხოლოდ თქვენი მიმდინარე არქიტექტურისთვის

გაფართოებული ქეშირება

ლოკალური ქეში

# ინლაინ ქეშის გამოყენება ლოკალურ ფაილურ სისტემასთან
docker buildx build \
  --cache-from type=local,src=./cache \
  --cache-to type=local,dest=./cache \
  -t myimage:latest .
# ეს ინახავს ბილდის ქეშის ფენებს ./cache დირექტორიაში
# მომავალ ბილდებს შეუძლიათ ამ ქეშის ხელახლა გამოყენება, თუნდაც Docker-ის დემონი გადაიტვირთოს
# იდეალურია ლოკალური დეველოპმენტისთვის ან CI სისტემებისთვის მუდმივი საცავით

რეესტრის ქეში

# რეესტრის გამოყენება განაწილებული ქეშირებისთვის
docker buildx build \
  --cache-from type=registry,ref=username/myapp:cache \
  --cache-to type=registry,ref=username/myapp:cache,mode=max \
  -t username/myapp:latest \
  --push .
# ინახავს ბილდის ქეშს თქვენს რეესტრში ცალკე ტეგში
# საშუალებას აძლევს გუნდებს გააზიარონ ბილდის ქეში სხვადასხვა მანქანებსა და CI/CD პაიპლაინებს შორის
# mode=max ოფცია ინახავს ყველა ფენას, შუალედურის ჩათვლით
# ამცირებს ბილდის დროს განაწილებულ გარემოში ზედმეტი სამუშაოს თავიდან აცილებით

GitHub-ის ქეში

# ქეშირება GitHub Actions-ში
docker buildx build \
  --cache-from type=gha \
  --cache-to type=gha,mode=max \
  -t username/myapp:latest .
# სპეციალურად ოპტიმიზირებულია GitHub Actions-ის სამუშაო პროცესებისთვის
# იყენებს GitHub-ის ჩაშენებულ ქეშის სისტემას უფრო სწრაფი CI ბილდებისთვის
# ავტომატურად მუშაობს GitHub-ის runner-ის არქიტექტურასთან
# ინახება სამუშაო პროცესის გაშვებებს შორის განმეორებითი ბილდების დასაჩქარებლად

ბილდის კონტექსტები

ბილდის არგუმენტები და საიდუმლოებები

# ბილდის არგუმენტებით აგება
docker buildx build --build-arg VERSION=1.2.3 -t myapp .
# ბილდის არგუმენტების გამოყენება შესაძლებელია Dockerfile-ში ARG ინსტრუქციებით
# სასარგებლოა ვერსიის ნომრების, კონფიგურაციის ან გარემოს-სპეციფიკური მნიშვნელობების შესაყვანად
# მნიშვნელობები ხელმისაწვდომია ბილდის დროს, მაგრამ არა საბოლოო კონტეინერში, თუ აშკარად არ არის კოპირებული

# საიდუმლოებების გამოყენება ბილდში
docker buildx build \
  --secret id=mysecret,src=./secret.txt \
  -t secure-app .
# საიდუმლოებები დროებით მონტაჟდება ბილდის დროს, მაგრამ არ ინახება საბოლოო იმიჯში
# იდეალურია API გასაღებების, რწმუნებათა სიგელების ან სერთიფიკატების გადასაცემად ბილდის პროცესში
# საიდუმლო ხელმისაწვდომია /run/secrets/mysecret-ში ბილდის კონტეინერის შიგნით
# ბილდის დასრულების შემდეგ, საიდუმლო იშლება ბილდის გარემოდან

Dockerfile-ის მაგალითები

მრავალ-პლატფორმული Dockerfile

# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM golang:1.18 AS builder

# ეს ARGs ავტომატურად დგინდება buildx-ის მიერ
ARG TARGETPLATFORM   # პლატფორმა სამიზნე იმიჯისთვის (მაგ., linux/amd64)
ARG BUILDPLATFORM    # პლატფორმა, სადაც ბილდი მუშაობს (მაგ., linux/arm64)
RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM"

WORKDIR /app
COPY . .
# პლატფორმის მნიშვნელობების გარჩევა Go-ს გარემოს ცვლადების დასაყენებლად
RUN GOOS=$(echo $TARGETPLATFORM | cut -d/ -f1) \
    GOARCH=$(echo $TARGETPLATFORM | cut -d/ -f2) \
    go build -o /app/myapp .
# ეს რთავს კროს-კომპილაციას: Go კოდი კომპილირდება სამიზნე პლატფორმისთვის
# მიუხედავად იმისა, სად მუშაობს ბილდი

FROM alpine
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]
# საბოლოო იმიჯი შეიცავს მხოლოდ კომპილირებულ ბინარს სამიზნე პლატფორმისთვის
# მრავალ-ეტაპიანი ბილდები ეხმარება უფრო მცირე, უფრო უსაფრთხო იმიჯების შექმნაში

საიდუმლოებების გამოყენება

# syntax=docker/dockerfile:1
FROM alpine

# საიდუმლოს გამოყენება buildx-იდან პირდაპირ დამონტაჟებული ბილდის დროს
RUN --mount=type=secret,id=mysecret \
    cat /run/secrets/mysecret > /app/secret-data
# ეს არის ყველაზე უსაფრთხო მეთოდი - საიდუმლო არასოდეს ინახება რომელიმე იმიჯის ფენაში
# საიდუმლო ხელმისაწვდომია მხოლოდ ამ კონკრეტული RUN ინსტრუქციის დროს

# საიდუმლოს გამოყენება როგორც ფაილი (არ არის რეკომენდებული მგრძნობიარე მონაცემებისთვის)
COPY mysecret.txt /app/
# ეს მეთოდი ამატებს საიდუმლო ფაილს იმიჯის ფენაში, რაც მას აღდგენადს ხდის
# გამოიყენეთ მხოლოდ არა-მგრძნობიარე მონაცემებისთვის ან დეველოპმენტის გარემოებისთვის

# საიდუმლოს გამოყენება როგორც გარემოს ცვლადი (გამოიყენეთ სიფრთხილით)
ARG SECRET_ENV
ENV APP_SECRET=$SECRET_ENV
# ბილდის არგუმენტების ნახვა შესაძლებელია იმიჯის ისტორიაში
# გარემოს ცვლადები შეიძლება გამოჩნდეს კონტეინერის მეტამონაცემებში
# პროდაქშენისთვის, უმჯობესია --mount=type=secret მიდგომა

Buildx-ის დრაივერები

# ბილდერის შექმნა კონტეინერის დრაივერით
docker buildx create --name mybuilder --driver docker-container
# ეს ქმნის ახალ ბილდერს, რომელიც მუშაობს კონტეინერში
# კონტეინერი უზრუნველყოფს იზოლაციასა და BuildKit-ის სრულ ფუნქციებს
# ავტომატურად იწყებს BuildKit კონტეინერს თქვენს Docker ჰოსტზე

# Kubernetes-ის დრაივერის გამოყენება
docker buildx create --name k8s-builder \
  --driver kubernetes \
  --driver-opt namespace=buildkitd \
  --driver-opt replicas=3
# ათავსებს BuildKit-ის პოდებს თქვენს Kubernetes კლასტერში
# 'namespace' ოფცია მიუთითებს, რომელი Kubernetes-ის სახელების სივრცე გამოიყენოს
# 'replicas=3' ქმნის სამ BuildKit პოდს პარალელური დამუშავებისთვის
# მოითხოვს აქტიურ Kubernetes კავშირს (კონფიგურირებული kubectl)

გამოტანის ტიპები

კონტეინერის იმიჯები

# გამოტანა Docker-ის დემონში
docker buildx build --output type=docker -t myimage .
# იტვირთება საბოლოო იმიჯი პირდაპირ Docker-ის დემონში
# ტრადიციული 'docker build' ქცევის ეკვივალენტი
# მუშაობს მხოლოდ 'docker' დრაივერთან ან ერთ-პლატფორმიან ბილდებთან

# გამოტანა რეესტრში
docker buildx build --output type=registry -t username/myapp .
# ატვირთავს იმიჯს პირდაპირ კონტეინერის რეესტრში
# მოითხოვს რეესტრში შესვლას (docker login)
# არ იტვირთება იმიჯი ლოკალურ Docker-ის დემონში
# ეფექტურია CI/CD პაიპლაინებისთვის, რომლებიც პირდაპირ რეესტრებში ტვირთავენ

# გამოტანა ლოკალურ იმიჯში
docker buildx build --load -t myimage .
# ახდენს აგებული იმიჯის იმპორტს Docker-ის ლოკალურ იმიჯების საცავში
# '--output type=docker'-ის შემოკლება
# საშუალებას იძლევა დაუყოვნებლივ გამოყენებას 'docker run'-ით აგების შემდეგ

ფაილები და დირექტორიები

# გამოტანა ლოკალურ დირექტორიაში
docker buildx build --output type=local,dest=./output .
# კონტეინერის იმიჯის შექმნის ნაცვლად, ახდენს ბილდის შედეგის ექსპორტს დირექტორიაში
# სასარგებლოა კომპილირებული ბინარების ან სტატიკური ფაილების ამოსაღებად ბილდიდან
# იდეალურია ბილდის სამუშაო პროცესებისთვის, რომლებსაც სჭირდებათ არტეფაქტები და არა სრული იმიჯები

# გამოტანა tar ფაილში
docker buildx build --output type=tar,dest=./image.tar .
# ქმნის tarball-ს, რომელიც შეიცავს ბილდის შედეგს
# შეიძლება გადატანილ იქნას სისტემებს შორის და ხელით ჩაიტვირთოს
# სასარგებლოა ჰაერით-იზოლირებული გარემოებისთვის ან მორგებული გავრცელების მეთოდებისთვის

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

ბილდის ჯგუფები და ერთდროული ბილდები

# ბილდის ჯგუფის შექმნა bake ფაილის გამოყენებით
docker buildx bake --file docker-bake.hcl
# კითხულობს ბილდის კონფიგურაციებს HCL ან JSON ფაილიდან
# ასრულებს ნაგულისხმევ ჯგუფში განსაზღვრულ ყველა სამიზნეს
# ავტომატურად ამუშავებს დამოკიდებულებებს სამიზნეებს შორის
# Docker Compose-ის მსგავსი, მაგრამ სპეციალიზირებულია ბილდებისთვის

# პარალელური ბილდები კონკრეტული სამიზნეებით
docker buildx bake prod dev
# ერთდროულად აგებს როგორც 'prod', ისე 'dev' სამიზნეებს
# იყენებს პარალელური დამუშავების უპირატესობას
# თითოეულ სამიზნეს შეიძლება ჰქონდეს სხვადასხვა ბილდის კონტექსტი, პლატფორმა, ტეგი და ა.შ.
# მნიშვნელოვნად აჩქარებს მრავალი დაკავშირებული იმიჯის აგებას

Bake ფაილები

HCL ფორმატი (docker-bake.hcl)

group "default" {
  targets = ["app", "worker"]
}

target "app" {
  dockerfile = "Dockerfile.app"
  tags = ["myapp:latest"]
  platforms = ["linux/amd64", "linux/arm64"]
}

target "worker" {
  dockerfile = "Dockerfile.worker"
  tags = ["myworker:latest"]
  args = {
    WORKER_VERSION = "1.0"
  }
}

JSON ფორმატი (docker-bake.json)

{
  "group": {
    "default": {
      "targets": ["app", "worker"]
    }
  },
  "target": {
    "app": {
      "dockerfile": "Dockerfile.app",
      "tags": ["myapp:latest"],
      "platforms": ["linux/amd64", "linux/arm64"]
    },
    "worker": {
      "dockerfile": "Dockerfile.worker",
      "tags": ["myworker:latest"],
      "args": {
        "WORKER_VERSION": "1.0"
      }
    }
  }
}

Buildx-ის წარმადობის რჩევები

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

SSH-ის დამონტაჟება

# კერძო რეპოზიტორიის კლონირება SSH გასაღებით
FROM alpine
RUN --mount=type=ssh mkdir -p -m 0700 ~/.ssh && \
    ssh-keyscan github.com >> ~/.ssh/known_hosts && \
    git clone [email protected]:username/private-repo.git
# --mount=type=ssh აჩენს ჰოსტის SSH აგენტს ბილდის პროცესში
# მოითხოვს --ssh default-ის გადაცემას buildx build-ის გაშვებისას
# მაგალითი: docker buildx build --ssh default=~/.ssh/id_rsa --no-cache .
# SSH გასაღებები არ ინახება იმიჯში, რაც ინარჩუნებს უსაფრთხოებას

ქეშის დამონტაჟება

# პაკეტების მენეჯერის ქეშირება
RUN --mount=type=cache,target=/var/cache/apt \
    apt-get update && apt-get install -y package
# ქმნის მუდმივ ქეშის დისკს, რომელიც დამონტაჟებულია /var/cache/apt-ში
# ქეში ინახება ბილდებს შორის, რაც მნიშვნელოვნად აჩქარებს პაკეტების ინსტალაციას
# არ მოქმედებს საბოლოო იმიჯის ზომაზე - ქეში არსებობს მხოლოდ ბილდის დროს
# მრავალ ბილდს შეუძლია ერთდროულად გაიზიაროს იგივე ქეში
# ჩვეულებრივ Docker-ში დისკის დამონტაჟებისგან განსხვავებით, ეს ბილდ-სპეციფიკურია

დროებითი დამონტაჟება

# დროებითი bind mount-ის გამოყენება
RUN --mount=type=bind,source=./config,target=/config \
    cp /config/app.conf /etc/app/config.conf
# ამონტაჟებს ./config დირექტორიას ბილდის კონტექსტიდან /config-ში კონტეინერში
# ფაილების წაკითხვა და კოპირება შესაძლებელია, მაგრამ არ ხდება რომელიმე ფენის ნაწილი
# სასარგებლოა კონფიგურაციის ფაილებისთვის, შაბლონებისთვის ან ნებისმიერი შინაარსისთვის, რომელიც საჭიროა მხოლოდ ბილდის დროს
# readonly ოფციის დამატება შესაძლებელია დამატებითი უსაფრთხოებისთვის: type=bind,source=./config,target=/config,readonly

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

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

ეფექტურობა

  • გამოიყენეთ შესაბამისი ქეშირების სტრატეგიები თქვენი სამუშაო პროცესის შაბლონების მიხედვით
  • დანერგეთ მრავალ-ეტაპიანი ბილდები საბოლოო იმიჯის ზომის შესამცირებლად
  • დაალაგეთ ინსტრუქციები ცვლილების სიხშირის მიხედვით (ნაკლებად ხშირიდან ყველაზე ხშირამდე)
  • ეფექტურად გამოიყენეთ ბილდის კონტექსტები .dockerignore ფაილების გამოყენებით
  • ოპტიმიზაცია გაუკეთეთ Dockerfile-ის ინსტრუქციებს ბრძანებების გაერთიანებით, სადაც ეს მიზანშეწონილია
  • გამოიყენეთ BuildKit-ის პარალელიზაციის შესაძლებლობები დამოუკიდებელი ოპერაციების სტრუქტურირებით
  • შეადარეთ სხვადასხვა ბილდის კონფიგურაციები ოპტიმალური პარამეტრების მოსაძებნად
  • გაითვალისწინეთ ფენების ხელახალი გამოყენების შაბლონები თქვენს დეველოპმენტის სამუშაო პროცესში

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

  • დანერგეთ მატრიცული ბილდები მრავალ პლატფორმაზე ტესტირებისთვის
  • გამოიყენეთ განაწილებული ქეშირება რეესტრის ან CI-სპეციფიკური ქეშებით
  • გააზიარეთ ქეში პაიპლაინის გაშვებებს შორის განმეორებითი ბილდების დასაჩქარებლად
  • მოახდინეთ ბილდის ნაბიჯების პარალელიზაცია bake ფაილებისა და მრავალი სამიზნის გამოყენებით
  • შეარჩიეთ შესაბამისი გამოტანის ტიპები (რეესტრი CI-სთვის, docker ლოკალური ტესტირებისთვის)
  • დანერგეთ სათანადო ტეგირების სტრატეგიები ბილდის არტეფაქტებისთვის
  • დააყენეთ აგებული იმიჯების ავტომატური ტესტირება
  • შექმენით გამოყოფილი ბილდერის ინსტანციები CI/CD გარემოებისთვის
  • დააპროექტეთ პაიპლაინები ინკრემენტული ბილდების გამოსაყენებლად

უსაფრთხოება

  • დაასკანირეთ აგებული იმიჯები ისეთი ხელსაწყოებით, როგორიცაა Trivy, Clair ან Snyk
  • სათანადოდ გამოიყენეთ საიდუმლოებები --mount=type=secret-ით
  • დანერგეთ მინიმალური პრივილეგიის პრინციპები როგორც ბილდში, ისე მუშაობის დროს
  • აკონტროლეთ ბილდის არგუმენტები მგრძნობიარე ინფორმაციის გაჟონვის თავიდან ასაცილებლად
  • დაადასტურეთ ბილდის კონტექსტები გარე წყაროებიდან
  • გამოიყენეთ SSH-ის გადამისამართება გასაღებების ჩაშენების ნაცვლად
  • დანერგეთ იმიჯების სათანადო ხელმოწერა და ვერიფიკაცია
  • შეამოწმეთ Dockerfile-ები უსაფრთხოების საუკეთესო პრაქტიკებისთვის
  • შეინარჩუნეთ უსაფრთხო საბაზისო იმიჯის სტრატეგია რეგულარული განახლებებით
  • დანერგეთ მუშაობის დროის უსაფრთხოების კონტროლი კონტეინერებისთვის

მიგრაცია ძველი ბილდიდან