Moodul 9 · 9.2
Dockeri paigaldamine ja sinu esimene konteiner
Moodul 9: Docker ja docker compose · Lugemisaeg: 11 minutit
Õpieesmärk: Pärast seda õppetundi oskad paigaldada Docker Engine'i ametlikust pakiallikast ning konteinereid käivitada, vaadata, nende sisse piiluda ja koristada. Samuti tead, miks docker-grupp on võrdne root-õigustega.
Põhimõisted: Docker Engine, Docker Desktop, ametlik apt-allikas, Debiani docker.io, docker-grupp, rootless mode, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df
Milline Docker?
Serverisse paigaldad Docker Engine'i: taustateenuse (dockerd) ja käsu docker. Docker Desktop on midagi muud: akendega programm Windowsi, macOS-i ja Linuxi töölaudade jaoks. Serverisse see ei kuulu.
Docker Engine'i jaoks on kaks korralikku allikat:
- Dockeri enda pakiallikas (
download.docker.com). Alati uusim versioon, koos pistikprogrammigadocker compose, mida kasutad õppetunnis 9.3. Seda kirjeldab Dockeri dokumentatsioon ja seda kasutab ka see kursus. - Debiani või Ubuntu pakett
docker.io. Vanem, kuid distributsioon uuendab seda sinu tavaliste turvauuendustega (õppetund 4.2). Sobib hästi, kui eelistad, et väljastpoolt distributsiooni ei tuleks midagi; kontrolli siis aga, kasdocker compose(tühikuga) on saadaval.
Vali neist üks. Segamini paigaldamine tekitab konflikte; seepärast soovitab Dockeri dokumentatsioon esmalt eemaldada mitteametlikud paketid, nagu docker.io, docker-compose ja podman-docker.
Paigaldamine Dockeri pakiallikast
Need on Dockeri dokumentatsiooni sammud Debiani jaoks, eraldi võtme ja oma Signed-By-iga (õppetund 4.1). Soovi korral tee enne hetktõmmis (snapshot).
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.ascSeejärel allikafail /etc/apt/sources.list.d/docker.sources (deb822-kujul):
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascVäljale Suites käib sinu väljalaske koodnimi (cat /etc/os-release, õppetund 4.3) ja väljale Architectures käsu dpkg --print-architecture väljund. Ubuntus on URL https://download.docker.com/linux/ubuntu ja suite näiteks noble.
Siis paigalda:
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.Debianis ja Ubuntus käivitub Docker pärast paigaldamist ise ning ka pärast iga taaskäivitust (systemctl status docker, õppetund 6.1).
NB! unattended-upgrades (õppetund 4.2) ei uuenda selle allika pakette vaikimisi automaatselt. Lisa Dockeri jaoks sudo apt update && sudo apt upgrade oma hoolduse rütmi (õppetund 10.4) või lisa allikas teadlikult automaatsete uuenduste hulka.
docker-grupp on root
Internetis kirjutatakse igal pool, et lisa end gruppi docker, siis ei pea sa enam sudo trükkima:
anna@web1:~$ sudo usermod -aG docker annaTee seda ainult siis, kui mõistad, mida see tähendab. Dockeri dokumentatsioon ütleb selgelt: docker-grupp annab root-tasemel õigused. Kes tohib Dockeri teenust juhtida, saab käivitada konteineri, kuhu on haagitud kogu hosti ketas:
docker run -it -v /:/host debian chroot /hostja on seega sinu serveris root, ilma paroolita ja ilma sudo-logita. Dockeri dokumentatsioon sõnastab selle nii: Dockeri teenust tohivad juhtida ainult usaldusväärsed kasutajad.
Serveri puhul, mida haldad ainult ise, on see valik: mugavus versus lisatee root-õigusteni. Turvalisem on lihtsalt edasi trükkida sudo docker ...; siis on iga käsk sudo-logis (õppetund 3.2). Ära igal juhul lisa gruppi kasutajat, kes ei tohi olla root, näiteks veebisaidi teenusekasutajat.
Rootless mode
Docker võib töötada ka ilma rootita: teenus ja konteinerid töötavad siis tavakasutaja all, oma user namespace'iga. Paigaldad selle selle kasutajana käsuga dockerd-rootless-setuptool.sh install (paketist docker-ce-rootless-extras; eelnevalt on vaja paketti uidmap). Konteineri turvaauk ei anna siis hostis root-õigusi. Sellel on piiranguid ja seadistamine on keerulisem; selles kursuses kasutame tavalist paigaldust ning hoiame selle turvalisena selle mooduli reeglitega.
Esimene päris konteiner
Käivitame konteineris nginx-veebiserveri, millele pääseb ligi ainult serverist endast:
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...Osad:
| Osa | Tähendus |
|---|---|
-d | Töötab taustal (detached) |
--name proef | Nimi, et ei peaks pikkade ID-dega töötama |
-p 127.0.0.1:8080:80 | Konteineri port 80 saab hosti pordiks 8080, ainult loopbackil |
nginx:stable | Ametlik nginx-image, silt stable |
Kontrolli:
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 (õppetund 5.1) kinnitab: ainult aadressil 127.0.0.1. Kui oleksid trükkinud -p 8080:80, oleks seal olnud 0.0.0.0:8080 ja [::]:8080 ning su konteiner oleks olnud internetist kättesaadav, isegi kui ufw porti 8080 ei luba (õppetund 9.3). Versioon päises Server võib sinul olla teine.
Ringi vaatamine ja sekkumine
anna@web1:~$ sudo docker logs proef # mida programm kirjutas (stdout ja stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # viimased 20 rida ja jälgi edasi
anna@web1:~$ sudo docker exec -it proef sh # shell töötavas konteineris
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef # peata ja eemaldadocker logs on esimene koht, kuhu vaatad, kui konteiner ei tee seda, mida ootad, täpselt nagu journalctl tavaliste teenuste puhul (õppetund 6.2). docker exec abil vaatad sisse, kuid parem ära seal midagi muuda: muudatused konteineris kaovad järgmise uuendusega (õppetund 9.1).
Koristamine
Image'id ja peatatud konteinerid jäävad alles, kuni need koristad. Väikese kettaga VPS-is kuhjub see märkamatult.
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 eemaldab nimeta image'id, mis enam millegi juurde ei kuulu; võtmega -a ka kõik image'id, mida ükski konteiner ei kasuta. Ole ettevaatlik käsuga docker system prune --volumes: see eemaldab ka anonüümsed (nimeta) köited, mis parasjagu ühegi konteineri juurde ei kuulu, ja docker volume prune -a isegi nimega köited. Neis võivad olla sinu andmed. Seepärast anna köidetele alati nimi või kasuta bind mount'i (õppetund 9.1) ning vaata enne üle käsuga docker volume ls.
Ka konteinerite logid võivad kasvada. Docker hoiab neid vaikimisi JSON-failides ilma suuruspiiranguta. Piirangu sead failis /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Seejärel sudo systemctl restart docker; seadistus kehtib ainult uutele konteineritele, olemasolevad konteinerid loo uuesti.
Praktikas
Docker töötab WebOké VPS-is samamoodi nagu iga teise teenusepakkuja juures: see on tarkvara sinu enda serveris, mille paigaldad ja uuendad ise. Väikese VPS-i puhul vaata käskudega docker system df ja df -h (õppetund 1.4) regulaarselt kettaruumi.
Kokkuvõte
- Paigalda Docker Engine Dockeri pakiallikast (oma võtme ja
Signed-By-iga) võidocker.iodistributsioonist, mitte mõlemat. - docker-grupp võrdub rootiga;
sudo dockerjätab jälje sudo-logisse. Rootless mode on turvalisem, kuid piiratum alternatiiv. docker run -d --name ... -p 127.0.0.1:host:container image:tagkäivitab konteineri, mis on kättesaadav ainult lokaalselt; kontrolli käsugass.docker ps,logs,exec,stop,rmon sinu igapäevased tööriistad.- Koristа image'id käsuga
docker image prune, piira konteinerite logisid (vaikimisi piiramata) ja ole säästlik käsuga--volumes.
Test (quiz)
Ülesanne
Ülesanne O9.2: Sinu esimene konteiner. Paigalda Docker Engine oma serverisse õppetunni järgi (või testmasinasse). Käivita nginx-konteiner, mis kuulab ainult aadressil 127.0.0.1:8080, kontrolli käskudega docker ps, curl -I ja ss -tlnp, vaata logisid ja koristа see seejärel ära. Vasta küsimustele: millisest allikast paigaldasid Dockeri, mida näitas ss pordi 8080 juures ja kas lisasid end docker-gruppi (miks või miks mitte)?
Ülesanne O9.2: Sinu esimene konteiner
Selle ülesande teed ise, keegi ei kontrolli seda. Märgi ära, mida tegid, ja märgi ülesanne tehtuks.
Docker'i enda allikast paigaldatuna ei uuenda unattended-upgrades seda vaikimisi; distributsiooni docker.io puhul uuendab. ss peaks näitama 127.0.0.1:8080, mitte 0.0.0.0:8080. Grupp docker annab root-õigused; sudo docker puhul jääb iga käsk sudo logisse.
Su linnukesed ja märkmed jäävad ainult sellesse brauserisse, me ei saada neid kuhugi. Kui oled sisse loginud, salvestame Minu kursustes ainult info, et tegid ülesande ära.
Loe edasi
- Dockeri dokumentatsioon, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Dockeri dokumentatsioon, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Dockeri dokumentatsioon, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Dockeri dokumentatsioon, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Dockeri dokumentatsioon, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Dockeri dokumentatsioon, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
