Moduuli 9 · 9.1
Konttien ymmärtäminen
Moduuli 9: Docker ja docker compose · Lukuaika: 10 minuuttia
Tavoite: Tämän oppitunnin jälkeen osaat selittää, mikä kontti on, miten se eroaa virtuaalikoneesta, missä kontin tiedot säilyvät ja milloin Docker on palvelimellasi järkevä valinta.
Keskeiset käsitteet: image, kontti, kerros, registry (Docker Hub), tag, digest, namespaces, cgroups, jaettu ydin, haihtuva tiedostojärjestelmä, volume, bind mount, portin julkaiseminen, virallinen image
Miksi kontteja?
Oletetaan, että haluat ajaa VPS:lläsi tilasivua, joka näyttää, toimiiko verkkosivustosi. Ohjelma on kirjoitettu Node.js:llä, se tarvitsee tietyn Node.js-version ja lisäksi parisataa kirjastoa. Ilman kontteja asennat kaiken tämän palvelimellesi verkkopalvelimen ja tietokannan rinnalle. Vuoden päästä haluat toisen ohjelman, joka tarvitsee eri Node.js-version. Silloin alkaa palapeli.
Kontti ratkaisee tämän. Ohjelman tekijä toimittaa ohjelman ja kaiken, mitä se tarvitsee, yhtenä pakettina: imagena. Palvelimellasi käynnistät imagen konttina. Ohjelma näkee omat tiedostonsa, oman Node.js:nsä ja omat kirjastonsa, eikä se riitele palvelimesi muiden osien kanssa. Etkö tarvitse sitä enää? Poista kontti ja image, eikä hakemistoihin /usr tai /etc jää mitään.
Docker on tunnetuin työkalu imagejen hakemiseen ja konttien ajamiseen. Vaihtoehtojakin on (Podman, containerd itse), mutta käsitteet ovat kaikkialla samat.
Image, kontti ja registry
Kolme sanaa, jotka tulevat vastaan jatkuvasti:
- Image: vain luku -muotoinen pohja, jossa on tiedostojärjestelmä (ohjelma, kirjastot, asetukset) ja käynnistettävä komento. Image koostuu kerroksista: peruskerros (esimerkiksi riisuttu Debian), sen päällä kerros, jossa on Node.js, ja sen päällä itse ohjelma. Kaksi imagea, joilla on sama peruskerros, jakavat sen levylläsi.
- Kontti: imagen käynnissä oleva (tai pysäytetty) ilmentymä. Vain luku -kerrosten päälle kontti saa oman ohuen kirjoituskerroksen. Yhdestä imagesta voi käynnistää vaikka kymmenen konttia.
- Registry: paikka, jossa imaget ovat, kuten Docker Hub (
docker.io) tai GitHubin registry (ghcr.io). Docker hakee imagen komennolladocker pull.
Imagen nimi näyttää tältä:
louislam/uptime-kuma:2
caddy:2
vaultwarden/server:latestKaksoispisteen jälkeinen osa on tag: version nimilappu. Tag voi muuttua: caddy:2 osoittaa tänään eri buildiin kuin kolmen kuukauden päästä, kun uusi 2.x julkaistaan. Jos haluat lukita tarkasti, mitä imagea ajat, käytä digestiä: sisällön sormenjälkeä, kuten caddy@sha256:.... Se ei muutu koskaan. Tag latest on vain tekijän valitsema nimi. Se ei automaattisesti tarkoita "uusinta vakaata versiota", ja siksi se on huono valinta, jos haluat tietää, mitä on käynnissä.
Ei virtuaalikone
Kontti muistuttaa pientä virtuaalikonetta, mutta se ei ole sellainen. Ero on tärkeä tietoturvan kannalta.
| Virtuaalikone (kuten VPS:si) | Kontti | |
|---|---|---|
| Ydin | Oma ydin | Jakaa isäntäkoneen ytimen |
| Käynnistyminen | Sekunneista minuutteihin, koko käyttöjärjestelmä | Yleensä sekunnissa, vain ohjelma |
| Erottelu | Hypervisorin avulla, laitteistotasolla | Ytimen avulla: namespaces ja cgroups |
| Koko | Gigatavuja | Usein kymmenistä satoihin megatavuihin |
Kontti on käytännössä tavallinen prosessi palvelimellasi, jonka ydin sijoittaa eristettyyn ympäristöön:
- namespaces antavat prosessille oman näkymän tiedostoihin, prosesseihin, verkkoon ja käyttäjiin. Kontissa ohjelma näyttää olevan prosessi numero 1, eikä se näe palvelimesi muita osia;
- cgroups rajoittavat, kuinka paljon suoritinta ja muistia se saa käyttää.
Koska kaikki kontit jakavat saman ytimen, erottelu on löyhempi kuin kahden VPS:n välillä. Ytimen haavoittuvuus tai kontti, jolle on annettu liikaa oikeuksia, voi vaikuttaa isäntäkoneeseen. Siksi tämän moduulin säännöt: aja vain imageja, joihin luotat, älä anna konteille enempää oikeuksia kuin tarvitaan, äläkä koskaan liitä konttiin polkua /var/run/docker.sock tai / (oppitunnit 9.3 ja 10.2).
Missä tietosi säilyvät?
Tämä on aloittelijoiden klassinen ansa. Kontin kirjoituskerros on haihtuva: kun poistat kontin (esimerkiksi päivityksen yhteydessä, oppitunti 9.4), kaikki, mitä ohjelma siihen kirjoitti, katoaa. Siksi säilytettävät tiedot kuuluvat kontin ulkopuolelle:
- Volume: tallennuspaikka, jota Docker hallinnoi itse (hakemistossa
/var/lib/docker/volumes/). Annat sille nimen, esimerkiksiuptime-kuma, ja liität sen kontin hakemistoon:-v uptime-kuma:/app/data. - Bind mount: palvelimesi tavallinen hakemisto, jonka liität konttiin:
-v /srv/vaultwarden:/data. Kätevä, koska näet tiedostot suoraan ja saat ne helposti mukaan varmuuskopioon (moduuli 8).
Kontin, jolla on hyvät volumet, voi heittää pois ja luoda uudelleen menettämättä mitään. Juuri näin päivittäminen toimii: haet uuden imagen, poistat vanhan kontin ja käynnistät uuden kontin samoilla volumeilla. Lisää siksi volumet varmuuskopiointisuunnitelmaasi (oppitunti 8.1).
Porttien julkaiseminen
Kontilla on oma verkkonsa. Verkko-ohjelmaan, joka kuuntelee kontissa porttia 3001, ei pääse palvelimen ulkopuolelta ennen kuin julkaiset portin: -p 3001:3001 (isäntäportti:konttiportti). Huomaa: ilman osoitetta Docker julkaisee portin palvelimesi kaikissa osoitteissa, eli 0.0.0.0 ja [::]. Se tarkoittaa, että portti on avoinna koko internetiin, ja Docker hoitaa tämän ufw:n ohi (oppitunti 9.3). Turvallinen tapa on julkaista loopbackiin, -p 127.0.0.1:3001:3001, ja laittaa eteen käänteinen välityspalvelin (reverse proxy) https:llä (oppitunti 9.4).
Kuka imagen tekee?
Image on jonkun muun tekemää ohjelmistoa, joka voi toimia palvelimellasi rootina. Tarkista siksi, kuka sen on tehnyt:
- Docker Official Images (kuten
caddy,nginx,postgres) ylläpitää Docker yhdessä tekijöiden kanssa; - tekijän omat imaget (kuten
louislam/uptime-kumajavaultwarden/server) tunnistat nimestä, jonka projektin verkkosivusto mainitsee; - tuntemattomien julkaisemat imaget, joiden nimet muistuttavat oikeita: älä käytä.
Käytä aina nimeä, joka on projektin virallisella verkkosivustolla, älä ensimmäistä, jonka haku tuo esiin.
Milloin kyllä, milloin ei?
Docker on kätevä ohjelmille, jotka tekijä toimittaa imagena, palveluille, jotka haluat voida nopeasti poistaa tai siirtää, ja silloin, kun haluat ajaa rinnakkain useita ohjelmia, joilla on erilaiset vaatimukset. Palvelimesi perustaan (SSH, palomuuri, päivitykset) et käytä kontteja. Yksittäinen verkkosivusto, jossa on nginx ja PHP pakettilähteestä (oppitunti 7.2), toimii mainiosti ilman Dockeria. Kontti tuo lisäkerroksen, joka sinun on ymmärrettävä ja pidettävä ajan tasalla. Käytä sitä, kun siitä on hyötyä.
Yhteenveto
- Image on kerroksista koostuva vain luku -pohja; kontti on sen käynnissä oleva ilmentymä, jolla on oma kirjoituskerros.
- Kontit jakavat isäntäkoneen ytimen ja ne on eristetty namespacesien ja cgroupsien avulla: kevyempiä kuin virtuaalikone, mutta löyhemmin erotettuja.
- Kirjoituskerros on haihtuva: pysyvät tiedot kuuluvat volumeen tai bind mountiin, ja ne kuuluvat varmuuskopioosi.
- Tag voi muuttua, digest ei;
latestkertoo vähän. - Julkaise portit osoitteeseen 127.0.0.1 ja käytä vain tekijän omia tai virallisia imageja.
Tietovisa (quiz)
Tehtävä
Tehtävä O9.1: Kontti vai ei? Valitse kaksi ohjelmaa, joita haluat ajaa palvelimellasi (tai käytä esimerkkinä Uptime Kumaa ja WordPress-sivustoa). Selvitä kummastakin ohjelmasta, toimittaako tekijä virallisen imagen ja millä nimellä, minkä tagin valitsisit, mikä hakemisto sisältää pysyvät tiedot ja mitä porttia ohjelma kuuntelee. Selitä sen jälkeen, ajaisitko ohjelmaa kontissa vai pakettilähteestä, ja miksi.
Tehtävä O9.1: Kontti vai ei?
Tämän tehtävän teet itse, kukaan ei tarkista sitä. Merkitse tekemäsi kohdat ja merkitse tehtävä tehdyksi.
Uptime Kuma: louislam/uptime-kuma versiotagilla, tiedot kansiossa /app/data, portti 3001, julkaisu osoitteeseen 127.0.0.1 käänteisen välityspalvelimen taakse. Valitse tekijän oma image tai Official Image, jossa on versiotagi ja nimetty tietokansio.
Merkintäsi ja muistiinpanosi pysyvät vain tässä selaimessa, emme lähetä niitä minnekään. Jos olet kirjautunut sisään, tallennamme kohtaan Omat kurssit vain sen, että olet tehnyt tehtävän.
Lue lisää
- Dockerin dokumentaatio, What is a container?: https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/
- Dockerin dokumentaatio, Volumes: https://docs.docker.com/engine/storage/volumes/
- Dockerin dokumentaatio, Port publishing and mapping: https://docs.docker.com/engine/network/port-publishing/
- Docker Official Images: https://docs.docker.com/docker-hub/repos/manage/trusted-content/official-images/
