Pelnas:
- Gebėjimas suprasti konteinerio ir „Dockerfile“ sąvokas, pagrindines instrukcijas ir sluoksnių logiką bei turėti dirbtinį intelektą, sukurti gamybai paruoštą „Dockerfile“
- Galimybė sumažinti vaizdo dydį ir padidinti diegimo greitį bei saugumą naudojant kelių etapų kūrimą ir mažą pagrindinį vaizdą
- Galimybė taikyti saugumo principus neįterpti paslapties į vaizdą, paleisti jį su neteisėtu vartotoju, o ne root, ir nuskaityti vaizdą
Sakinys „Jis veikė mano kompiuteryje“ yra pats brangiausias sakinys programinės įrangos istorijoje. Tas pats kodas sprogsta kitame serveryje dėl skirtingos bibliotekos versijos. Konteinerių technologija išsprendžia būtent šią problemą: ji sujungia jūsų programą su viskuo, ko reikia, kad ji veiktų – bibliotekas, vykdymo laiką, nustatymus – į vieną nešiojamąjį paketą. Šis paketas visur veikia lygiai taip pat. Labiausiai paplitęs konteinerio įrankis yra „Docker“.
Konteinerio aprašymas vadinamas Dockerfile: tai tekstinis failas, kuris paaiškina, nuo kurio pagrindinio vaizdo bus paleista jūsų programa, kurie failai bus nukopijuoti ir kokios komandos bus paleistos. Pagal šį receptą gaunamas vaizdas; Kai vaizdas paleidžiamas, jis tampa konteineriu. AI yra labai įgudęs rašyti Dockerfile ir – dar svarbiau – jį sumažinti ir apsaugoti. Tačiau jūsų darbas yra suprasti, ką sukurtas receptas veikia ir kur jis gali nutekėti paslapčių.
Pagrindinės „Dockerfile“ instrukcijos
Norėdami patikrinti Dockerfile, turėtumėte žinoti pagrindines instrukcijas:
- „FROM“: pasirenkamas pagrindinis vaizdas (pvz., python:3.12-slim). Iš čia daugiausia priklauso vaizdo dydis ir saugumas.
- „WORKDIR“: nurodo darbo katalogą.
- „COPY“ / „ADD“: kopijuoja failus į vaizdą.
- „RUN“: kūrimo metu paleidžia komandą (pvz., įdiegia priklausomybę). Kiekvienas RUN sukuria naują sluoksnį.
- „ENV“: apibrėžia aplinkos kintamąjį.
- „EXPOSE“: dokumentai, per kurį prievadą konteineris klauso.
- „CMD“ / „ENTRYPOINT“: nustato komandą, kuri bus paleista, kai konteineris bus paleistas.
Svarbi koncepcija yra sluoksnis: „Docker“ talpykloje saugo kiekvieną instrukciją kaip sluoksnį. Jei dažnai besikeičiančius veiksmus įdėsite į pabaigą, nesikeičiantys sluoksniai bus iš talpyklos ir kūrimas paspartės.
Patarimas: Dvi didžiausios vaizdo dydžio sumažinimo svertai yra: (1) mažo pagrindinio vaizdo pasirinkimas, pvz., plonas arba aukštinis; (2) kelių etapų kūrimo naudojimas – kūrimo įrankių atsisakymas viename etape ir tik galutinio produkto perkėlimas į ploną vaizdą. AI gali meistriškai įgyvendinti šiuos du dalykus, kai tik nori.
Kodėl mažas vaizdas toks svarbus? Nes vaizdo dydis yra ne tik disko problema. Didelio atvaizdo ištraukimas kiekvieną kartą užtrunka ilgiau, registre užima daugiau vietos, lėtėja naujų „Pod“ paleidimas, kai jis keičiasi, ir kadangi jame yra daugiau paketų, jis suteikia didesnį atakos paviršių, ty atvirą erdvę, kuria užpuolikas gali išnaudoti. Vietoj 1 GB vaizdo naudojimas 100 MB; Tai sutrumpina diegimo laiką, sumažina išlaidas ir padidina saugumą. Optimizavus „Dockerfile“, šie trys pranašumai gaunami vienu metu. Aiškiai nurodykite „mažiausio galutinio vaizdo“ tikslą, kai AI prašote optimizuoto „Dockerfile“; taigi, pirmenybė teikiama kompiliavimo fazės atskyrimui ir nereikalingų paketų išmetimui.
Žingsnis po žingsnio: „Dockerfile“ generavimas ir optimizavimas naudojant AI
- Apibūdinkite programą. Kalba, versija, įvesties komanda, klausomas prievadas.
- Pateikite pirmąjį juodraštį. Paprašykite paprasto veikiančio Dockerfile.
- Optimizuokite. Paprašykite to paties AI dėl kelių etapų kūrimo, nedidelio pagrindinio vaizdo ir sluoksnių tvarkos optimizavimo.
- Patikrinkite saugumą. Ar paslaptis įdėta, ar ji veikia kaip root, ar yra kokių nors nereikalingų įrankių?
- Sukurkite ir išmatuokite dydį. Sukūrę „Docker“ žiūrėkite dydį naudodami „Docker“ vaizdus.
- Nuskaityti. Patikrinkite, ar nėra žinomų pažeidžiamumų, naudodami išnaudojimo skaitytuvą, pvz., „Docker Scout“ ar „trivy“.
Saugumas: su konteineriais susijusi rizika
Konteinerių saugumas lengvai nepastebimas. Trys taisyklės:
- Neįterpkite paslapties į vaizdą. Tokios eilutės kaip ENV API_KEY=... arba COPY .env visam laikui įrašo paslaptį į vaizdo sluoksnius; Kiekvienas, gavęs vaizdą, gali jį perskaityti. Pateikite paslaptį vykdymo metu kaip aplinkos kintamąjį arba iš saugyklos.
- Veikia kaip root. Pagal numatytuosius nustatymus konteineriai veikia kaip root; Anga gali virsti išbėgimu iš konteinerio. Nukreipkite pas neteisėtą vartotoją su nurodymu USER.
- Mažas ir naujausias bazinis vaizdas. Išpūsti vaizdai yra lėtesni ir turi daugiau pažeidžiamumų. Pasirinkite slim/alpine, pataisykite versiją (nenaudokite :naujausia).
Įspėjimas: net jei naudojate paslaptį RUN ir tada ją ištrinate, ji lieka tarpinėje programinėje įrangoje ir gali būti perskaityta per dockerio istoriją. Jei kuriant reikalinga paslaptis, naudokite Docker --secret mechanizmą, o ne ENV/COPY.
Optimizavimo poveikio lentelė
techninis
Kas daro
Tipiškas efektas
plonas / Alpinis bazinis vaizdas
Išmeta nereikalingas pakuotes
900 MB → 120 MB
Kelių pakopų statyba
Neapima kūrimo įrankių
700 MB → 90 MB
.dockeris ignoruoti
Į kūrimą neįtraukiami nereikalingi failai
Greitesnis konstravimas, mažas kontekstas
Pakopų rūšiavimas
Padidina talpyklos aptikimą
Sukurti 5 min → 40 sek
Versijos taisymas (:15)
Pakartojamumas + saugumas
Užkerta kelią staigiam pablogėjimui
trys mini dėklai
1 atvejis – 1,1 GB vaizdas sumažintas iki 95 MB. Vienos komandos Node.js vaizdas buvo 1,1 GB; Kiekvienas dislokavimas truko kelias minutes. Jie pasakė AI „optimizuokite tai naudodami daugiapakopę statybą ir alpines“. AI atskyrė kompiliavimo fazę ir perkėlė tik sugeneruotus failus į ploną vaizdą; Rezultatas buvo 95 MB, diegimo laikas sumažėjo trečdaliu.
2 atvejis – pagauta palaidota paslaptis. Inžinierius YZ sukurtame Docker faile pastebėjo eilutę ENV DB_PASSWORD=prod_secret. AI įterpė slaptažodį į vaizdą, kad jis „veiktų“. Inžinierius tai pašalino ir pakeitė į slaptažodžio nuskaitymą iš aplinkos kintamojo vykdymo metu. Priešingu atveju kiekvienas, užfiksavęs vaizdą, galėtų perskaityti slaptažodį.
3 atvejis – šaknų pabėgimo pavojus. Nuskaitymo įrankis pranešė, kad AI sukurtas vaizdas veikė kaip root ir jame yra kritinis pažeidžiamumas. Komanda pridėjo USER appuser ir perkėlė pagrindinį vaizdą į dabartinę versiją; nuskaitymas išvalytas. Pamoka: prieš paskelbdami nuskaitykite kiekvieną vaizdą ir parodykite jį neįgaliotiems vartotojams.
Keturi kopijuojami šablonai
1) Optimizuoto Docker failo generavimas:
Parašykite gamybai paruoštą Docker failą [LANGUAGE/FRAMEWORK] programai. Rekomendacijos: - Naudokite kelių etapų kūrimą; padarykite galutinį vaizdą kuo mažesnį.- Bazinis vaizdas yra plonas / Alpinis, o versija yra fiksuota (nenaudokite ":latest").- Paleiskite konteinerį su neteisėtu USER, NE root.- NIEKADA neįterpkite paslapties į vaizdą; Vykdymo metu palaukite aplinkos kintamojo. - Pridėti .dockerignore pasiūlymą. Įvesties komanda: [X], klausymosi prievadas: [Y].
2) Optimizuokite esamą Dockerfile:
Peržiūrėkite šį „Dockerfile“, kad sumažintumėte ir paspartintumėte. Rekomenduoti konkrečius pakeitimus, susijusius su sluoksnių tvarka, daugiafaze konstrukcija, baziniu vaizdu ir pertekliniais paketais; Užrašykite numatomą kiekvieno pakeitimo dydžio / greičio poveikį. Dockerfile: [CONTENT]
3) Saugumo auditas:
Patikrinkite šį Docker failą dėl saugumo: ar yra įterptųjų paslapčių, root vartotojų, nepataisytų versijų, nereikalingų įrankių, pasenusių bazinių vaizdų? Išvardykite išvadas pagal svarbą ir pataisykite. Dockerfile: [CONTENT]
4) Sukūrimo klaidų sprendimas:
Kas sukelia šią dokerio kūrimo klaidą ir kaip ją išspręsti? Pateikite man pagrindinę priežastį ir sprendimą su minimaliais pakeitimais. Nekurkite tikros vertės ten, kur matote Secret, naudokite rezervuotąją vietą. Klaida: [LOG] Dockerfile: [CONTENT]
Silpnas raginimas / Stiprus raginimas
Silpnas: „Parašykite Dockerfile mano mazgo programai“.
Rezultatas: didžiulis bazinis vaizdas, šakninis vartotojas, vienos pakopos, galbūt pažeidžiamas slaptumo; Išvestis neatsižvelgiant į dydį ir saugumą.
Stiprus: „Parašykite gamybai paruoštą „Docker“ failą mano „Node 20“ programai: kelių pakopų kūrimas, mazgas: 20-alpine bazinis vaizdas (versija pataisyta), paleista su neteisėtu USER, slaptas įterpimas, klausymas per 3000 prievadą, prisijungimo mazgas dist/server.js. Taip pat pasiūlykite .dockerignore“.
Skirtumas: antroje eilutėje pateikiama optimizavimo technika, saugos taisyklė ir prisijungimo komanda; Išeiga tampa maža, saugi ir tinkama naudoti tiesiogiai.
Dažnos klaidos
- Paslapties įterpimas į vaizdą su „ENV“/„COPY“. Jis lieka sluoksniuose ir skaitomas atgal.
- Veikia kaip root. VARTOTOJO nurodymo praleidimas kelia rimtą pavojų saugumui.
- Naudojant „:latest“. Tai sukuria nepakartojamus statinius ir netikėtus trikdžius.
- Praleidžiamas kelių etapų kūrimas. Kompiliavimo įrankiai be reikalo išpučia galutinį vaizdą.
- Nerašykite „.dockerignore“. Į kūrimą įtraukti didžiuliai katalogai, tokie kaip .git ir node_modules.
- Vaizdo paskelbimas jo nenuskaitant. Sukurti žinomus pažeidžiamumus jų nesuvokiant.
Apibendrinant
Konteineriai sudeda programą į nešiojamus paketus, kurie visur veikia vienodai; receptas yra Dockerfile. AI yra galingas gaminant gamybai paruoštus ir optimizuotus „Docker“ failus, tačiau jums reikia aiškiai reikalauti kelių etapų kūrimo, mažų bazinių vaizdų, be neteisėtų vartotojų ir jokių paslapčių. Vaizdo dydžio sumažinimas pagreitina diegimą; Paslapties neįdėjimas, šaknies pabėgimas ir vaizdo nuskaitymas užtikrina saugumą. Jūs privalote patikrinti, ką kiekvienas receptas veikia ir kur jis nuteka.
Taikymo užduotis
Pasirinkite paprastą programą. Leiskite dirbtiniam intelektui sugeneruoti Dockerfile naudodami šabloną „Optimizuotas Dockerfile generavimas“. Tada: (1) patikrinkite įterptąjį slaptąjį ir pagrindinį vartotoją naudodami šabloną „Saugos patikra“; (2) jei įmanoma, sukurkite dokerį ir išmatuokite dydį naudodami doko vaizdus; (3) atkreipkite dėmesį, kuris metodas bus efektyviausias norint sumažinti vaizdą kaip kitą žingsnį.
kontrolinis sąrašas
- [ ] Į savo eilutę įtraukiau kalbos / pagrindų versiją, įvesties komandą ir prievadą.
- [ ] Dockerfile nėra įterptų paslapčių; tikimasi slapto vykdymo metu.
- [ ] Sudėtinis rodinys veikia su neteisėtu USER, o ne root.
- [ ] Pagrindinis vaizdas yra mažas (plonas / alpinis), o jo versija yra fiksuota (ne: naujausia).
- [ ] Naudojau kelių pakopų kūrimą ir .dockerignore.
- [ ] Nuskaitau vaizdą pažeidžiamumo skaitytuvu.