Docker -kuvan luominen Scratchista

Creating Docker Image From Scratch



Dockerin tärkein etu muihin konttitekniikoihin verrattuna on se, että Docker on suunnattu kehittäjille ja heidän upstack -sovelluksilleen. Vaikka oikeat konttitekniikat kuten LXC , Vyöhykkeet ja Vankilat kohdistetaan operatiivisesta näkökulmasta, tai yksinkertaisesti sanottuna nämä alustat korvaavat pilvessä toimivia virtuaalikoneita. Docker korvaa paketit ja suoritettavat binääritiedostot.

Rehellisesti sanottuna Dockerista tulee yhä enemmän universaali paketinhallinta, joka toimii kaikilla mahdollisilla Linux -alustoilla. Se vie kontteja ja käyttää niitä ratkaisemaan täysin erilaisen ongelman, jonka kehittäjät kohtaavat. Ongelmana on, että kehittäjät käyttävät työpöytäkäyttöjärjestelmäänsä (kuten Windows, macOS tai Linux, jossa on paljon työpöytäpaketteja) sovellusten kirjoittamiseen. Heidän kirjoittamansa sovellus toimii usein täysin eri käyttöjärjestelmässä palvelimella jossain Linux -jakelussa täysin eri tavalla kuin kehittäjän kannettava tietokone.







Dockerin ideana on, että sovelluksesi on pakattu Docker -kuvaksi. Dockerin tehtävä on ottaa tämä kuva ja käyttää sitä konttipohjaisena sovelluksena sinulle. Konttipakkaus tarkoittaa, että sovellus ja sen riippuvuudet toimivat eristetyssä ympäristössä, joka voi poiketa täysin kehittäjän kannettavasta tietokoneesta ja jopa tuotantopalvelimesta. Niin kauan kuin molemmat tukevat Dockeria, molemmat voivat ajaa samaa sovellusta täsmälleen samalla tavalla.



Docker -kuvan anatomia

Kuten aiemmin mainittiin, Docker -sovellus toimii sovitussa ympäristössä. Nyt kysymys kuuluu, miten luomme ympäristön? Useimmat sovelluskuvista tuovat Dockerin peruskuvan ja rakentavat sovelluksensa sen päälle.



Sovellukset tehdään ohjelmistokerroksista. Wordpress -säilön kuva on rakennettu käyttämällä httpd -säilön kuvaa, joka puolestaan ​​on rakennettu Ubuntu -kuvan päälle. Kuva, jolle uudempi kuva on rakennettu, tunnetaan Docker -terminologiassa PARENT IMAGE -kuvana. Dockerfile -tiedostossa (saamme selville, mitä Dockerfile tarkoittaa, vähän myöhemmin) tämä pääkuva mainitaan tiedoston yläosassa alla olevan kuvan mukaisesti:





Ubuntusta: 18.04
## Loput Docker -tiedostosta

Tämä Docker -tiedosto suoritettaessa muuntaa sovelluksesi Docker -kuvaksi (eräänlaiseksi binaariksi), jonka voit siirtää rekisteriin, josta se voidaan vetää uusien säiliöiden luomiseksi muualle. Heillä kaikilla on kuitenkin Ubuntu: 18.04 peruskuvana ja ne toimivat kuin se olisi Ubuntu -järjestelmä, jossa he toimivat.

Olet ehkä huomannut tämän yrittäessäsi vetää uutta telakointikuvaa.



Docker -kuvan luominen Scratchista

Tämä osoittaa, kuinka monta kerrosta vedetään ennen kuin varsinainen sovellus (joka voi olla vain muutaman megatavun kokoinen) tuodaan.

Tästä syystä haluaisimme luoda niin kutsutun peruskuvan. Joka ei ole rakennettu minkään muun päälle. Avainsanaa scratch käytetään osoittamaan, että tätä kerrosta ei ole rakennettu minkään muun päälle. Niin kuin:

Tyhjästä
## Loput Dcokerfile

Luomme ensin yksinkertaisen hello-world-sovelluksen ja sitten selvitämme, mikä muu Dockerfile tulee olemaan. Isäntäjärjestelmä on Ubuntu: 18.04 LTS ja käytämme kokeilussa Docker-versiota 17.12.1-ce.

Staattisen binaarin luominen

Docker -kontit ovat kokoelma prosesseja, jotka ovat käynnissä erillään muusta käyttöjärjestelmästä. Ainoa asia, johon prosessi on yhteydessä, on ydin. Kernel vastaa näiden prosessien ajoittamisesta suorittimelle, muistinhallinnasta ja muutamasta muusta perusvarauksen säilytystehtävästä.

Mutta useimmat korkean tason sovellukset riippuvat monista järjestelmäkirjastoista (kuten glibc, musl, klibc jne ) ja paljon ajonaikaisia ​​riippuvuuksia, kuten Python tai Node.js tai Java Runtime. Sovellusbinaarissa ei ole käytettävissä kaikkia kirjastoja, mutta kun se aloittaa suorituksen, se kutsuu kyseiset kirjastot isäntäkäyttöjärjestelmästä.

Koska yritämme luoda kuvan tyhjästä, emme saisi näitä hienoja puolia. Sovelluksemme on siis oltava staattinen tiedosto tai itsenäinen suoritettava tiedosto.

Aloitetaan luomalla MyDockerImage -kansio ja luomalla sen sisälle tiedosto hello.cc.

$mkdirMyDockerImage
$CDMyDockerImage
$kosketushei.cc

Avaa hello.cc suosikkitekstieditorillasi ja lisää seuraavat rivit sen sisälle.

#sisältää
käyttämällä nimiavaruuden std;
inttärkein(){
kustannus<< 'Hei! Tämä viesti tulee säilöstä n'';
palata 0;

}

Tämä on yksinkertainen C ++ -ohjelma, joka tulostaa Hello! Tämä viesti …

Edellä käsitellyistä syistä keräämme tämän käyttämällä staattista lippua. Käytettävä kääntäjä on g ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

Ohjelman kääntämiseksi suorita seuraava komento samassa hakemistossa:

$ g++ -o hei-staattinenHei.DC

Tämä luo binäärisen suoritettavan tiedoston hei samaan hakemistoon. Se on staattinen tiedostomme. Testaa, toimiiko se tarkoitetulla tavalla mainitsemalla tiedostonimi päätelaitteessa.

$./Hei

Nyt olemme valmiita pakkaamaan tämän yksinkertaisen ohjelman.

Docker -tiedosto

Dockerfile koostuu sääntöjoukosta, joka ottaa sovellustiedostot (kuten binääritiedostot, lähdetiedostot jne.) Sekä erilaiset kokoonpanoparametrit, kuten tiedostojärjestelmän ulkoasun, avoimet portit jne. Ja muuttaa ne Docker -kuvatiedostoksi. Voit sitten jakaa kuvatiedoston kenelle tahansa, joka haluaa käyttää kyseistä sovellusta.

Emme kaivaudu kaikkiin Dockerfile -vaihtoehtoihin, vaan kirjoitamme erittäin minimalistisen Docker -tiedoston. Luo tyhjä tiedosto nimeltä samaan hakemistoon, jossa suoritettava suoritustasi sijaitsee Docker -tiedosto.

$kosketusDocker -tiedosto

Avaa se suosikkitekstieditorillasi ja kirjoita siihen seuraavat rivit:

Tyhjästä
LISÄÄ hei/
CMD['/Hei']

naarmu ei ole vanhemman kuva. Pikemminkin se osoittaa Dockerille, että kuva ei ole rakennettu minkään muun kuvan päälle. Se on rakennettu tyhjästä. ADD -komento ottaa staattisen binaarin nimeltä | _+_ | nykyisestä hakemistosta ja lisää sen kuvatiedoston juurihakemistoon. Kun ajaisimme vihdoin säilön tämän kuvan perusteella, hei suoritettava tiedosto näkyy itse juurihakemistossa | _+_ |

Lopuksi CMD -rivillä on merkkijono /Hei tämä merkkijono suoritetaan kuorikomennona aina, kun tästä kuvasta luodaan säilö, eli binaaritiedosto, jonka lisäsimme säilöömme ja tulostamme sovelluksessamme kirjoittamamme viestin.

Rakennetaan kuva vetoamalla telakoitsijan rakentaminen komento, joka kulkee Dockerfilen sisällön läpi ja luo kuvan. Suorita seuraava komento samassa hakemistossa kuin Dockerfile ja suoritettava binääri.

$telakoitsijan rakentaminen--tagHei .

The - tervehdys lippu asettaa kuvan nimeksi Hei ja piste ( . ) lopussa kertoo telakoitsijan rakentaminen etsiä Dockerfile ja siihen liittyvän sisällön nykyistä hakemistoa.

Docker -säiliön suorittaminen

Jos haluat tarkistaa, näkyykö juuri luomamme kuva kuvaluettelossa, suorita:

$telakoitsijan kuvia

Huomaa, kuinka pieni hei -kuva on verrattuna muihin kuviin. Joka tapauksessa se on valmis käytettäväksi säiliönä,

$telakoitsija juoksee hei

Se siitä! Loit ensimmäisen minimalistisen säiliön tyhjästä.

Muita vaihtoehtoja

Vaikka kuvien luominen tyhjästä on aina vaihtoehto, ihmiset usein luovat kuvia muista kevyistä Linux -distroista. Esimerkiksi alppi- ja busybox -kuvat ovat todella kevyitä ympäristöjä, joissa on pienemmät kirjastot, kuten musl glibcin sijaan.

Käyttämällä niitä vanhemman kuvana käyttämällä Alpineilta: viimeisin aiheuttaisi myös pienempiä kuvia. Peruskuvien koko on vain 2-5 Mt. Kerro meille, onko Dockeriin liittyvää aihetta, jonka haluat ehkä käsitellä seuraavaksi. Voit tavoittaa meidät osoitteessa Viserrys , Facebook tai tilaa meidät sähköpostitse.