Moduuli 9 · 9.2
Dockerin asentaminen ja ensimmäinen konttisi
Moduuli 9: Docker ja docker compose · Lukuaika: 11 minuuttia
Tavoite: Tämän oppitunnin jälkeen osaat asentaa Docker Enginen virallisesta pakettilähteestä sekä käynnistää, tarkastella, tutkia sisältä ja siivota kontteja. Tiedät myös, miksi docker-ryhmä vastaa rootia.
Keskeiset käsitteet: Docker Engine, Docker Desktop, virallinen apt-lähde, Debianin docker.io, docker-ryhmä, rootless mode, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df
Mikä Docker?
Palvelimelle asennetaan Docker Engine: taustapalvelu (dockerd) ja komento docker. Docker Desktop on eri asia: ikkunoilla toimiva ohjelma Windowsiin, macOS:ään ja Linux-työpöydille. Se ei kuulu palvelimelle.
Docker Enginelle on kaksi siistiä lähdettä:
- Dockerin oma pakettilähde (
download.docker.com). Aina uusin versio, mukaan lukien liitännäinendocker compose, jota käytät oppitunnilla 9.3. Tätä Dockerin dokumentaatio kuvaa ja tätä tämä kurssi käyttää. - Debianin tai Ubuntun paketti
docker.io. Vanhempi, mutta jakelu päivittää sen tavallisten tietoturvapäivitystesi mukana (oppitunti 4.2). Hyvä valinta, jos et halua mitään jakelun ulkopuolelta. Tarkista silloin, ettädocker compose(välilyönnillä) on saatavilla.
Valitse yksi. Molempien asentaminen sekaisin aiheuttaa ristiriitoja, ja siksi Dockerin dokumentaatio neuvoo poistamaan ensin epäviralliset paketit, kuten docker.io, docker-compose ja podman-docker.
Asennus Dockerin pakettilähteestä
Nämä ovat Dockerin dokumentaation vaiheet Debianille, avain erillään ja oma Signed-By (oppitunti 4.1). Ota halutessasi ensin tilannevedos.
anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install ca-certificates curl
anna@web1:~$ sudo install -m 0755 -d /etc/apt/keyrings
anna@web1:~$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
anna@web1:~$ sudo chmod a+r /etc/apt/keyrings/docker.ascSen jälkeen lähdetiedosto /etc/apt/sources.list.d/docker.sources (deb822-muodossa):
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascKohtaan Suites tulee julkaisusi koodinimi (cat /etc/os-release, oppitunti 4.3) ja kohtaan Architectures komennon dpkg --print-architecture tuloste. Ubuntussa URL on https://download.docker.com/linux/ubuntu ja suite esimerkiksi noble.
Sitten asennus:
anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
anna@web1:~$ sudo docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.Debianissa ja Ubuntussa Docker käynnistyy itsestään asennuksen jälkeen ja myös jokaisen uudelleenkäynnistyksen jälkeen (systemctl status docker, oppitunti 6.1).
Huomaa: unattended-upgrades (oppitunti 4.2) ei oletuksena päivitä tämän lähteen paketteja automaattisesti. Ota Dockerin sudo apt update && sudo apt upgrade mukaan ylläpitorytmiisi (oppitunti 10.4) tai lisää lähde tietoisesti automaattisiin päivityksiisi.
docker-ryhmä on root
Kaikkialla internetissä neuvotaan lisäämään itsesi ryhmään docker, jotta sinun ei tarvitse enää kirjoittaa sudo:
anna@web1:~$ sudo usermod -aG docker annaTee niin vain, jos ymmärrät, mitä se tarkoittaa. Dockerin dokumentaatio sanoo sen selvästi: docker-ryhmä antaa root-tason oikeudet. Kuka tahansa, joka saa ohjata Docker-palvelua, voi käynnistää kontin, johon on liitetty isännän koko levy:
docker run -it -v /:/host debian chroot /hostja on sen jälkeen root palvelimellasi ilman salasanaa ja ilman merkintää sudo-lokiin. Dockerin dokumentaation sanoin: vain luotetut käyttäjät saavat ohjata Docker-palvelua.
Palvelimella, jota ylläpidät yksin, kyse on valinnasta: mukavuus vastaan ylimääräinen reitti rootiksi. Turvallisempaa on kirjoittaa edelleen sudo docker ..., jolloin jokainen komento näkyy sudo-lokissa (oppitunti 3.2). Älä missään tapauksessa lisää ryhmään käyttäjää, joka ei saa olla root, kuten verkkosivuston palvelukäyttäjää.
Rootless mode
Docker voi toimia myös ilman rootia: palvelu ja kontit toimivat silloin tavallisen käyttäjän alla, omassa user namespacessa. Asennat sen kyseisenä käyttäjänä komennolla dockerd-rootless-setuptool.sh install (paketista docker-ce-rootless-extras; ennen sitä tarvitaan paketti uidmap). Tällöin kontin vuoto ei anna root-oikeuksia isäntään. Tilassa on rajoituksia ja sen käyttöönotto on hankalampaa. Tällä kurssilla käytämme tavallista asennusta ja pidämme sen turvallisena tämän moduulin säännöillä.
Ensimmäinen oikea kontti
Käynnistämme nginx-verkkopalvelimen kontissa, ja se on tavoitettavissa vain palvelimelta itseltään:
anna@web1:~$ sudo docker run -d --name proef -p 127.0.0.1:8080:80 nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
...
3f1c9e0d7a2b...Osat:
| Osa | Merkitys |
|---|---|
-d | Toimii taustalla (detached) |
--name proef | Nimi, jotta sinun ei tarvitse käyttää pitkiä tunnisteita |
-p 127.0.0.1:8080:80 | Kontin portista 80 tulee isännän portti 8080, vain loopbackissa |
nginx:stable | Virallinen nginx-image, tagi stable |
Tarkistus:
anna@web1:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
3f1c9e0d7a2b nginx:stable "/docker-entrypoint.…" Up 5 seconds 127.0.0.1:8080->80/tcp proef
anna@web1:~$ curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.28.0
anna@web1:~$ sudo ss -tlnp | grep 8080
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=2211,fd=7))ss (oppitunti 5.1) vahvistaa: vain osoitteessa 127.0.0.1. Jos olisit kirjoittanut -p 8080:80, siinä lukisi 0.0.0.0:8080 ja [::]:8080, ja konttisi olisi tavoitettavissa internetistä, vaikka ufw ei sallisi porttia 8080 (oppitunti 9.3). Server-otsakkeen versio voi olla sinulla eri.
Tarkastelu ja toimenpiteet
anna@web1:~$ sudo docker logs proef # mitä ohjelma kirjoitti (stdout ja stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # viimeiset 20 riviä ja seuraa jatkuvasti
anna@web1:~$ sudo docker exec -it proef sh # shell käynnissä olevaan konttiin
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef # pysäytä ja poistadocker logs on ensimmäinen paikka, josta katsot, kun kontti ei toimi odotetusti, samaan tapaan kuin journalctl tavallisille palveluille (oppitunti 6.2). Komennolla docker exec pääset katsomaan sisälle, mutta älä mieluiten muuta siellä mitään: kontin muutokset katoavat seuraavassa päivityksessä (oppitunti 9.1).
Siivoaminen
Imaget ja pysäytetyt kontit jäävät paikalleen, kunnes siivoat ne. Pienen levyn VPS:llä tämä kasvaa huomaamatta.
anna@web1:~$ sudo docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 7 3 1.9GB 1.2GB (63%)
Containers 3 3 12MB 0B (0%)
Local Volumes 2 2 180MB 0B (0%)
Build Cache 0 0 0B 0B
anna@web1:~$ sudo docker image prunedocker image prune poistaa nimettömät imaget, joita mikään ei enää käytä; valitsimella -a myös kaikki imaget, joita mikään kontti ei käytä. Ole varovainen komennon docker system prune --volumes kanssa: se poistaa myös anonyymit (nimettömät) volumet, jotka eivät sillä hetkellä kuulu mihinkään konttiin, ja docker volume prune -a poistaa jopa nimetyt volumet. Niissä voi olla tietojasi. Anna siksi volumeille aina nimi tai käytä bind mountia (oppitunti 9.1), ja tarkista ensin komennolla docker volume ls.
Myös konttien lokit voivat kasvaa. Docker tallentaa ne oletuksena JSON-tiedostoihin ilman kokorajaa. Rajan asetat tiedostossa /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Sen jälkeen sudo systemctl restart docker. Asetus koskee vain uusia kontteja; olemassa olevat kontit luot uudelleen.
Käytännössä
Docker toimii WebOkén VPS:llä samalla tavalla kuin minkä tahansa muun palveluntarjoajan palvelimella: se on ohjelmistoa omalla palvelimellasi, ja asennat ja päivität sen itse. Seuraa pienellä VPS:llä levytilaa säännöllisesti komennoilla docker system df ja df -h (oppitunti 1.4).
Yhteenveto
- Asenna Docker Engine Dockerin pakettilähteestä (omalla avaimella ja
Signed-By-tiedostolla) tai jakelundocker.io, älä molempia. - docker-ryhmä vastaa rootia;
sudo dockerjättää jäljen sudo-lokiin. Rootless mode on turvallisempi mutta rajoitetumpi vaihtoehto. docker run -d --name ... -p 127.0.0.1:host:container image:tagkäynnistää kontin, joka on tavoitettavissa vain paikallisesti; tarkista komennollass.docker ps,logs,exec,stopjarmovat päivittäisiä työkalujasi.- Siivoa imaget komennolla
docker image prune, rajaa konttien lokit (oletuksena rajattomat) ja käytä komentoa--volumessäästeliäästi.
Tietovisa (quiz)
Tehtävä
Tehtävä O9.2: Ensimmäinen konttisi. Asenna Docker Engine palvelimellesi oppitunnin ohjeiden mukaan (tai testikoneelle). Käynnistä nginx-kontti, joka kuuntelee vain osoitteessa 127.0.0.1:8080, tarkista komennoilla docker ps, curl -I ja ss -tlnp, katso lokit ja siivoa kontti lopuksi pois. Vastaa kysymyksiin: mistä lähteestä asensit Dockerin, mitä ss näytti portin 8080 kohdalla, ja lisäsitkö itsesi docker-ryhmään (miksi tai miksi et)?
Tehtävä O9.2: Ensimmäinen konttisi
Tämän tehtävän teet itse, kukaan ei tarkista sitä. Merkitse tekemäsi kohdat ja merkitse tehtävä tehdyksi.
Dockerin omasta lähteestä asennettua versiota unattended-upgrades ei oletuksena päivitä; jakelun docker.io päivittyy. ss:n pitäisi näyttää 127.0.0.1:8080, ei 0.0.0.0:8080. Ryhmä docker antaa root-oikeudet; kun käytät sudo docker, jokainen komento jää sudo-lokiin.
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, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Dockerin dokumentaatio, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Dockerin dokumentaatio, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Dockerin dokumentaatio, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Dockerin dokumentaatio, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Dockerin dokumentaatio, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
