„Docker“ vaizdo kūrimas iš „Scratch“

Creating Docker Image From Scratch



Pagrindinis „Docker“ pranašumas, palyginti su bet kokia kita konteinerizavimo technologija, yra tas, kad „Docker“ yra skirtas kūrėjams ir jų papildomoms programoms. Nors tinkamos konteinerių technologijos, tokios kaip LXC , Zonos ir Kalėjimai yra nukreiptos iš operacijų perspektyvos arba, paprasčiau tariant, šios platformos yra virtualių mašinų, veikiančių debesyje, pakaitalas. „Docker“ pakeičia paketus ir vykdomuosius dvejetainius failus.

Laisvai kalbant, „Docker“ vis labiau primena universalų paketų tvarkyklę, kuri veikia visose įmanomose „Linux“ platformose. Jis paima konteinerius ir naudoja juos sprendžiant visiškai kitokią problemą, su kuria susiduria kūrėjai. Problema ta, kad kūrėjai programoms rašyti naudoja savo darbalaukio operacinę sistemą (pvz., „Windows“, „MacOS“ ar „Linux“ su daugybe su darbalaukiu susijusių paketų). Jų parašyta programa dažnai veikia visiškai kitoje operacinėje sistemoje, esančioje serveryje, kurio Linux platinimas yra visiškai kitoks nei kūrėjo nešiojamojo kompiuterio.







„Docker“ idėja yra ta, kad jūsų programa yra supakuota kaip „Docker“ vaizdas. „Docker“ užduotis yra nufotografuoti šį vaizdą ir paleisti jį kaip konteinerinę programą. Buvimas konteineriuose reiškia, kad programa ir jos priklausomybės veiks pačioje izoliuotoje aplinkoje, kuri gali visiškai skirtis nuo kūrėjo nešiojamojo kompiuterio ir net gamybos serverio. Kol jie abu palaiko „Docker“, jie abu gali paleisti tą pačią programą lygiai taip pat.



„Docker“ vaizdo anatomija

Kaip minėta anksčiau, „Docker“ programa veiks sutartoje aplinkoje. Dabar kyla klausimas, kaip tą aplinką sukurti? Dauguma programų vaizdų importuotų „Docker“ bazinį vaizdą ir sukurtų savo programą ant jo.



Programos yra sukurtos iš programinės įrangos sluoksnių. „WordPress“ konteinerio vaizdas yra sukurtas naudojant httpd konteinerio vaizdą, kuris savo ruožtu yra pastatytas ant „Ubuntu“ vaizdo. Vaizdas, ant kurio sukurtas naujesnis vaizdas, Dockerio terminologijoje yra žinomas kaip PARENT IMAGE. „Dockerfile“ (šiek tiek vėliau suprasime, ką reiškia „Dockerfile“), šis pirminis vaizdas yra paminėtas failo viršuje, kaip parodyta žemiau:





IŠ „Ubuntu“: 18.04
## Likusi „Docker“ rinkmena

Šis „Docker“ failas, kai jis vykdomas, konvertuoja jūsų programą į „Docker“ atvaizdą (savotišką dvejetainį), kurį galite perkelti į registrą, iš kurio jį galima ištraukti, kad sukurtumėte naujus konteinerius kitur. Tačiau visi jie turės „Ubuntu: 18.04“ pagrindinį vaizdą ir veiks taip, tarsi tai būtų „Ubuntu“ sistema, kurioje jie veikia.

Galbūt tai pastebėjote bandydami ištraukti naują doko atvaizdą.



„Docker“ vaizdo kūrimas iš „Scratch“

Tai rodo, kiek sluoksnių ištraukiama prieš pateikiant faktinę programą (kuri gali būti tik kelių megabaitų dydžio).

Dėl šios priežasties norėtume sukurti vadinamąjį pagrindinį įvaizdį. Kuris nėra pastatytas ant nieko kito. Raktinis žodis scratch naudojamas norint parodyti, kad šis sluoksnis nėra pastatytas ant nieko kito. Panašiai:

Nuo nulio
## Likusi „Dcokerfile“

Pirmiausia sukursime paprastą „hello-world“ programą ir tada išsiaiškinsime, kas bus likusi „Dockerfile“. Pagrindinė sistema yra „Ubuntu“: 18.04 LTS, o eksperimentui naudojame „Docker“ versiją 17.12.1-ce.

Statinio dvejetainio kūrimas

„Docker“ konteineriai yra procesų rinkinys, veikiantis atskirai nuo likusios operacinės sistemos. Vienintelis dalykas, su kuriuo susijęs šis procesas, yra branduolys. Branduolys yra atsakingas už šių procesų planavimą procesoriuje, atminties tvarkymą ir keletą kitų pagrindinių rezervavimo užduočių.

Tačiau dauguma aukšto lygio programų priklauso nuo daugelio sistemos bibliotekų (pvz glibc, musl, klibc ir kt ) ir daug vykdymo laiko priklausomybių, tokių kaip „Python“ ar „Node.js“ arba „Java Runtime“. Programos dvejetainėje nėra visų bibliotekų, tačiau pradėjus vykdyti, jos iškviečia šias bibliotekas iš pagrindinės operacinės sistemos.

Kadangi mes bandome sukurti įvaizdį nuo nulio, mes negautume šių malonumų. Taigi mūsų programa turi būti statinis failas arba atskiras vykdomasis failas.

Pradėkime nuo to, kad sukuriame aplanką „MyDockerImage“ ir jame sukuriame failą „hello.cc“.

$mkdir„MyDockerImage“
$CD„MyDockerImage“
$paliestisveiki.cc

Atidarykite hello.cc naudodami savo mėgstamą teksto rengyklę ir pridėkite šias eilutes.

#įtraukti
naudojant vardų srities standartą;
tarptpagrindinis(){
kaina<< 'Sveiki! Šis pranešimas siunčiamas iš sudėtinio rodinio n';
grįžti 0;

}

Tai paprasta C ++ programa, kuri spausdina Sveiki! Ši žinutė…

Dėl anksčiau aptartų priežasčių mes tai sudarysime naudodami statinę vėliavą. Naudojamas kompiliatorius yra g ++ („Ubuntu 7.3.0-16ubuntu3“) 7.3.0.

Norėdami surinkti programą, tame pačiame kataloge paleiskite šią komandą:

$ g++ -o labas-statinisSveiki.DC

Tai sukuria dvejetainį vykdomąjį failą sveiki tame pačiame kataloge. Tai mūsų statinis failas. Patikrinkite, ar jis veikia kaip numatyta, terminale paminint failo pavadinimą.

$./Sveiki

Dabar esame pasirengę konteinerizuoti šią paprastą programą.

Dockerfile

„Dockerfile“ susideda iš taisyklių rinkinio, kuris paima jūsų programos failus (pvz., Dvejetainius failus, šaltinio failus ir tt) kartu su įvairiais konfigūracijos parametrais, tokiais kaip failų sistemos išdėstymas, atviri prievadai ir kt., Ir paverčia juos „Docker“ vaizdo failais. Tada galite bendrinti vaizdo failą su visais, kurie nori paleisti šią programą.

Mes nesigilinsime į visas „Dockerfile“ galimybes, vietoj to parašysime labai minimalistinį „Dockerfile“. Tame pačiame kataloge, kuriame yra jūsų vykdomoji programa, sukurkite tuščią failą pavadinimu Dockerfile.

$paliestiDockerfile

Atidarykite jį naudodami mėgstamą teksto rengyklę ir parašykite šias eilutes:

NUO nulio
ADD sveiki/
CMD['/Sveiki']

subraižyti nėra tėvų atvaizdas. Greičiau tai rodo „Docker“, kad vaizdas nėra pastatytas ant kito vaizdo. Jis pastatytas nuo nulio. ADD komanda paimtų statinį dvejetainį pavadinimą | _+_ | iš dabartinio katalogo ir pridėtų prie pagrindinio vaizdo failo katalogo. Kai pagaliau paleisime konteinerį pagal šį vaizdą, labas failas bus matomas pačiame šakniniame kataloge adresu | _+_ |

Galiausiai CMD eilutėje yra eilutė /Sveiki ši eilutė bus vykdoma kaip apvalkalo komanda, kai iš šio vaizdo bus sukurtas konteineris, taigi dvejetainis failas, kurį pridėjome prie konteinerio, ir išspausdins pranešimą, kurį parašėme savo programoje.

Sukurkime vaizdą, pasitelkdami statyti doką komandą, kuri peržiūrėtų „Dockerfile“ turinį ir sugeneruotų vaizdą. Vykdykite šią komandą tame pačiame kataloge kaip „Dockerfile“ ir vykdomoji dvejetainė programa.

$statyti doką-žymėtiSveiki .

The - labas vėliava nustato vaizdo pavadinimą Sveiki ir taškas ( . ) pabaigoje pasakoja statyti doką ieškoti dabartiniame „Dockerfile“ ir susijusio turinio kataloge.

„Docker“ konteinerio paleidimas

Norėdami patikrinti, ar ką tik sukurtas vaizdas rodomas vaizdų sąraše, paleiskite:

$dokų vaizdai

Atkreipkite dėmesį, koks mažas sveikinimo vaizdas, palyginti su kitais vaizdais. Bet kokiu atveju jis yra paruoštas naudoti kaip konteineris,

$docker paleisti sveiki

Viskas! Pirmąjį minimalistinį konteinerį sukūrėte nuo nulio.

Kiti variantai

Nors kurti vaizdus nuo nulio visada yra galimybė, žmonės dažnai linkę kurti vaizdus iš kitų lengvų „Linux“ distribucijų. Pavyzdžiui, vaizdai, tokie kaip Alpių ir autobusų dėžutės, yra tikrai lengva aplinka su mažesnėmis bibliotekomis, tokiomis kaip musl, o ne „glibc“.

Naudojant juos kaip tėvų vaizdą naudojant Iš Alpių: naujausias taip pat būtų gauti mažesni vaizdai. Kadangi baziniai vaizdai yra tik 2–5 MB dydžio. Praneškite mums, ar yra kokia nors su „Docker“ susijusi tema, kurią galbūt norėsite aptarti toliau. Mus galite pasiekti „Twitter“ , Facebook arba užsiprenumeruokite mus el.