Docker siete a presmerovanie portov
Ako kontajnery vidia jeden druhého, čím sa publikovanie portu líši od obyčajného EXPOSE a prečo Docker obchádza pravidlá ufw.
Aktualizované 23. augusta 2026
Polovica problémov s kontajnermi súvisí so sieťou: služba sa nedostane k databáze, port je obsadený, ovládací panel je zrazu vystavený celému internetu. Poďme si rozobrať, ako to funguje.
Tri typy sietí
- bridge — predvolená. Kontajnery dostanú interné adresy a komunikujú medzi sebou; von idú cez NAT hostiteľa.
- host — kontajner používa sieť hostiteľa priamo; publikovanie portov nie je potrebné a ani nefunguje. Rýchle, ale bez izolácie: port 80 kontajnera je portom 80 hostiteľa.
- none — žiadna sieť. Pre úlohy, ktoré ju nepotrebujú.
Vlastná sieť, ktorú vytvoríš ty alebo Compose, sa od predvolenej bridge líši v jednej dôležitej veci: funguje v nej preklad mien. Kontajner app sa dostane ku kontajneru db pod menom db.
docker network create backend
docker network ls
docker network inspect backend
V Compose sa taká sieť vytvára automaticky pre každý projekt.
Publikovanie portov
ports:
- "127.0.0.1:8080:8080" # accessible only from the machine itself
- "80:80" # accessible to the whole internet
Vľavo je port na hostiteľovi, vpravo port vnútri kontajnera. Direktíva EXPOSE v image nič nepublikuje: je to len poznámka o tom, na ktorom porte aplikácia počúva.
Pravidlo je jednoduché: publikuj len to, čo musí byť dostupné zvonku. Databáza, ovládací panel a interné API patria na 127.0.0.1 a webový server s certifikátom ich vystaví von.
Docker si pravidlá
iptablespíše sám a robí to pred reťazcami, ktoré spravujeufw. Port publikovaný ako-p 8080:8080bude dostupný z internetu, aj keďufwukazuje „deny“. Nespoliehaj sa na firewall — naviaž port na127.0.0.1.
Komunikácia medzi kontajnermi
services:
app:
networks: [frontend, backend]
db:
networks: [backend]
proxy:
networks: [frontend]
ports:
- "80:80"
- "443:443"
networks:
frontend:
backend:
Databáza je tu dostupná len pre aplikáciu a von sa tvári iba webový server. To je správne nastavenie pre akýkoľvek stack.
Vnútri kontajnera sa na suseda odkazuj jeho servisným menom: postgres://db:5432/app. Adresa localhost vnútri kontajnera znamená samotný kontajner, nie hostiteľa — druhá najčastejšia chyba hneď po latest.
Aby si sa z kontajnera dostal k službe bežiacej priamo na hostiteľovi, použi meno host.docker.internal a pridaj:
extra_hosts:
- "host.docker.internal:host-gateway"
Diagnostika
docker compose exec app ping -c2 db
docker compose exec app getent hosts db
sudo ss -tulpn | grep LISTEN
docker port <container>
ss ukáže, na ktorom rozhraní port naozaj počúva: 0.0.0.0:8080 — otvorený von, 127.0.0.1:8080 — nie.
Časté chyby
- „Port already in use“. Drží ho iný kontajner alebo služba na hostiteľovi.
sudo ss -tulpn | grep :80nájde vinníka. - Kontajnery v rôznych Compose projektoch sa nevidia. Každý projekt má vlastnú sieť. Prepoj ich explicitne cez
networks: { shared: { external: true } }. - Aplikácia počúva na
127.0.0.1vnútri kontajnera. Potom nepomôže ani publikovanie: zvonka sa k nej nedostaneš. Nastav aplikáciu tak, aby počúvala na0.0.0.0. - Šírka pásma. Na hostiteľa pripadá zdieľaných až 500 Mbps. Distribúcia súborov sa o ne delí so všetkým ostatným.