A Docker konténerekben futtatja az alkalmazásokat: a program a futásához szükséges könyvtárakkal együtt egy képfájlban (image) érkezik, így ugyanúgy indul bármelyik Linux szerveren. Egy n8n, egy Nextcloud vagy egy saját webalkalmazás így néhány paranccsal elindítható egy Linuxos KVM VPS-en, és a rendszer többi részétől elkülönítve fut.
Ez a cikk a Docker Engine telepítését mutatja be a Docker saját tárolójából, a Buildx és a Compose bővítménnyel együtt. Utána az első lépések következnek: tesztkonténer, futtatás root nélkül, a naplók méretének korlátozása, az első valódi konténer, és egy fontos biztonsági kérdés: a Docker által megnyitott portokat a tűzfal nem zárja le. Hogy mire jó a Docker egy VPS-en, és mikor érdemes választani, a Docker használata VPS-en blogcikkünk írja le.
A lépéseket 2026 novemberében Ubuntu 26.04 és 24.04, Debian 13 és AlmaLinux 10.2 rendszeren próbáltuk ki, a Docker 29.9.3-as, a Compose 5.7.0-s és a Buildx 0.38.1-es változatával. A parancsokat egy sudo joggal rendelkező felhasználóval futtasd (lásd: Felhasználó létrehozása és sudo jog adása).
Miért a Docker saját tárolójából?
A disztribúciók saját csomagjai régebbiek, és nem mindig ugyanazt tartalmazzák:
| Rendszer | A rendszer tárolójában (2026. november) | A Docker tárolójában |
|---|---|---|
| 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 | nincs Docker, csak podman-docker |
Docker 29.9.3, Compose 5.7.0 |
- Ubuntu és Debian: a
docker.iocsomagot a disztribúció készíti, és csak a saját kiadási ritmusában frissül. Debian 13-ban két főverzióval le van maradva. A Docker dokumentációja és a legtöbb alkalmazás telepítési leírása a Docker saját csomagjaira (docker-ce) épül. - AlmaLinux (és RHEL, Rocky Linux): a Red Hat a Docker helyett a Podmant szállítja. Az AppStream tároló
podman-dockercsomagja egydockernevű parancsot ad, amely valójában a Podmant hívja meg. A legtöbb parancs így is működik, de a Podman nem a Docker démon, és a Docker Compose sem ugyanúgy fut vele. Ha egy leírás Dockert kér, telepítsd a Docker saját csomagjait. A teszten apodman-dockerés adocker-ceütközött egymással, a dnf nem engedte őket egyszerre telepíteni.
A Docker saját csomagjai a disztribúció csomagjaival ütköznek. Ha a szerveren már van régebbi, disztribúciós Docker, a telepítés előtt távolítsd el (a konténerek, képek és kötetek a /var/lib/docker mappában megmaradnak):
# 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
Ha egyik csomag sincs telepítve, a dpkg „no packages found matching”, a dnf „No match for argument” üzeneteket ír, és nem töröl semmit. Ez nem hiba.
Telepítés Ubuntura
A Docker tárolója 2026 novemberében az Ubuntu 22.04, 24.04, 26.04 és 26.10 kiadás 64 bites változatát támogatta. A tároló aláírókulcsát és a tároló leírását a Docker dokumentációja szerint vedd fel:
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
A Suites sorba a parancs a rendszer kódnevét írja (Ubuntu 26.04-en resolute, 24.04-en noble), így ugyanaz a parancs minden támogatott kiadáson működik. Ezután telepítsd a csomagokat:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Ubuntun és Debianon a docker szolgáltatás a telepítés után azonnal elindul, és a rendszerindításkor is elindul; ezt a systemctl is-active docker és a systemctl is-enabled docker parancs mutatja (active, enabled).
Telepítés Debianra
Debianon ugyanez a menet, csak a tároló címe és a kódnév más (Debian 13: trixie, Debian 12: bookworm; a Docker 2026 novemberében ezt a kettőt támogatta):
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
Hogy melyik Linux-kiadás fut a szerveren, a Linux verzió lekérdezése cikk mutatja meg.
Telepítés AlmaLinuxra
AlmaLinuxon a Docker RHEL-es tárolóját használhatod. A Docker dokumentációja a RHEL 8, 9 és 10 kiadást sorolja fel; mi AlmaLinux 10.2-n próbáltuk ki. Telepítés előtt frissítsd a rendszert, és ha új kernel érkezett, indítsd újra a gépet (az okát lent, a hibaelhárításnál olvashatod):
sudo dnf upgrade
sudo reboot
Ezután vedd fel a tárolót, és telepítsd a csomagokat:
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
Az első telepítéskor a dnf rákérdez a tároló GPG-kulcsára. Fogadd el, ha az ujjlenyomata 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35.
AlmaLinuxon a szolgáltatás a telepítés után nem indul el magától, ezt külön kell bekapcsolni:
sudo systemctl enable --now docker
A docker info kimenetének Firewall Backend: iptables+firewalld sora azt jelzi, hogy a Docker észlelte a futó firewalld-t (erről a tűzfalas részben lesz szó). A szolgáltatások kezeléséről a systemctl: szolgáltatások indítása, leállítása, újraindítása cikk ír.
Hibaelhárítás: „Extension addrtype revision 0 not supported”
A teszten a frissen telepített Docker AlmaLinux 10-en először nem indult el (Job for docker.service failed). A journalctl -u docker naplóban ez állt:
failed to add jump rules to ipv4 NAT table: ... Warning: Extension addrtype revision 0 not supported, missing kernel module?
A Docker tűzfalszabályaihoz kell az xt_addrtype kernelmodul, amely AlmaLinux 10-ben a kernel-modules-extra csomagban van. A Docker telepítésekor ezt a dnf függőségként telepíti (az iptables-nft csomag húzza be), de mindig a legújabb kernelhez. Ha a gépen még egy régebbi kernel fut, ahhoz nem kerül fel a modul. Megoldás: frissítsd a rendszert, és indítsd újra a gépet; a teszten az újraindítás után a Docker gond nélkül elindult. Ha a csomag hiányzik, telepítsd kézzel:
sudo dnf install kernel-modules-extra
sudo reboot
A telepítő szkript (get.docker.com)
A Docker egy telepítő szkriptet is kínál, amely felismeri a rendszert, felveszi a tárolót, és mindent telepít:
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --dry-run
sudo sh get-docker.sh
A --dry-run kapcsolóval a szkript csak kiírja, mit futtatna. A teszten Debian 13-on ugyanazokat a csomagokat telepítette, mint a kézi módszer, a docker-model-plugin bővítménnyel együtt, és el is indította a szolgáltatást. AlmaLinuxon a https://download.docker.com/linux/alma/docker-ce.repo tárolót venné fel.
A Docker dokumentációja szerint a szkript tesztelésre és fejlesztői gépekre való, éles szerverre nem ajánlott: nem lehet vele verziót választani, és mindig a legfrissebb (akár új főverziójú) csomagokat telepíti. Egy éles szervert telepíts a fenti kézi lépésekkel, és ne futtass le ellenőrzés nélkül internetről letöltött szkriptet rootként. A letöltött get-docker.sh fájlt futtatás előtt meg is nézheted.
Ellenőrzés: hello-world
sudo docker run --rm hello-world
A Docker letölti a hello-world képet a Docker Hubról, elindítja, és a konténer kiírja a „Hello from Docker!” üzenetet. A --rm kapcsoló a lefutott konténert utána törli.
A Compose és a Buildx bővítmény verzióját így ellenőrizheted:
docker compose version
docker buildx version
A Compose ma a docker compose (szóközzel írt) alparancs. A régi, kötőjeles docker-compose program a Docker csomagjaival nem települ.
Docker root nélkül: a docker csoport
Alapból csak a root (és a sudo) érheti el a Docker démont. Más felhasználónál a parancs így áll le:
permission denied while trying to connect to the docker API at unix:///var/run/docker.sock
Ha nem szeretnél minden parancs elé sudo-t írni, vedd fel a felhasználót a docker csoportba, majd jelentkezz ki és be (vagy nyiss új SSH-kapcsolatot), hogy a csoporttagság érvényes legyen:
sudo usermod -aG docker $USER
Az új bejelentkezés után a docker ps már sudo nélkül működik. A csoportokról a Felhasználók és csoportok listázása Linuxon cikk ír bővebben.
Figyelem: a docker csoport tagja gyakorlatilag root jogot kap. Egy konténerbe bármelyik mappát becsatolhatja, a gép teljes fájlrendszerét is. A teszten egy jelszó és sudo nélkül futtatott docker run --rm -v /:/host alpine cat /host/etc/shadow parancs kiírta a jelszó-hash-eket tartalmazó fájlt. Ezért csak olyan felhasználót vegyél fel a csoportba, akinek root jogot is adnál, és egy webalkalmazás vagy egy SFTP-felhasználó soha ne legyen a tagja.
A Docker rootless módja ennél biztonságosabb (a démon is a felhasználó nevében fut), de a dokumentáció szerint vannak korlátai, például az 1024 alatti portokon alapból nem tud figyelni. Ezt a módot ebben a cikkben nem mutatjuk be.
A naplók méretének korlátozása
A Docker alapból a json-file naplómeghajtót használja, méretkorlát nélkül: amit egy konténer a kimenetére ír, az mind egy fájlba kerül a /var/lib/docker/containers/ mappában. Egy sokat naplózó konténer így napok alatt megtöltheti a lemezt. A teszten egy folyamatosan író konténer naplója 10 másodperc alatt 1 GB-ra nőtt.
A korlátot a /etc/docker/daemon.json fájlban állítsd be (alapból nem létezik, hozd létre):
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Ezzel konténerenként legfeljebb 3 naplófájl marad, egyenként legfeljebb 10 MB-os. Mentés után indítsd újra a Dockert:
sudo systemctl restart docker
A teszten a beállítás után a sokat író konténer mappájában valóban három fájl maradt (…-json.log, .1, .2), egyenként 10 MB körül. Fontos: a beállítás csak az újonnan létrehozott konténerekre vonatkozik. A már meglévő konténereket törölni és újra létre kell hozni (Compose-zal: docker compose up -d --force-recreate). Egy elírt JSON-fájllal a Docker nem indul el (a teszten egy fölösleges vessző után: unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid JSON), ezért újraindítás után mindig ellenőrizd a systemctl status docker kimenetét. A már megnőtt naplók kiürítéséről a Docker képek, konténerek és kötetek törlése cikk ír.
Az első valódi konténer
Indíts el egy Nginx webszervert, amely a gép 8080-as portján érhető el:
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: a konténer a háttérben fut.--name web: a konténer neve; ezzel hivatkozhatsz rá (docker logs web,docker stop web).-p 127.0.0.1:8080:80: a gép 8080-as portját a konténer 80-as portjára irányítja, csak a helyi címen. Kívülről ez a port nem érhető el. Ha az előtagot elhagyod (-p 8080:80), a port minden címen, az internet felől is nyitva lesz, a tűzfaltól függetlenül (lásd a következő részt).nginx:alpine: a kép neve és címkéje (tag). A Docker letölti, ha még nincs a gépen.
A docker ps alapkimenete széles. A képen egy szűkebb, a fontos oszlopokra korlátozott változat látható:
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'
A konténer leállítása és törlése:
docker stop web
docker rm web
Több összetartozó konténert (például egy alkalmazást és az adatbázisát) kényelmesebb egy fájlban leírni: erről a Docker Compose használata cikk szól. Ha a konténereket böngészőből kezelnéd, a Portainer, Dockge és Coolify cikk segít választani, több webes alkalmazást pedig egy szerveren, közös SSL-lel az Nginx Proxy Manager szolgálhat ki.
Fontos: a közzétett portokat a tűzfal nem zárja le
A Docker a -p kapcsolóval közzétett portokat saját iptables-szabályokkal nyitja meg: a beérkező csomagot még a tűzfal szabályai előtt a konténerhez irányítja (DNAT). Így sem az ufw, sem a firewalld nem szűri ezt a forgalmat. Ezt a Docker dokumentációja is leírja, és a teszten is pontosan így történt:
- Ubuntu 26.04 és Debian 13, ufw-vel: az ufw be volt kapcsolva, és csak az SSH-t engedte (
Default: deny (incoming)). Egy sima, Docker nélkül futó webszerver a 8081-es porton kívülről elérhetetlen volt, a-p 8080:80kapcsolóval indított Nginx konténer viszont kívülről is válaszolt. - AlmaLinux 10.2, firewalld-vel: ugyanez. A firewalld
publiczónájában csak azssh, acockpités adhcpv6-clientszolgáltatás volt engedélyezve, a konténer 8080-as portja mégis elérhető volt. A firewalld szabálylánca a címfordított (DNAT) csomagokat a zónák és házirendek előtt átengedi (ct status dnat accept), ezért egy saját firewalld-házirenddel sem lehetett lezárni a portot.
Hogy egy port melyik címen figyel, a sudo ss -tlnp parancs mutatja: a 0.0.0.0:8080 és a [::]:8080 minden címet jelent, a 127.0.0.1:8080 csak a helyit (lásd: Nyitott portok listázása: ss és lsof).
1. megoldás: kösd a portot a helyi címre
A legegyszerűbb és legbiztosabb: amit nem kell közvetlenül az internetről elérni, azt kösd a 127.0.0.1 címre.
docker run -d --name web -p 127.0.0.1:8080:80 nginx:alpine
Compose-fájlban ugyanez:
ports:
- "127.0.0.1:8080:80"
A teszten így a port kívülről egyik rendszeren sem volt elérhető. A webes alkalmazásokat ezután egy reverse proxy (például az Nginx Proxy Manager vagy a gépre telepített Nginx) teszi elérhetővé a 80-as és 443-as porton, HTTPS-sel; egy adatbázist vagy egy kezelőfelületet pedig SSH-alagúton érhetsz el a saját gépedről (ssh -L 8080:127.0.0.1:8080 felhasznalo@szerver-ip).
A daemon.json fájlban az "ip": "127.0.0.1" beállítás a -p 8080:80 alakot is a helyi címre köti, de a teszten csak az alapértelmezett hálózaton (a sima docker run parancsnál). A Compose minden projektnek saját hálózatot hoz létre, és ott a "8080:80" továbbra is minden címen nyitott portot adott. Erre a beállításra tehát ne hagyatkozz; írd ki a 127.0.0.1: előtagot.
2. megoldás: szabály a DOCKER-USER láncban
Ha egy konténer portjának kívülről is elérhetőnek kell lennie, de csak bizonyos címekről, a szabályt a Docker által erre fenntartott DOCKER-USER iptables-láncba kell írni; ezt a Docker nem írja felül. Az alábbi szabály a külső hálózati csatolón (itt enp0s1, a sajátodat az ip -br a mutatja; VPS-en gyakran eth0 vagy ens3) érkező új kapcsolatokat eldobja, kivéve a 203.0.113.10 címről érkezőket. A konténerek kimenő kapcsolatai és a válaszcsomagok továbbra is átjutnak.
Ubuntu és Debian (ufw): a szabály a /etc/ufw/after.rules fájl végére kerüljön, így az ufw minden indításkor és újratöltéskor betölti:
# Docker: kívülről csak a megadott címről lehet új kapcsolatot nyitni a konténerekhez
*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
A --ctorigdstport 443 sor kivétel: a 443-as portra (például egy reverse proxy konténerre) bárhonnan lehet csatlakozni, a többi közzétett portra csak a megadott címről. Ha nincs ilyen portod, hagyd ki a sort. A teszten (Ubuntu 26.04, Debian 13) a szabály az ufw reload, a Docker újraindítása és a gép újraindítása után is megmaradt, a kivétel portja elérhető maradt, a többi közzétett port kívülről elérhetetlenné vált.
AlmaLinux (firewalld): a firewalld közvetlen (direct) szabályaival:
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
A teszten (AlmaLinux 10.2, firewalld 2.4.3) a szabály a firewall-cmd --reload és a gép újraindítása után is érvényes volt. A --reload után a Docker néhány másodpercig újraépítette a saját szabályait; ezalatt a konténerek nem voltak elérhetők. A firewalld dokumentációja a direct felületet elavultnak jelöli, ezért itt is az 1. megoldás az elsődleges.
Ezek a szabályok csak IPv4-re vonatkoznak, és a teszt is csak IPv4-en készült. Ha a szerveren IPv6 is van, a 127.0.0.1-es kötés mindkettőt lefedi, ezért ott is az az egyszerűbb út. A tűzfal alapbeállításáról a Hogyan állítsak be tűzfalat a VPS-emen? cikk ír.
Frissítés
A Docker csomagjai a rendszer többi csomagjával együtt frissülnek (sudo apt upgrade, illetve sudo dnf upgrade; lásd: Rendszerfrissítés dnf és apt paranccsal). A docker szolgáltatás frissítéskor újraindul, és vele a konténerek is: az újraindítási szabály nélkül (--restart unless-stopped, illetve Compose-ban restart: unless-stopped) indított konténerek leállva maradnak. A futó konténerek képei nem frissülnek maguktól; ehhez le kell tölteni az új képet, és újra létre kell hozni a konténert.
A Docker eltávolítása
Ubuntu és 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
Ha a telepítő szkripttel telepítetted, a docker-model-plugin csomagot is add hozzá a listához; Debianon és Ubuntun a szkript a tárolót a /etc/apt/sources.list.d/docker.list fájlba írja.
A csomagok eltávolítása nem törli a képeket, konténereket és köteteket. Ha ezekre sincs szükséged (a kötetekben lévő adatbázisokkal együtt véglegesen törlődnek):
sudo rm -rf /var/lib/docker /var/lib/containerd
A teszten eltávolítás után néhány dolog megmaradt, ezeket kézzel törölheted: a docker csoport (sudo groupdel docker), a saját /etc/docker/daemon.json, AlmaLinuxon pedig a firewalld docker zónája és docker-forwarding házirendje:
sudo firewall-cmd --permanent --delete-policy=docker-forwarding
sudo firewall-cmd --permanent --delete-zone=docker
sudo firewall-cmd --reload
Ha az ufw-hez vagy a firewalld-hez DOCKER-USER szabályt adtál, azt is vedd ki.





