Docker pradedantiesiems: konteineriai, Compose ir ufw

Paskutinį kartą atnaujinta: 2026-10-06 · Ovanap Team, knygos „Linux nuo nulio“ autoriai (leidėjas – Ovanap, Monine AS)

Trumpas atsakymas: Docker – įrankis, kuris programą supakuoja kartu su visa jos aplinka į konteinerį ir paleidžia ją bet kuriame Linux serveryje vienodai. Ubuntu Server 26.04 LTS jį įdiegsi iš oficialios Docker saugyklos, pirmą konteinerį paleisi komanda docker run, o kelias paslaugas aprašysi viename compose.yaml faile. Svarbiausias spąstas: Docker atveriami prievadai apeina ufw ugniasienę, todėl tai, kas turi likti viduje, riški prie 127.0.0.1.

Svarbiausia

  • Oficialiai palaikomos Ubuntu versijos: 26.04, 24.04 ir 22.04 LTS. Diegimas Ubuntu išvestinėse distribucijose, pavyzdžiui, Linux Mint, oficialiai nepalaikomas, nors gali veikti (Docker dokumentacija).
  • Publikuoti prievadai apeina ufw: srautas į konteinerius nukreipiamas anksčiau, nei jį pamato ufw taisyklės (Docker dokumentacija).
  • docker grupė suteikia root lygio teises (Docker dokumentacija).
  • Compose failo vardas – compose.yaml; version: eilutė tik informacinė ir sukelia įspėjimą, kad pasenusi (Compose dokumentacija).
  • Knygoje naudota Docker Engine 29.x; dabartines diegimo eilutes laikome internetiniame priede.

Docker atrodo sudėtingas tol, kol supranti tris žodžius: atvaizdas, konteineris ir tūris. Tada visa kita – tik komandos, kurios su šiais trimis daiktais ką nors daro. Šiame straipsnyje viską darome Ubuntu Server 26.04 LTS serveryje, prisijungę per SSH vartotoju admin; serverio adresas – 203.0.113.10.

„Pas mane veikė“: kokią problemą sprendžia Docker

Programa retai gyvena viena. Jai reikia tinkamos kalbos versijos, bibliotekų, nustatymų failų – visa tai vadinama aplinka. Kai aplinka tavo serveryje kitokia nei ten, kur programa sukurta, ji nustoja veikti. Posakis „pas mane veikė“ yra ne pateisinimas, o diagnozė.

Docker sprendimas paprastas: programa keliauja kartu su savo aplinka. Įsivaizduok persikraustymą. Galima susirašyti baldų sąrašą ir naujame bute viską pirkti iš naujo. O galima paimti visą kambarį su baldais ir pernešti jį vienu gabalu. Konteineris ir yra toks pernešamas kambarys: programa, tinkamų versijų bibliotekos, nustatymai ir failai vienoje dėžėje.

Konteineris nėra virtuali mašina

Virtuali mašina – atskiras namas: savas pamatas, vandentiekis, elektra, t. y. visa operacinė sistema su savo branduoliu. Ji sveria gigabaitus ir kraunasi kaip tikras kompiuteris.

Konteineris – kambarys bendrame name. Baldai tavo, bet pamatas bendras: konteineris naudoja šeimininko serverio branduolį, kuris ir taip veikia. Iš to kyla trys praktiniai skirtumai:

Virtuali mašina Konteineris
Branduolys Savas Šeimininko serverio
Svoris Gigabaitai Dažnai šimtai megabaitų ar mažiau
Paleidimas Kaip kompiuterio įkrova Greitas – branduolys jau veikia
Kiek telpa viename serveryje Kelios Dešimtys

Viena riba kyla iš to paties modelio: Linux konteineris veikia tik ten, kur yra Linux branduolys.

Trys sąvokos: atvaizdas, konteineris, tūris

  • Atvaizdas (angl. image) – paruoštas, nekintantis paketas, iš kurio paleidžiami konteineriai. Jais dalijamasi per viešą saugyklą Docker Hub.
  • Konteineris (angl. container) – paleista atvaizdo kopija. Santykis kaip tarp recepto ir pyrago: receptas vienas, pyragų – kiek nori.
  • Tūris (angl. volume) – Docker valdoma vieta serverio diske, kur konteineris saugo duomenis, kad jie neišnyktų ištrynus konteinerį.

Taisyklė, kurią verta įsidėmėti prieš pirmą paleidimą: konteineris – laikinas, tūris – nuolatinis. Viskas, kas įrašyta konteinerio viduje be tūrio, dingsta kartu su juo.

Docker diegimas Ubuntu 26.04 serveryje

Docker diegiamas ne iš Ubuntu saugyklų, o iš oficialios Docker saugyklos. Žemiau – eilutės iš internetinio priedo, atkartojančio oficialų puslapį „Install Docker Engine on Ubuntu“ (patikrinta 2026-09-24). Prieš kopijuodamas pažiūrėk, ar priede neatsirado naujesnių.

1. Saugyklos raktas:

sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

2. Saugyklos aprašas (kopijuok visą bloką iki paskutinės eilutės EOF imtinai):

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

3. Paketai:

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

4. Patikra:

docker --version
systemctl status docker
sudo docker run hello-world

docker --version turi rodyti numerį, prasidedantį 29, systemctl status docker – active (running) (išeinama q), o hello-world konteineris išspausdina pasveikinimą, prasidedantį Hello from Docker!.

5. Darbas be sudo:

sudo usermod -aG docker admin

Narystė grupėje pradeda galioti tik atsijungus ir prisijungus iš naujo. Kol to nepadarei, docker ps atsakys pranešimu, prasidedančiu permission denied while trying to connect to the, su keliu /var/run/docker.sock. Tai ne klaida komandoje – tavo sesija tiesiog dar sena.

Svarbu. docker grupė suteikia root lygio teises. Į ją įtrauk tik tą vartotoją, kuriam duotum ir sudo.

Pirmasis konteineris: nginx per vieną komandą

docker run -d --name mano-puslapis -p 8080:80 nginx
docker ps

Pirmą eilutę verta išardyti, nes jos dalys kartosis nuolat:

  • docker run – paima atvaizdą (jei jo nėra, parsisiunčia iš Docker Hub), sukuria konteinerį ir jį paleidžia.
  • -d (detach) – konteineris dirba fone, o terminalas grįžta tau.
  • --name mano-puslapis – konteinerio vardas, kad tolesnės komandos skaitytųsi kaip sakiniai.
  • -p 8080:80 – prievadų atvaizdavimas: kas beldžiasi į serverio 8080 prievadą, perduodama konteinerio 80 prievadui. Kairėje – namo durys, dešinėje – kambario.
  • nginx – oficialaus atvaizdo vardas Docker Hub saugykloje.

Pirmą kartą pamatysi Unable to find image 'nginx:latest' locally – tai ne klaida, Docker tik praneša, kad eina atvaizdo parsisiųsti. docker ps stulpelyje PORTS matysi 0.0.0.0:8080->80/tcp: serveris klauso 8080 visais adresais. Naršyklėje atidaryk http://203.0.113.10:8080 – pamatysi „Welcome to nginx!“.

Konteinerio pranešimus parodo docker logs mano-puslapis (su -f – gyvai), sustabdo docker stop mano-puslapis, ištrina docker rm mano-puslapis. Sustabdytus, bet neištrintus konteinerius rodo docker ps -a.

Tūris: duomenys, kurie pergyvena konteinerį

Pabandyk: pakeisk puslapį konteinerio viduje, ištrink konteinerį ir paleisk naują iš to paties atvaizdo. Tavo pakeitimo nebebus – naujas konteineris gimė iš atvaizdo, kuris apie jį nieko nežino. Tūris šią problemą išsprendžia:

docker volume create puslapio-duomenys
docker run -d --name mano-puslapis -p 8080:80 -v puslapio-duomenys:/usr/share/nginx/html nginx

(Jei senasis mano-puslapis dar yra, pirmiausia docker stop mano-puslapis ir docker rm mano-puslapis.)

-v rašomas pagal tą pačią gramatiką kaip -p: kairėje – kas tavo (tūris serveryje), dešinėje – kur jis prijungiamas konteinerio viduje. Fiziškai tūris gyvena kataloge /var/lib/docker/volumes/puslapio-duomenys/_data. Dabar ištrink konteinerį ir paleisk naują su tuo pačiu tūriu – duomenys liks vietoje. Pats tūris ištrinamas tik atskira komanda docker volume rm puslapio-duomenys.

Docker Compose: kelios paslaugos viename faile

Kai docker run eilutės ilgėja, jas sunku pakartoti ir po mėnesio suprasti. Docker Compose perskaito vieną YAML failą, kuriame aprašyta visa paslaugų grupė, ir paleidžia ją viena komanda. Sukurk katalogą ~/svetaine, jame failą compose.yaml:

services:
  web:
    image: nginx
    ports:
      - "8080:80"
    volumes:
      - web-duomenys:/usr/share/nginx/html
  atmintine:
    image: redis
    volumes:
      - redis-duomenys:/data

volumes:
  web-duomenys:
  redis-duomenys:

Ir paleisk:

docker compose up -d
docker compose ps

Abi paslaugos turi rodyti Up. Konteineriai pasivadins svetaine-web-1 ir svetaine-atmintine-1: Compose prideda projekto (katalogo) vardą. docker compose down viską sustabdo ir ištrina, bet tūrių neliečia.

Dvi dažnos klaidos. Bind for 0.0.0.0:8080 failed: port is already allocated reiškia, kad 8080 prievadą jau užėmė kitas konteineris – rask jį su docker ps. O YAML faile atitraukimai turi būti daromi tarpais, ne tabuliacija.

Spąstai: Docker apeina ufw

Šie spąstai užklumpa netikėtai, nes iš pirmo žvilgsnio viskas atrodo tvarkinga. Serveryje įjungta ufw ugniasienė, 8080 prievadas joje neleistas, sudo ufw status jo nerodo – o puslapis iš interneto vis tiek atsidaro.

Priežastis oficialiai dokumentuota: Docker srautą į konteinerius nukreipia anksčiau, nei jį pamato ufw taisyklės. Todėl su -p 8080:80 atvertas prievadas pasiekiamas visam internetui, kad ir ką sakytų ufw.

Dvi praktinės taisyklės:

  1. Ar konteinerio prievadas atviras, atsako docker ps, o ne ufw status. 0.0.0.0:8080->80/tcp reiškia „visiems“.
  2. Ką turi matyti tik pats serveris, riški prie 127.0.0.1:
docker run -d --name mano-puslapis -p 127.0.0.1:8080:80 nginx

Compose faile tas pats rašomas taip: - "127.0.0.1:3000:8080". Išorėn tokią paslaugą publikuoji per nginx su HTTPS – būtent taip knygoje apsaugota AI sąsaja (plačiau – straipsnyje Ollama ir Open WebUI savo serveryje). Ugniasienės ir SSH tvarka nuo pradžių – straipsnyje Kaip saugiai paruošti VPS serverį.

Atnaujinimas ir automatinis paleidimas

Programos konteineryje nelopomos. Atnaujinimas – keturi žingsniai: docker pull nginx, docker stop, docker rm ir vėl docker run su tais pačiais parametrais ir tuo pačiu tūriu. Su Compose tai tik dvi eilutės kataloge, kuriame guli compose.yaml:

docker compose pull
docker compose up -d

Atvaizdai turi žymas (angl. tags): nginx be žymos reiškia nginx:latest, o konkreti žyma leidžia pačiam spręsti, kuri laida pas tave veikia.

Po serverio perkrovimo konteineriai, paleisti be papildomų nustatymų, lieka sustabdyti. Kad keltųsi patys, prie docker run pridėk --restart unless-stopped, o compose faile – eilutę restart: unless-stopped.

Du saugumo įpročiai

Žinok, kieno dėžę nešiesi. Docker Hub atvaizdą gali įkelti bet kas. Rinkis tuos, prie kurių parašyta Official image (jie gyvena library erdvėje, todėl vardas be gamintojo priekio), o nepažįstamo atvaizdo puslapį pirmiausia perskaityk.

Mažiausia galia pagal numatymą. docker run --privileged nuima konteineriui visas apsaugas – jis gali daryti tą patį, ką root. Panašiai vertink --network host ir -v /:/host. Pradedančiojo konteineriams nė vieno iš jų nereikia.

Kai konteinerių daugėja, seni atvaizdai tyliai ėda diską. Apžvalgą parodo docker system df, o kada saugu valyti su docker system prune (ir kodėl atsargiai su -a bei --volumes), aiškiname priedo skyrelyje apie disko vietą.

Dažni klausimai

Kuo Docker konteineris skiriasi nuo virtualios mašinos? Virtuali mašina turi visą savo operacinę sistemą su branduoliu. Konteineris naudoja šeimininko branduolį ir neša tik programą su aplinka, todėl lengvesnis ir greitesnis.

Ar Docker galima įdiegti Linux Mint sistemoje? Docker dokumentacija rašo, kad Ubuntu išvestinėse distribucijose, pavyzdžiui, Mint, diegimas oficialiai nepalaikomas, nors gali veikti. Knygoje Docker diegiamas Ubuntu Server 26.04 LTS.

Kodėl ufw neblokuoja Docker konteinerio prievado? Docker srautą nukreipia anksčiau, nei jį pamato ufw. Vidines paslaugas riški prie 127.0.0.1, pavyzdžiui, -p 127.0.0.1:8080:80.

Kodėl po serverio perkrovimo Docker konteinerio nebėra? Greičiausiai jis sustojo: docker ps -a parodys jį su būsena Exited. Naudok --restart unless-stopped arba compose faile restart: unless-stopped.

Kuo skiriasi docker-compose ir docker compose? docker-compose su brūkšneliu – senasis įrankis, docker compose – dabartinis papildinys. Failas – compose.yaml, version: eilutė nebereikalinga.

Nuo pirmo konteinerio iki savo paslaugos

Knygos „Linux nuo nulio“ 22 skyrius moko visko, ką čia perbėgai, laboratorijoje: kiekviena komanda paaiškinta prieš ją vykdant, o laikinumo taisyklę patikrini savo akimis, kol tai nieko nekainuoja. 24 skyriuje tie patys įgūdžiai virsta tavo AI pagalbininku serveryje – keli konteineriai viename compose faile, prievadai prie 127.0.0.1, nginx su HTTPS priekyje. Komandas rasi priedo komandų puslapyje, o kasdienes komandas be Docker – Linux komandų atmintinėje. Prie serverio jungtis padės straipsnis SSH raktai.

Pradėk nuo nemokamos ištraukos (registruotis nereikia), o jei patiks – įsigyk knygą.