Docker იმიჯები
შეიტყვეთ Docker იმიჯების, Dockerfile-ების და იმიჯების მართვის შესახებ
Docker იმიჯები
Docker იმიჯები კონტეინერების სამშენებლო ბლოკებია. ისინი მხოლოდ წაკითხვადი შაბლონებია, რომლებიც შეიცავს:
- აპლიკაციის კოდს
- Runtime გარემოს
- დამოკიდებულებებს
- კონფიგურაციას
Docker იმიჯები ფუნქციონირებს როგორც ფაილური სისტემის სრული სნეპშოტი, რომელიც უზრუნველყოფს ყველაფერს, რაც საჭიროა აპლიკაციის გასაშვებად. ისინი არიან:
- უცვლელი: აგების შემდეგ, შინაარსი არ იცვლება
- ფენოვანი: შედგება მრავალი ფაილური სისტემის ფენისგან ეფექტურობისთვის
- ქეშირებადი: ფენების ხელახლა გამოყენება შესაძლებელია მრავალ image-ში
- გავრცელებადი: შესაძლებელია მათი გაზიარება registry-ების საშუალებით
- ვერსიონირებული: მონიშნულია ვერსიის ინფორმაციით ცვლილებების თვალყურის დევნებისთვის
თითოეული image-ი იდენტიფიცირებულია უნიკალური SHA256 დაიჯესტით და შეიძლება ჰქონდეს მრავალი ადამიანისთვის წაკითხვადი თეგი (როგორიცაა nginx:latest ან ubuntu:20.04). image-ის არქიტექტურა განსაზღვრავს, თუ რომელ CPU არქიტექტურებზე შეუძლია მას მუშაობა (x86_64, ARM64 და ა.შ.).
Dockerfile-ებთან მუშაობა
Dockerfile არის ტექსტური დოკუმენტი, რომელიც შეიცავს image-ის ასაგებად საჭირო ყველა ბრძანებას. ის უზრუნველყოფს დეკლარაციულ, განმეორებად გზას თქვენი კონტეინერის გარემოს განსაზღვრისთვის:
Dockerfile-ის გავრცელებული ინსტრუქციები
| ინსტრუქცია | დანიშნულება | მაგალითი |
|---|---|---|
FROM | განსაზღვრავს საბაზისო image-ს | FROM ubuntu:20.04 |
WORKDIR | აყენებს სამუშაო დირექტორიას | WORKDIR /app |
COPY | აკოპირებს ფაილებს ჰოსტიდან image-ში | COPY . /app |
ADD | აკოპირებს ფაილებს დამატებითი ფუნქციებით (URL მხარდაჭერა, tar-ის ამოღება) | ADD https://example.com/file.tar.gz /app |
RUN | ასრულებს ბრძანებებს ახალ ფენაში | RUN apt-get update && apt-get install -y curl |
ENV | აყენებს გარემოს ცვლადებს | ENV NODE_ENV=production |
EXPOSE | დოკუმენტირებს, თუ რომელი პორტების გამოქვეყნებაა განზრახული | EXPOSE 8080 |
CMD | უზრუნველყოფს გასაშვებად ნაგულისხმევ ბრძანებას | CMD ["node", "app.js"] |
ENTRYPOINT | აკონფიგურირებს კონტეინერს, რომ გაეშვას როგორც შესრულებადი ფაილი | ENTRYPOINT ["nginx", "-g", "daemon off;"] |
VOLUME | ქმნის მიმაგრების წერტილს | VOLUME /data |
USER | აყენებს მომხმარებელს შემდგომი ინსტრუქციებისთვის | USER node |
ARG | განსაზღვრავს build-დროის ცვლადებს | ARG VERSION=latest |
Dockerfile-ის თითოეული ინსტრუქცია ქმნის ახალ ფენას image-ში, რაც გავლენას ახდენს როგორც build-ის დროზე, ასევე საბოლოო image-ის ზომაზე.
იმიჯების აგება
აგების ძირითადი ბრძანება
-t დროშა image-ს ანიჭებს სახელსა და ვერსიას. . მიუთითებს build context-ს (დირექტორია, რომელიც შეიცავს თქვენს Dockerfile-ს და აპლიკაციის ფაილებს). ამ ბრძანების გაშვებისას, Docker:
- აგზავნის build context-ს Docker daemon-თან
- თანმიმდევრულად ასრულებს Dockerfile-ის თითოეულ ინსტრუქციას
- ქმნის შუალედურ კონტეინერებს თითოეული ნაბიჯისთვის
- თითოეულ ნაბიჯს ინახავს როგორც ახალ image ფენას
- შლის შუალედურ კონტეინერებს
- საბოლოო image-ს ანიჭებს მითითებულ სახელს
აგება სხვადასხვა Dockerfile-ით
-f დროშა გაძლევთ საშუალებას მიუთითოთ Dockerfile-ის მორგებული სახელი. ეს სასარგებლოა, როდესაც გაქვთ მრავალი Dockerfile-ი სხვადასხვა გარემოსთვის (development, testing, production) ან პლატფორმისთვის.
აგება Build არგუმენტებით
Build არგუმენტები საშუალებას გაძლევთ გადასცეთ ცვლადები build პროცესს, რომლებიც შეიძლება გამოყენებულ იქნას თქვენს Dockerfile-ში ARG ინსტრუქციით. ეს იძლევა პარამეტრიზებული build-ების საშუალებას, რომლებსაც შეუძლიათ სხვადასხვა იმიჯების წარმოება მოწოდებული არგუმენტების საფუძველზე.
აგების გაფართოებული ოფციები
იმიჯების მართვა
იმიჯების დასახელების კონვენციები
Docker იმიჯები იყენებენ დასახელების სპეციფიკურ კონვენციას:
- Registry დომენი: (არასავალდებულო) თუ არ არის მითითებული, ნაგულისხმევად არის Docker Hub
- Repository სახელი: image-ის სახელი
- თეგი: (არასავალდებულო) თუ არ არის მითითებული, ნაგულისხმევად არის "latest"
- დაიჯესტი: (არასავალდებულო) SHA256 ჰეში, რომელიც უნიკალურად განსაზღვრავს image-ს
მაგალითები:
Multi-stage Build-ები
Multi-stage build-ები გვეხმარება შევქმნათ უფრო მცირე ზომის production იმიჯები build გარემოს runtime გარემოსგან გამოყოფით:
Multi-stage Build-ების უპირატესობები
- უფრო მცირე საბოლოო იმიჯები: შეიცავს მხოლოდ იმას, რაც საჭიროა runtime-ისთვის
- უკეთესი უსაფრთხოების მდგომარეობა: ნაკლები დამოკიდებულება ნიშნავს თავდასხმის მცირე ზედაპირს
- მოვალეობების გამიჯვნა: Build ინსტრუმენტები არ აბინძურებს production image-ს
- გაუმჯობესებული წარმადობა: მცირე იმიჯები უფრო სწრაფად იტვირთება და ნაკლებ გამტარობას იყენებს
- შემცირებული სირთულე: ერთი Dockerfile-ი მრავალი build სკრიპტის ნაცვლად
Multi-stage-ის გაფართოებული ტექნიკები
შეგიძლიათ მიუთითოთ კონკრეტული ეტაპები build-ის დროს --target-ით:
საუკეთესო პრაქტიკები
- გამოიყენეთ კონკრეტული საბაზისო image-ის თეგები
- მოერიდეთ
latestთეგის გამოყენებას production-ში განმეორებადობისთვის - მიაბით კონკრეტულ ვერსიებს, როგორიცაა
python:3.9.16-slimდა არაpython:3.9-slim - განიხილეთ image-ის დაიჯესტების გამოყენება უცვლელობისთვის:
python@sha256:a3edbb332.... - დააბალანსეთ სპეციფიკურობა და შენარჩუნების ტვირთი
- მოერიდეთ
- შეამცირეთ ფენების რაოდენობა
- გააერთიანეთ დაკავშირებული RUN ბრძანებები
&&-ით და\-ით ხაზის გასაგრძელებლად - გაასუფთავეთ იმავე ფენაში, სადაც ინსტალაციები ხდება
- მაგალითი:
RUN apt-get update && apt-get install -y package && apt-get clean && rm -rf /var/lib/apt/lists/* - გახსოვდეთ, რომ თითოეული ინსტრუქცია ქმნის ახალ ფენას
- გააერთიანეთ დაკავშირებული RUN ბრძანებები
- გამოიყენეთ .dockerignore
- გამორიცხეთ არასაჭირო ფაილები build context-იდან
- აჩქარებს build პროცესს context-ის ზომის შემცირებით
- ხელს უშლის მგრძნობიარე ფაილების შემთხვევით ჩართვას
- სინტაქსი .gitignore-ის მსგავსია
- მაგალითი შიგთავსი:
.git,node_modules,*.log,.env*,tests/
- დაალაგეთ ბრძანებები ცვლილების სიხშირის მიხედვით
- განათავსეთ ინსტრუქციები, რომლებიც ნაკლებად ხშირად იცვლება, თავში
- დააინსტალირეთ დამოკიდებულებები აპლიკაციის კოდის კოპირებამდე
- ეფექტურად გამოიყენეთ build ქეში
- მაგალითი რიგი: FROM → ENV/ARG → RUN (დამოკიდებულებები) → COPY (კონფიგურაცია) → COPY (კოდი) → CMD
- გამოიყენეთ multi-stage build-ები production-ისთვის
- გამოყავით build-დროის დამოკიდებულებები runtime დამოკიდებულებებისგან
- დააკოპირეთ მხოლოდ აუცილებელი არტეფაქტები build ეტაპიდან
- დრამატულად შეამცირეთ საბოლოო image-ის ზომა
- გააუმჯობესეთ უსაფრთხოება თავდასხმის ზედაპირის შემცირებით
- განიხილეთ სხვადასხვა ეტაპები ტესტირების, აგების და production-ისთვის
- დამატებითი საუკეთესო პრაქტიკები
- გაუშვით კონტეინერები არა-root მომხმარებლებით, როდესაც შესაძლებელია
- დააყენეთ შესაბამისი გარემოს ცვლადები
- გამოიყენეთ health check-ები კონტეინერის სტატუსის მონიტორინგისთვის
- განიხილეთ distroless ან მინიმალური საბაზისო იმიჯები
- დაასკანირეთ იმიჯები მოწყვლადობებზე deployment-მდე