9 modulis · 9.2
Docker diegimas ir Jūsų pirmasis konteineris
9 modulis: Docker ir docker compose · Skaitymo laikas: 11 min.
Mokymosi tikslas: Po šios pamokos galėsite įdiegti Docker Engine iš oficialaus paketų šaltinio, paleisti, peržiūrėti, apžiūrėti iš vidaus ir pašalinti konteinerius, taip pat žinosite, kodėl grupė docker prilygsta root.
Pagrindinės sąvokos: Docker Engine, Docker Desktop, oficialus apt šaltinis, Debian paketas docker.io, grupė 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
Kuris Docker?
Serveryje diegiamas Docker Engine: foninė paslauga (dockerd) ir komanda docker. Docker Desktop yra kas kita: programa su langais, skirta Windows, macOS ir Linux darbalaukiams. Serveryje jai ne vieta.
Yra du tvarkingi Docker Engine šaltiniai:
- Paties Docker paketų šaltinis (
download.docker.com). Visada naujausia versija, įskaitant papildinįdocker compose, kurį naudosite 9.3 pamokoje. Būtent tai aprašo Docker dokumentacija ir tai naudojama šiame kurse. - Debian arba Ubuntu paketas
docker.io. Senesnis, bet distribucija jį atnaujina per įprastus saugumo atnaujinimus (4.2 pamoka). Puikiai tinka, jei nenorite nieko iš už distribucijos ribų; tačiau tada patikrinkite, ar yradocker compose(su tarpu).
Pasirinkite vieną. Diegiant abu kartu kyla konfliktų, todėl Docker dokumentacija nurodo pirmiausia pašalinti neoficialius paketus, tokius kaip docker.io, docker-compose ir podman-docker.
Diegimas iš Docker paketų šaltinio
Tai žingsniai iš Docker dokumentacijos, skirtos Debian, su atskiru raktu ir atskiru Signed-By (4.1 pamoka). Jei norite, pirmiausia sukurkite momentinę kopiją (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.ascTada šaltinio failas /etc/apt/sources.list.d/docker.sources (deb822 formatu):
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascPrie Suites rašomas Jūsų leidimo kodinis pavadinimas (cat /etc/os-release, 4.3 pamoka), o prie Architectures komandos dpkg --print-architecture išvestis. Ubuntu sistemoje URL yra https://download.docker.com/linux/ubuntu, o suite, pavyzdžiui, noble.
Tada diegiame:
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 ir Ubuntu sistemose Docker po įdiegimo pasileidžia savaime, taip pat po kiekvieno perkrovimo (systemctl status docker, 6.1 pamoka).
Atkreipkite dėmesį: unattended-upgrades (4.2 pamoka) pagal numatytuosius nustatymus neatnaujina šio šaltinio paketų automatiškai. Įtraukite sudo apt update && sudo apt upgrade Docker paketams į savo priežiūros ritmą (10.4 pamoka) arba sąmoningai pridėkite šį šaltinį prie automatinių atnaujinimų.
Grupė docker yra root
Internete visur rašoma, kad save reikia įtraukti į grupę docker, kad nebereikėtų rašyti sudo:
anna@web1:~$ sudo usermod -aG docker annaDarykite tai tik tada, jei suprantate, ką tai reiškia. Docker dokumentacija čia aiški: grupė docker suteikia root lygio teises. Kas gali valdyti Docker paslaugą, gali paleisti konteinerį su prijungtu visu pagrindinio kompiuterio (host) disku:
docker run -it -v /:/host debian chroot /hostir taip tampa root Jūsų serveryje, be slaptažodžio ir be įrašo sudo žurnale. Docker dokumentacija sako taip: Docker paslaugą turėtų galėti valdyti tik patikimi naudotojai.
Serveriui, kurį administruojate tik Jūs, tai yra pasirinkimas: patogumas prieš papildomą kelią į root. Saugiau tiesiog toliau rašyti sudo docker ...; tada kiekviena komanda patenka į sudo žurnalą (3.2 pamoka). Bet kuriuo atveju niekada neįtraukite į šią grupę naudotojo, kuris neturi būti root, pavyzdžiui, svetainės paslaugos naudotojo.
Rootless mode
Docker gali veikti ir be root: tada paslauga ir konteineriai veikia įprasto naudotojo teisėmis, su atskira user namespace. Jį įdiegiate kaip tas naudotojas komanda dockerd-rootless-setuptool.sh install (iš paketo docker-ce-rootless-extras; prieš tai reikia paketo uidmap). Tada spraga konteineryje nesuteikia root teisių pagrindiniame kompiuteryje. Yra apribojimų ir sąranka sudėtingesnė; šiame kurse naudojame įprastą diegimą, o saugumą užtikriname šio modulio taisyklėmis.
Pirmasis tikras konteineris
Paleidžiame nginx žiniatinklio serverį konteineryje, pasiekiamą tik iš paties serverio:
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...Sudedamosios dalys:
| Dalis | Reikšmė |
|---|---|
-d | Veikti fone (detached) |
--name proef | Pavadinimas, kad nereikėtų dirbti su ilgais ID |
-p 127.0.0.1:8080:80 | Konteinerio prievadas 80 tampa pagrindinio kompiuterio prievadu 8080, tik loopback sąsajoje |
nginx:stable | Oficialus nginx image, žyma (tag) stable |
Patikrinimas:
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 (5.1 pamoka) patvirtina: tik 127.0.0.1. Jei būtumėte įvedę -p 8080:80, būtų rodoma 0.0.0.0:8080 ir [::]:8080, o Jūsų konteineris būtų pasiekiamas iš interneto, net jei ufw neleidžia prievado 8080 (9.3 pamoka). Versija antraštėje Server Jūsų atveju gali skirtis.
Apžvalga ir įsikišimas
anna@web1:~$ sudo docker logs proef # ką programa išvedė (stdout ir stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # paskutinės 20 eilučių ir toliau sekti
anna@web1:~$ sudo docker exec -it proef sh # apvalkalas veikiančiame konteineryje
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef # sustabdyti ir pašalintidocker logs yra pirmoji vieta, kur žiūrite, kai konteineris veikia ne taip, kaip tikitės, lygiai kaip journalctl įprastoms paslaugoms (6.2 pamoka). Su docker exec galite pažiūrėti į vidų, bet geriau ten nieko nekeiskite: pakeitimai konteineryje dingsta per kitą atnaujinimą (9.1 pamoka).
Valymas
Images ir sustabdyti konteineriai lieka, kol jų nepašalinate. VPS su mažu disku tai nepastebimai kaupiasi.
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 pašalina images be pavadinimo, kurie niekam nebepriklauso; su -a taip pat visus images, kurių nenaudoja nė vienas konteineris. Būkite atsargūs su docker system prune --volumes: ji taip pat pašalina anoniminius volumes (be pavadinimo), kurie tuo metu nepriklauso jokiam konteineriui, o docker volume prune -a net volumes su pavadinimu. Juose gali būti Jūsų duomenys. Todėl visada suteikite volumes pavadinimą arba naudokite bind mount (9.1 pamoka) ir pirmiausia pasitikrinkite su docker volume ls.
Konteinerių žurnalai taip pat gali augti. Pagal numatytuosius nustatymus Docker juos saugo JSON failuose be dydžio ribos. Ribą nustatote faile /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Tada sudo systemctl restart docker; nustatymas galioja tik naujai sukurtiems konteineriams, esamus konteinerius sukurkite iš naujo.
Praktikoje
Docker WebOké VPS veikia taip pat, kaip pas bet kurį kitą teikėją: tai programinė įranga Jūsų pačių serveryje, kurią patys įdiegiate ir atnaujinate. Mažame VPS reguliariai tikrinkite disko vietą su docker system df ir df -h (1.4 pamoka).
Santrauka
- Įdiekite Docker Engine iš Docker paketų šaltinio (su atskiru raktu ir
Signed-By) arbadocker.ioiš distribucijos, bet ne abu. - Grupė docker prilygsta root;
sudo dockerpalieka pėdsaką sudo žurnale. Rootless mode yra saugesnė, bet ribotesnė alternatyva. docker run -d --name ... -p 127.0.0.1:host:container image:tagpaleidžia konteinerį, pasiekiamą tik lokaliai; patikrinkite suss.docker ps,logs,exec,stop,rmyra Jūsų kasdieniai įrankiai.- Valykite images su
docker image prune, apribokite konteinerių žurnalus (pagal numatytuosius nustatymus neriboti) ir saikingai naudokite--volumes.
Testas (quiz)
Užduotis
Užduotis O9.2: Jūsų pirmasis konteineris. Įdiekite Docker Engine savo serveryje pagal pamoką (arba bandomajame kompiuteryje). Paleiskite nginx konteinerį, kuris klauso tik 127.0.0.1:8080, patikrinkite su docker ps, curl -I ir ss -tlnp, peržiūrėkite žurnalus ir tada jį pašalinkite. Atsakykite į klausimus: iš kokio šaltinio įdiegėte Docker, ką ss parodė prie prievado 8080 ir ar įtraukėte save į grupę docker (kodėl taip arba ne)?
Užduotis O9.2: Jūsų pirmasis konteineris
Šią užduotį atliekate patys; niekas jos netikrina. Pažymėkite, ką atlikote, ir pažymėkite užduotį kaip atliktą.
Jei Docker įdiegtas iš Docker šaltinio, unattended-upgrades pagal numatytuosius nustatymus jo neatnaujina; docker.io iš distribucijos atnaujinamas. ss turėtų rodyti 127.0.0.1:8080, ne 0.0.0.0:8080. Grupė docker suteikia root teises; naudojant sudo docker kiekviena komanda lieka sudo žurnale.
Jūsų pažymėti varneliai ir pastabos lieka tik šioje naršyklėje; niekur jų nesiunčiame. Jei esate prisijungę, skiltyje Mano kursai išsaugome tik tai, kad užduotį atlikote.
Skaitykite daugiau
- Docker dokumentacija, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Docker dokumentacija, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Docker dokumentacija, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Docker dokumentacija, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Docker dokumentacija, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Docker dokumentacija, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
