Skip to content
VDS · Docker a kontajnery

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á iptables píše sám a robí to pred reťazcami, ktoré spravuje ufw. Port publikovaný ako -p 8080:8080 bude dostupný z internetu, aj keď ufw ukazuje „deny“. Nespoliehaj sa na firewall — naviaž port na 127.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 :80 ná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.1 vnútri kontajnera. Potom nepomôže ani publikovanie: zvonka sa k nej nedostaneš. Nastav aplikáciu tak, aby počúvala na 0.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.