-
Konfigurointi
-
Docker-levykuvien pitäminen pieninä
Docker-imagien pitäminen pieninä
On tärkeää pitää Docker-imaget pieninä. Mitä pienempi image on, sitä nopeammin se vedetään käyttöön, mikä nopeuttaa julkaisuja sekä tuotanto- että kehitysympäristöissä. Lisäksi suuremmat imaget poistuvat noodien välimuistista nopeammin. Rahtin sisäiseen rekisteriin tallennettavan imagen enimmäiskoko on 5 Gt. Yli 1 Gt:n imagia pidetään jo erittäin suurena.
Mieti tarkkaan, mitä imageen lisätään
Ensimmäinen tapa pitää image pienenä on yksinkertaisesti olla lisäämättä tarpeettomia tiedostoja. Kehitysvaiheessa on tavallista asentaa kirjastojen tai muiden riippuvuuksien täydet lähdekoodit, esimerkiksi Linux-ytimen otsaketiedostot. Näitä lähdekoodeja ei enää tarvita tuotantoympäristön julkaisuissa.
Pidä data poissa imagesta
Imagien tulisi sisältää vain sovelluksen ajoaikainen ympäristö. Tämä tarkoittaa, että sovelluksen suorittamiseen tarvittavaa dataa ei pidä lisätä imageen. Näin image ei ole ainoastaan pienempi, vaan vältämme myös uudelleenrakennuksen silloin, kun data muuttuu. Data voidaan tallentaa ulkoiseen taltioon (PVC), joka liitetään podiin käynnistyksen yhteydessä, tai se voidaan tallentaa Altaaseen ja ladata palveluun käynnistyksen aikana tai tarvittaessa pyynnöstä. Datan tallentaminen Altaaseen edellyttää sovellukselta lisälogiikkaa (tai esilatausskriptiä), joka ymmärtää, missä data sijaitsee ja miten se haetaan. data voidaan tallentaa ulkoiseen taltioon (PVC), joka liitetään podiin käynnistyksen yhteydessä, tai se voidaan tallentaa
Vähennä kerrosten määrää
Jokaisesta Dockerfile-ohjeesta (RUN, COPY, CMD, EXPOSE, ...) lisätään Docker-imageen uusi kerros. Jokainen kerros tallennetaan erona edelliseen. Tämä tarkoittaa, että jos jotakin dataa lisätään yhdessä kerroksessa mutta poistetaan seuraavassa, image sisältää silti kyseisen datan. Jos haluat nähdä, kuinka paljon dataa kukin kerros lisää imageen, voit käyttää komentoa:
docker history image_name
Kerrosten määrän vähentämiseen on 3 lähestymistapaa:
- Yhdistä kerroksia
Dockerfile-tiedostossa. Joskus useitaRUN-ohjeita on peräkkäin. Ne voidaan helposti yhdistää käyttämällä&&-operaattoria:
muuttuu muotoon:
- Käytä monivaiheisia koonteja (tämä ominaisuus otettiin käyttöön Dockerin versiossa 17.05). Monivaiheisten koontien idea on, että samassa
Dockerfile-tiedostossa on useitaFROM-komentoja. JokainenFROMaloittaa uuden vaiheen koonnissa eikä tuo mukanaan edellisen vaiheen tiedostoja, mutta sallii tiedostojen kopioimisen aiemmista vaiheista. Tässä käytetty malli on se, että sovellus kootaan ensimmäisessä vaiheessa ja toisessa vaiheessa kopioidaan vain käännetty sovellus, jolloin lähdekoodit ja muut käännöksen sivutuotteet, joita ei tarvita sovelluksen suorittamiseen, jäävät pois. Esimerkiksi:
FROM golang:1.21
WORKDIR /src
RUN echo 'package main\n\
\nimport "fmt"\nfunc main() {\nfmt.Println("hello, world")\n}' >main.go
RUN go build -o /bin/hello ./main.go && cat main.go
FROM scratch
COPY --from=0 /bin/hello /bin/hello
CMD ["/bin/hello"]
Esimerkki on otettu Dockerin dokumentaation artikkelista Use multi-stage builds.
- Käytä komentoa docker build --squash. Docker litistää imagen yhdeksi kerrokseksi. Tämä tarkoittaa, että jos
Dockerfiletuottaa useita kerroksia, jotka muokkaavat samoja tiedostoja, vain tiedostojen lopullinen tila tallennetaan. Samoin jos tiedosto luodaan yhdessä kerroksessa ja poistetaan myöhemmin toisessa, tiedostoa ei tallenneta imageen.
Käytä pientä pohjaimagea
Imagea luotaessa pohjaimagen valinta on tärkeä tehtävä. Tiettyyn tarpeeseen on lähes aina saatavilla useita pohjaimageja. Nämä pohjaimaget voivat erota toisistaan huomattavasti sisällön, ylläpidon, tietoturvan, koon jne. osalta. On hyvä käytäntö arvioida saatavilla olevia imageja ja tehdä niiden välillä vertailuja. Usein ei ole hyvä ajatus ottaa ensimmäistä satunnaista löytämääsi imagea ja viedä sitä tuotantoon. Yksi hyvin yleisesti käytetty pohjaimage, josta on saatavilla paljon dokumentaatiota, on Alpine Linux.
Alpine Linux on tietoturvapainotteinen, kevyt Linux-jakelu, joka perustuu musl libc- ja busybox-ohjelmistoihin.
Tällä hetkellä Alpinen pohjaimage (docker.io/alpine) on vain 5,61 Mt. Vertailun vuoksi Ubuntun ja AlmaLinuxin pohjaimagien koot ovat 72,9 Mt ja 189 Mt. Alpinen suurin haittapuoli verrattuna muihin pohjaimageihin on se, että jotkin sovellukset eivät ole yhteensopivia musl libc -kirjaston kanssa ja vaativat glibc:n. Alpinella on myös pienempi valikoima ohjelmistoja saatavilla repositorioissa kuin Ubuntulla tai AlmaLinuxilla.
Käytä .dockerignore-tiedostoa
.dockerignore toimii samalla tavalla kuin gitignore: se luo estolistan tiedostoista, joita ei lisätä imageen. Tällä tavoin on mahdollista sulkea pois tiedostoja, joita ei tarvita sovelluksen suorittamiseen.