Docker aplikacije poganja v vsebnikih: program pride skupaj s knjižnicami, ki jih potrebuje za delovanje, v sliki (image), zato se enako zažene na katerem koli strežniku Linux. n8n, Nextcloud ali lastno spletno aplikacijo lahko tako z nekaj ukazi zaženeš na KVM VPS z Linuxom, in teče ločeno od preostalega sistema.
Ta članek predstavlja namestitev Docker Engine iz Dockerjevega repozitorija, skupaj z razširitvama Buildx in Compose. Nato sledijo prvi koraki: testni vsebnik, delovanje brez root, omejitev velikosti dnevnikov, prvi pravi vsebnik in pomembno varnostno vprašanje: vrat, ki jih odpre Docker, požarni zid ne zapre. Čemu je Docker na VPS dober in kdaj ga je smiselno izbrati, opisuje naš blogovski zapis Uporaba Dockerja na VPS.
Korake smo novembra 2026 preizkusili v sistemih Ubuntu 26.04 in 24.04, Debian 13 in AlmaLinux 10.2, z različicami Docker 29.9.3, Compose 5.7.0 in Buildx 0.38.1. Ukaze zaganjaj z uporabnikom s pravicami sudo (glej: Ustvarjanje uporabnika in dodelitev pravic sudo).
Zakaj iz Dockerjevega repozitorija?
Lastni paketi distribucij so starejši in ne vsebujejo vedno istega:
| Sistem | V sistemskem repozitoriju (november 2026) | V Dockerjevem repozitoriju |
|---|---|---|
| Ubuntu 26.04 | docker.io 29.1.3, docker-compose-v2 2.40.3 |
Docker 29.9.3, Compose 5.7.0 |
| Debian 13 | docker.io 26.1.5, docker-compose 2.26.1 |
Docker 29.9.3, Compose 5.7.0 |
| AlmaLinux 10 | ni Dockerja, le podman-docker |
Docker 29.9.3, Compose 5.7.0 |
- Ubuntu in Debian: paket
docker.iopripravlja distribucija in se posodablja le v njenem ritmu izdaj. V Debianu 13 zaostaja za dve glavni različici. Dokumentacija Dockerja in navodila za namestitev večine aplikacij temeljijo na Dockerjevih lastnih paketih (docker-ce). - AlmaLinux (in RHEL, Rocky Linux): Red Hat namesto Dockerja dobavlja Podman. Paket
podman-dockerrepozitorija AppStream ponuja ukaz z imenomdocker, ki v resnici kliče Podman. Večina ukazov tako deluje, vendar Podman ni demon Docker, tudi Docker Compose z njim ne teče enako. Če navodila zahtevajo Docker, namesti Dockerjeve lastne pakete. V preizkusu sta bilapodman-dockerindocker-cev navzkrižju, dnf ju ni dovolil namestiti hkrati.
Dockerjevi lastni paketi so v navzkrižju s paketi distribucije. Če je na strežniku že starejši Docker distribucije, ga pred namestitvijo odstrani (vsebniki, slike in nosilci v mapi /var/lib/docker ostanejo):
# Ubuntu
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)
# Debian
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-doc docker-buildx podman-docker containerd runc | cut -f1)
# AlmaLinux
sudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc
Če ni nameščen noben od paketov, dpkg izpiše sporočilo „no packages found matching”, dnf pa „No match for argument” in ne izbriše ničesar. To ni napaka.
Namestitev v Ubuntu
Dockerjev repozitorij je novembra 2026 podpiral 64-bitne različice izdaj Ubuntu 22.04, 24.04, 26.04 in 26.10. Podpisni ključ repozitorija in opis repozitorija dodaj po dokumentaciji Dockerja:
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
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
sudo apt update
V vrstico Suites ukaz zapiše kodno ime sistema (v Ubuntu 26.04 resolute, v 24.04 noble), zato isti ukaz deluje v vseh podprtih izdajah. Nato namesti pakete:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
V Ubuntuju in Debianu se storitev docker po namestitvi takoj zažene in se zažene tudi ob zagonu sistema; to pokažeta ukaza systemctl is-active docker in systemctl is-enabled docker (active, enabled).
Namestitev v Debian
V Debianu je postopek enak, le naslov repozitorija in kodno ime sta drugačna (Debian 13: trixie, Debian 12: bookworm; Docker je novembra 2026 podpiral ta dva):
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/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Katera izdaja Linuxa teče na strežniku, pokaže članek Poizvedba različice Linuxa.
Namestitev v AlmaLinux
V AlmaLinuxu lahko uporabiš Dockerjev repozitorij za RHEL. Dokumentacija Dockerja navaja izdaje RHEL 8, 9 in 10; mi smo preizkusili AlmaLinux 10.2. Pred namestitvijo posodobi sistem, in če je prišlo novo jedro, znova zaženi računalnik (razlog preberi spodaj, pri odpravljanju težav):
sudo dnf upgrade
sudo reboot
Nato dodaj repozitorij in namesti pakete:
sudo dnf install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Ob prvi namestitvi dnf vpraša za ključ GPG repozitorija. Sprejmi ga, če je njegov prstni odtis 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35.
V AlmaLinuxu se storitev po namestitvi ne zažene sama, vklopiti jo je treba posebej:
sudo systemctl enable --now docker
Vrstica Firewall Backend: iptables+firewalld v izpisu docker info pove, da je Docker zaznal tekoči firewalld (o tem bo govora v delu o požarnem zidu). O upravljanju storitev piše članek systemctl: zagon, ustavitev in ponovni zagon storitev.
Odpravljanje težav: „Extension addrtype revision 0 not supported”
V preizkusu se sveže nameščeni Docker v AlmaLinux 10 najprej ni zagnal (Job for docker.service failed). V dnevniku journalctl -u docker je pisalo:
failed to add jump rules to ipv4 NAT table: ... Warning: Extension addrtype revision 0 not supported, missing kernel module?
Za pravila požarnega zidu Docker potrebuje modul jedra xt_addrtype, ki je v AlmaLinux 10 v paketu kernel-modules-extra. Ob namestitvi Dockerja ga dnf namesti kot odvisnost (privleče ga paket iptables-nft), vendar vedno za najnovejše jedro. Če na računalniku še teče starejše jedro, modul zanj ni nameščen. Rešitev: posodobi sistem in znova zaženi računalnik; v preizkusu se je Docker po ponovnem zagonu brez težav zagnal. Če paket manjka, ga namesti ročno:
sudo dnf install kernel-modules-extra
sudo reboot
Namestitvena skripta (get.docker.com)
Docker ponuja tudi namestitveno skripto, ki prepozna sistem, doda repozitorij in vse namesti:
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --dry-run
sudo sh get-docker.sh
S stikalom --dry-run skripta le izpiše, kaj bi zagnala. V preizkusu je v Debianu 13 namestila iste pakete kot ročna metoda, skupaj z razširitvijo docker-model-plugin, in storitev tudi zagnala. V AlmaLinuxu bi dodala repozitorij https://download.docker.com/linux/alma/docker-ce.repo.
Po dokumentaciji Dockerja je skripta namenjena preizkušanju in razvojnim računalnikom, za produkcijski strežnik ni priporočljiva: z njo ni mogoče izbrati različice in vedno namesti najnovejše (tudi nove glavne različice) pakete. Produkcijski strežnik namesti z zgornjimi ročnimi koraki in z interneta prenesene skripte ne zaganjaj kot root brez preverjanja. Preneseno datoteko get-docker.sh si lahko pred zagonom tudi ogledaš.
Preverjanje: hello-world
sudo docker run --rm hello-world
Docker z Docker Huba prenese sliko hello-world, jo zažene, vsebnik pa izpiše sporočilo „Hello from Docker!”. Stikalo --rm izvedeni vsebnik nato izbriše.
Različico razširitev Compose in Buildx preveriš takole:
docker compose version
docker buildx version
Compose je danes podukaz docker compose (s presledkom). Stari program docker-compose z vezajem se z Dockerjevimi paketi ne namesti.
Docker brez root: skupina docker
Privzeto do demona Docker lahko dostopa le root (in sudo). Pri drugem uporabniku se ukaz ustavi takole:
permission denied while trying to connect to the docker API at unix:///var/run/docker.sock
Če ne želiš pred vsak ukaz pisati sudo, uporabnika dodaj v skupino docker, nato se odjavi in prijavi (ali odpri novo povezavo SSH), da članstvo v skupini začne veljati:
sudo usermod -aG docker $USER
Po novi prijavi docker ps deluje že brez sudo. Več o skupinah piše članek Izpis uporabnikov in skupin v Linuxu.
Pozor: član skupine docker praktično dobi pravice root. V vsebnik lahko priklopi katero koli mapo, tudi celoten datotečni sistem računalnika. V preizkusu je ukaz docker run --rm -v /:/host alpine cat /host/etc/shadow, zagnan brez gesla in sudo, izpisal datoteko z razpršenimi gesli. Zato v skupino dodaj le uporabnika, ki bi mu dal tudi pravice root, spletna aplikacija ali uporabnik SFTP pa naj nikoli ne bo član.
Način Docker rootless je varnejši (tudi demon teče v imenu uporabnika), vendar ima po dokumentaciji omejitve, na primer privzeto ne more poslušati na vratih pod 1024. Tega načina v tem članku ne predstavljamo.
Omejitev velikosti dnevnikov
Docker privzeto uporablja gonilnik dnevnikov json-file, brez omejitve velikosti: kar vsebnik zapiše na izhod, vse pride v datoteko v mapi /var/lib/docker/containers/. Vsebnik, ki veliko beleži, lahko tako v nekaj dneh napolni disk. V preizkusu je dnevnik vsebnika, ki je ves čas pisal, v 10 sekundah zrasel na 1 GB.
Omejitev nastavi v datoteki /etc/docker/daemon.json (privzeto ne obstaja, ustvari jo):
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
S tem na vsebnik ostanejo največ 3 dnevniške datoteke, vsaka največ 10 MB. Po shranjevanju znova zaženi Docker:
sudo systemctl restart docker
V preizkusu so po nastavitvi v mapi vsebnika, ki je veliko pisal, res ostale tri datoteke (…-json.log, .1, .2), vsaka okoli 10 MB. Pomembno: nastavitev velja le za novo ustvarjene vsebnike. Obstoječe vsebnike je treba izbrisati in znova ustvariti (s Compose: docker compose up -d --force-recreate). Z napačno zapisano datoteko JSON se Docker ne zažene (v preizkusu po odvečni vejici: unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid JSON), zato po ponovnem zagonu vedno preveri izpis systemctl status docker. O praznjenju že zraslih dnevnikov piše članek Brisanje slik, vsebnikov in nosilcev Docker.
Prvi pravi vsebnik
Zaženi spletni strežnik Nginx, dosegljiv na vratih 8080 računalnika:
docker run -d --name web -p 127.0.0.1:8080:80 nginx:alpine
docker ps
curl -sI http://127.0.0.1:8080 | head -2
-d: vsebnik teče v ozadju.--name web: ime vsebnika; z njim se sklicuješ nanj (docker logs web,docker stop web).-p 127.0.0.1:8080:80: vrata 8080 računalnika usmeri na vrata 80 vsebnika, le na lokalnem naslovu. Od zunaj ta vrata niso dosegljiva. Če predpono izpustiš (-p 8080:80), bodo vrata odprta na vseh naslovih, tudi z interneta, ne glede na požarni zid (glej naslednji del).nginx:alpine: ime in oznaka (tag) slike. Docker jo prenese, če je na računalniku še ni.
Osnovni izpis docker ps je širok. Na sliki je ožja različica, omejena na pomembne stolpce:
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'
Ustavitev in izbris vsebnika:
docker stop web
docker rm web
Več povezanih vsebnikov (na primer aplikacijo in njeno podatkovno bazo) je udobneje opisati v eni datoteki: o tem govori članek Uporaba Docker Compose. Če bi vsebnike upravljal iz brskalnika, pri izbiri pomaga članek Portainer, Dockge in Coolify, več spletnih aplikacij na enem strežniku s skupnim SSL pa lahko streže Nginx Proxy Manager.
Pomembno: objavljenih vrat požarni zid ne zapre
Docker vrata, objavljena s stikalom -p, odpre z lastnimi pravili iptables: prejeti paket še pred pravili požarnega zidu usmeri v vsebnik (DNAT). Zato tega prometa ne filtrira ne ufw ne firewalld. To opisuje tudi dokumentacija Dockerja, in v preizkusu se je zgodilo natanko tako:
- Ubuntu 26.04 in Debian 13, z ufw: ufw je bil vklopljen in je dovoljeval le SSH (
Default: deny (incoming)). Navaden spletni strežnik brez Dockerja na vratih 8081 od zunaj ni bil dosegljiv, vsebnik Nginx, zagnan s stikalom-p 8080:80, pa je odgovarjal tudi od zunaj. - AlmaLinux 10.2, s firewalld: enako. V coni
publicfirewalld so bile dovoljene le storitvessh,cockpitindhcpv6-client, vrata 8080 vsebnika pa so bila kljub temu dosegljiva. Veriga pravil firewalld pakete s prevedenim naslovom (DNAT) prepusti pred conami in pravilniki (ct status dnat accept), zato vrat ni bilo mogoče zapreti niti z lastnim pravilnikom firewalld.
Na katerem naslovu vrata poslušajo, pokaže ukaz sudo ss -tlnp: 0.0.0.0:8080 in [::]:8080 pomenita vse naslove, 127.0.0.1:8080 pa le lokalnega (glej: Izpis odprtih vrat: ss in lsof).
1. rešitev: vrata veži na lokalni naslov
Najpreprostejše in najzanesljivejše: kar ni treba dosegati neposredno z interneta, veži na naslov 127.0.0.1.
docker run -d --name web -p 127.0.0.1:8080:80 nginx:alpine
V datoteki Compose enako:
ports:
- "127.0.0.1:8080:80"
V preizkusu tako vrata od zunaj niso bila dosegljiva v nobenem sistemu. Spletne aplikacije nato na vratih 80 in 443 s HTTPS objavi obratni posredniški strežnik (na primer Nginx Proxy Manager ali Nginx, nameščen na računalnik), do podatkovne baze ali nadzorne plošče pa lahko dostopaš prek tunela SSH s svojega računalnika (ssh -L 8080:127.0.0.1:8080 felhasznalo@szerver-ip).
Nastavitev "ip": "127.0.0.1" v datoteki daemon.json na lokalni naslov veže tudi obliko -p 8080:80, vendar je v preizkusu to delovalo le v privzetem omrežju (pri navadnem ukazu docker run). Compose za vsak projekt ustvari lastno omrežje, tam pa je "8080:80" še vedno dal vrata, odprta na vseh naslovih. Na to nastavitev se torej ne zanašaj; izpiši predpono 127.0.0.1:.
2. rešitev: pravilo v verigi DOCKER-USER
Če morajo biti vrata vsebnika dosegljiva tudi od zunaj, a le z določenih naslovov, je treba pravilo zapisati v verigo iptables DOCKER-USER, ki jo Docker rezervira za to; Docker je ne prepiše. Spodnje pravilo zavrže nove povezave, ki prispejo na zunanji omrežni vmesnik (tu enp0s1, svojega pokaže ip -br a; na VPS pogosto eth0 ali ens3), razen tistih z naslova 203.0.113.10. Odhodne povezave vsebnikov in odgovorni paketi še naprej gredo skozi.
Ubuntu in Debian (ufw): pravilo naj pride na konec datoteke /etc/ufw/after.rules, tako ga ufw naloži ob vsakem zagonu in ponovnem nalaganju:
# Docker: od zunaj je novo povezavo do vsebnikov mogoče odpreti le z navedenega naslova
*filter
:DOCKER-USER - [0:0]
-A DOCKER-USER -i enp0s1 -p tcp -m conntrack --ctstate NEW --ctorigdstport 443 -j RETURN
-A DOCKER-USER -i enp0s1 -m conntrack --ctstate NEW ! -s 203.0.113.10 -j DROP
COMMIT
sudo ufw reload
sudo iptables -S DOCKER-USER
Vrstica --ctorigdstport 443 je izjema: na vrata 443 (na primer na vsebnik obratnega posredniškega strežnika) se je mogoče povezati od koder koli, na druga objavljena vrata pa le z navedenega naslova. Če takih vrat nimaš, vrstico izpusti. V preizkusu (Ubuntu 26.04, Debian 13) je pravilo ostalo tudi po ufw reload, ponovnem zagonu Dockerja in računalnika, vrata izjeme so ostala dosegljiva, druga objavljena vrata pa od zunaj niso bila več dosegljiva.
AlmaLinux (firewalld): z neposrednimi (direct) pravili firewalld:
sudo firewall-cmd --permanent --direct --add-chain ipv4 filter DOCKER-USER
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -i eth0 -m conntrack --ctstate NEW ! -s 203.0.113.10 -j DROP
sudo firewall-cmd --reload
sudo iptables -S DOCKER-USER
V preizkusu (AlmaLinux 10.2, firewalld 2.4.3) je pravilo veljalo tudi po firewall-cmd --reload in ponovnem zagonu računalnika. Po --reload je Docker nekaj sekund znova gradil svoja pravila; v tem času vsebniki niso bili dosegljivi. Dokumentacija firewalld vmesnik direct označuje kot zastarel, zato je tudi tu prednostna 1. rešitev.
Ta pravila veljajo le za IPv4, tudi preizkus je bil narejen le na IPv4. Če ima strežnik tudi IPv6, vezava na 127.0.0.1 pokrije oboje, zato je tam to preprostejša pot. O osnovni nastavitvi požarnega zidu piše članek Kako nastavim požarni zid na svojem VPS?.
Posodabljanje
Paketi Docker se posodabljajo skupaj z drugimi paketi sistema (sudo apt upgrade oziroma sudo dnf upgrade; glej: Posodabljanje sistema z ukazoma dnf in apt). Storitev docker se ob posodobitvi znova zažene, z njo pa tudi vsebniki: vsebniki, zagnani brez pravila za ponovni zagon (--restart unless-stopped oziroma v Compose restart: unless-stopped), ostanejo ustavljeni. Slike tekočih vsebnikov se ne posodobijo same; za to je treba prenesti novo sliko in vsebnik znova ustvariti.
Odstranitev Dockerja
Ubuntu in Debian:
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm /etc/apt/sources.list.d/docker.sources /etc/apt/keyrings/docker.asc
AlmaLinux:
sudo dnf remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm /etc/yum.repos.d/docker-ce.repo
Če si ga namestil z namestitveno skripto, na seznam dodaj tudi paket docker-model-plugin; v Debianu in Ubuntuju skripta repozitorij zapiše v datoteko /etc/apt/sources.list.d/docker.list.
Odstranitev paketov ne izbriše slik, vsebnikov in nosilcev. Če tudi teh ne potrebuješ (izbrišejo se trajno, skupaj s podatkovnimi bazami v nosilcih):
sudo rm -rf /var/lib/docker /var/lib/containerd
V preizkusu je po odstranitvi nekaj stvari ostalo, te lahko izbrišeš ročno: skupina docker (sudo groupdel docker), lastna datoteka /etc/docker/daemon.json, v AlmaLinuxu pa cona docker in pravilnik docker-forwarding firewalld:
sudo firewall-cmd --permanent --delete-policy=docker-forwarding
sudo firewall-cmd --permanent --delete-zone=docker
sudo firewall-cmd --reload
Če si za ufw ali firewalld dodal pravilo DOCKER-USER, odstrani tudi tega.





