9. modulis · 9.2
Docker instalēšana un Jūsu pirmais konteiners
9. modulis: Docker un docker compose · Lasīšanas laiks: 11 min.
Mācīšanās mērķis: Pēc šīs nodarbības Jūs varēsiet instalēt Docker Engine no oficiālā pakotņu avota, palaist, apskatīt, aplūkot no iekšpuses un sakopt konteinerus, kā arī zināsiet, kāpēc grupa docker ir pielīdzināma root.
Pamatjēdzieni: Docker Engine, Docker Desktop, oficiālais apt avots, Debian docker.io, grupa docker, rootless mode, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df
Kuru Docker?
Serverī Jūs instalējat Docker Engine: fona pakalpojumu (dockerd) un komandu docker. Docker Desktop ir kas cits: programma ar logiem Windows, macOS un Linux darbvirsmām. Tai serverī nav vietas.
Docker Engine ir divi pareizi avoti:
- Paša Docker pakotņu avots (
download.docker.com). Vienmēr jaunākā versija, ieskaitot spraudnidocker compose, ko Jūs izmantosiet nodarbībā 9.3. Tieši to apraksta Docker dokumentācija, un to izmanto arī šis kurss. - Debian vai Ubuntu pakotne
docker.io. Vecāka, taču distribūcija to atjaunina ar Jūsu parastajiem drošības atjauninājumiem (nodarbība 4.2). Labs risinājums, ja nevēlaties neko ārpus distribūcijas; tomēr pārbaudiet, vai ir pieejamsdocker compose(ar atstarpi).
Izvēlieties vienu. Jaukta instalēšana rada konfliktus; tāpēc Docker dokumentācija iesaka vispirms noņemt neoficiālās pakotnes, piemēram, docker.io, docker-compose un podman-docker.
Instalēšana no Docker pakotņu avota
Šie ir Docker dokumentācijas soļi Debian sistēmai, ar atsevišķu atslēgu un savu Signed-By (nodarbība 4.1). Ja vēlaties, vispirms izveidojiet momentuzņēmumu.
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.ascPēc tam avota fails /etc/apt/sources.list.d/docker.sources (deb822 formātā):
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascPie Suites norādiet Jūsu laidiena koda nosaukumu (cat /etc/os-release, nodarbība 4.3), bet pie Architectures komandas dpkg --print-architecture izvadi. Ubuntu sistēmā URL ir https://download.docker.com/linux/ubuntu, un komplekts ir, piemēram, noble.
Tad instalējiet:
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.Debian un Ubuntu sistēmās Docker pēc instalēšanas palaižas automātiski, kā arī pēc katras pārstartēšanas (systemctl status docker, nodarbība 6.1).
Ievērojiet: unattended-upgrades (nodarbība 4.2) pēc noklusējuma neatjaunina šī avota pakotnes automātiski. Iekļaujiet sudo apt update && sudo apt upgrade Docker vajadzībām savā uzturēšanas ritmā (nodarbība 10.4) vai apzināti pievienojiet šo avotu automātiskajiem atjauninājumiem.
Grupa docker ir root
Internetā visur rakstīts, ka sevi jāpievieno grupai docker, lai vairs nebūtu jāraksta sudo:
anna@web1:~$ sudo usermod -aG docker annaDariet to tikai tad, ja saprotat, ko tas nozīmē. Docker dokumentācija par to runā skaidri: grupa docker piešķir tiesības root līmenī. Ikviens, kas drīkst vadīt Docker pakalpojumu, var palaist konteineru, kurā piemontēts viss resursdatora disks:
docker run -it -v /:/host debian chroot /hostun tādējādi kļūst par root Jūsu serverī, bez paroles un bez ieraksta sudo žurnālā. Docker dokumentācija to formulē tā: Docker pakalpojumu drīkst vadīt tikai uzticami lietotāji.
Serverim, ko pārvaldāt tikai Jūs paši, tā ir izvēle: ērtība pret vēl vienu ceļu uz root. Drošāk ir vienkārši turpināt rakstīt sudo docker ...; tad katra komanda nonāk sudo žurnālā (nodarbība 3.2). Jebkurā gadījumā nekad nepievienojiet grupai lietotāju, kuram nedrīkst būt root tiesību, piemēram, vietnes pakalpojuma lietotāju.
Rootless mode
Docker var darboties arī bez root: tad pakalpojums un konteineri darbojas parasta lietotāja vārdā, ar savu user namespace. To instalē kā šis lietotājs ar dockerd-rootless-setuptool.sh install (no pakotnes docker-ce-rootless-extras; iepriekš nepieciešama pakotne uidmap). Tad ievainojamība konteinerā nedod root tiesības resursdatorā. Ir ierobežojumi, un to ir grūtāk iestatīt; šajā kursā mēs izmantojam parasto instalāciju un saglabājam drošību ar šī moduļa noteikumiem.
Pirmais īstais konteiners
Mēs palaižam nginx tīmekļa serveri konteinerā, kas pieejams tikai no paša servera:
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...Sastāvdaļas:
| Daļa | Nozīme |
|---|---|
-d | Darbība fonā (detached) |
--name proef | Nosaukums, lai nebūtu jāstrādā ar gariem ID |
-p 127.0.0.1:8080:80 | Konteinera ports 80 kļūst par resursdatora portu 8080, tikai uz loopback |
nginx:stable | Oficiālais nginx attēls, tags stable |
Pārbaude:
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 (nodarbība 5.1) apstiprina: tikai uz 127.0.0.1. Ja būtu ierakstījuši -p 8080:80, tur būtu 0.0.0.0:8080 un [::]:8080, un Jūsu konteiners būtu pieejams no interneta, pat ja ufw neatļauj portu 8080 (nodarbība 9.3). Versija Server galvenē Jums var atšķirties.
Apskate un iejaukšanās
anna@web1:~$ sudo docker logs proef # ko programma izvadīja (stdout un stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # pēdējās 20 rindas un turpināt sekot
anna@web1:~$ sudo docker exec -it proef sh # čaula darbojošā konteinerī
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef # apturēt un noņemtdocker logs ir pirmā vieta, kur skatīties, ja konteiners nedara to, ko gaidāt, tāpat kā journalctl parastiem pakalpojumiem (nodarbība 6.2). Ar docker exec Jūs ieskatāties iekšpusē, taču labāk tur neko nemainiet: izmaiņas konteinerā pazūd nākamajā atjauninājumā (nodarbība 9.1).
Sakopšana
Attēli un apturētie konteineri paliek, līdz tos sakopjat. VPS ar mazu disku tas nemanāmi uzkrājas.
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 dzēš attēlus bez nosaukuma, kas vairs nekam nepieder; ar -a arī visus attēlus, ko neizmanto neviens konteiners. Esiet piesardzīgi ar docker system prune --volumes: tas dzēš arī anonīmos sējumus (bez nosaukuma), kas tajā brīdī nepieder nevienam konteineram, un docker volume prune -a pat sējumus ar nosaukumu. Tajos var atrasties Jūsu dati. Tāpēc vienmēr piešķiriet sējumiem nosaukumu vai izmantojiet bind mount (nodarbība 9.1) un vispirms pārbaudiet ar docker volume ls.
Arī konteineru žurnāli var augt. Docker pēc noklusējuma tos glabā JSON failos bez izmēra ierobežojuma. Ierobežojumu iestata failā /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Pēc tam sudo systemctl restart docker; iestatījums attiecas tikai uz jaunizveidotiem konteineriem, esošos konteinerus izveidojiet no jauna.
Praksē
Docker WebOké VPS darbojas tāpat kā pie jebkura cita pakalpojumu sniedzēja: tā ir programmatūra Jūsu paša serverī, ko Jūs paši instalējat un atjaunināt. Mazā VPS regulāri pārbaudiet diska vietu ar docker system df un df -h (nodarbība 1.4).
Kopsavilkums
- Instalējiet Docker Engine no Docker pakotņu avota (ar savu atslēgu un
Signed-By) vaidocker.iono distribūcijas, nevis abus. - Grupa docker ir pielīdzināma root;
sudo dockeratstāj pēdas sudo žurnālā. Rootless mode ir drošāka, bet ierobežotāka alternatīva. docker run -d --name ... -p 127.0.0.1:host:container image:tagpalaiž konteineru, kas pieejams tikai lokāli; pārbaudiet arss.docker ps,logs,exec,stop,rmir Jūsu ikdienas rīki.- Sakopiet attēlus ar
docker image prune, ierobežojiet konteineru žurnālus (pēc noklusējuma neierobežoti) un esiet taupīgi ar--volumes.
Tests (quiz)
Uzdevums
Uzdevums O9.2: Jūsu pirmais konteiners. Instalējiet Docker Engine savā serverī atbilstoši nodarbībai (vai testa datorā). Palaidiet nginx konteineru, kas klausās tikai uz 127.0.0.1:8080, pārbaudiet ar docker ps, curl -I un ss -tlnp, apskatiet žurnālus un pēc tam to sakopiet. Atbildiet uz jautājumiem: no kura avota instalējāt Docker, ko ss parādīja pie porta 8080, un vai pievienojāt sevi grupai docker (kāpēc jā vai nē)?
Uzdevums O9.2: Jūsu pirmais konteiners
Šo uzdevumu veicat paši; neviens to nepārbauda. Atzīmējiet, ko esat izdarījuši, un atzīmējiet uzdevumu kā paveiktu.
Ja Docker instalēts no Docker avota, unattended-upgrades to pēc noklusējuma neatjaunina; docker.io no distribūcijas gan. ss jārāda 127.0.0.1:8080, nevis 0.0.0.0:8080. Grupa docker piešķir root tiesības; ar sudo docker katra komanda paliek sudo žurnālā.
Jūsu atzīmes un piezīmes paliek tikai šajā pārlūkprogrammā; mēs tās nekur nesūtām. Ja esat pieteikušies, sadaļā Mani kursi saglabājam tikai to, ka uzdevums ir paveikts.
Vairāk lasīt
- Docker dokumentācija, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Docker dokumentācija, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Docker dokumentācija, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Docker dokumentācija, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Docker dokumentācija, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Docker dokumentācija, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
