Zpět na domů

Vysvětlení síťování Docker kontejnerů: Praktický průvodce

Tento komplexní průvodce vysvětluje síťování Docker kontejnerů od základů, pokrývá omezení výchozího bridge, výhody uživatelsky definovaného bridge, klíčové síťové ovladače, DNS service discovery, publikování portů a praktické konfigurační kroky. Vybavuje vývojáře a systémové administrátory znalostmi pro vytváření bezpečných, izolovaných a škálovatelných kontejnerizovaných aplikací.

Docker Networking: Kompletní průvodce kontejnery
Advertisement 728x90

Síťová komunikace Docker kontejnerů: Praktický průvodce

Síťová komunikace Docker kontejnerů: Praktický průvodce

Když začínáte pracovat s Dockerem, jednou z prvních výzev je pochopení toho, jak kontejnery komunikují mezi sebou a s vnějším světem. Síťová komunikace Docker kontejnerů, zjednodušeně řečeno, je systém virtuálních sítí a pravidel, který tuto komunikaci umožňuje, přičemž poskytuje izolaci, bezpečnost a možnost připojení pro vaše kontejnerizované aplikace. Pochopení těchto konceptů není jen teorie; je to základ pro vytváření bezpečných, škálovatelných a udržovatelných nasazení kontejnerů.

Co se dozvíte

Pochopíte základní koncepty síťového modelu Dockeru: od standardního mostu až po specializované ovladače, a také se naučíte konfigurovat bezpečné izolované sítě pro vaše kontejnery. Na konci článku budete schopni navrhovat síťové topologie, které izolují kriticky důležité služby, zajišťují bezproblémové objevování služeb a odstraňují typické problémy s připojením. Klíčový závěr: vlastní mostové sítě výrazně převyšují standardní most pro většinu produkčních scénářů.

Google AdInline article slot

Základ síťové komunikace Dockeru

Ve své podstatě je síťová komunikace kontejnerů schopnost kontejnerů připojovat se a komunikovat mezi sebou, stejně jako se síťovými službami mimo Docker. Ve výchozím nastavení mají kontejnery povolenou síť a mohou navazovat odchozí spojení. Kontejner vidí síťové rozhraní s IP adresou, bránu, směrovací tabulku a DNS služby, ale nemá informace o typu sítě, ke které je připojen, nebo o tom, zda jsou jeho sousedy stejné Docker kontejnery.

Když se Docker Engine poprvé spustí na Linuxu, vytvoří jedinou vestavěnou síť nazvanou „standardní most“. Pokud spustíte kontejner bez možnosti --network, připojí se k tomuto standardnímu mostu. I když je toto nastavení funkční, má podstatná omezení, z nichž nejvýraznější je absence automatického překladu DNS mezi kontejnery.

Vlastní mostové sítě: Lepší volba

Pro jakoukoli seriózní aplikaci byste měli vytvářet vlastní mostové sítě. Tyto vlastní sítě poskytují několik kriticky důležitých výhod oproti standardnímu mostu:

Google AdInline article slot
  1. Automatický překlad DNS: Kontejnery ve vlastní síti se mohou navzájem oslovovat jménem kontejneru nebo aliasem. Například kontejner web se může připojit ke kontejneru db jednoduše pomocí hostitelského jména db. To není možné ve standardním mostu, kde jsou vyžadovány zastaralé příznaky --link nebo ruční úprava /etc/hosts.

  2. Lepší izolace: Všechny kontejnery bez uvedení --network se připojují ke standardnímu mostu, což vytváří riziko interakce nesouvisejících kontejnerů. Vlastní sítě poskytují omezenou síťovou doménu, izolující kontejnery od sebe navzájem, pokud nejsou explicitně připojeny.

  3. Připojování a odpojování za běhu: Můžete připojit nebo odpojit běžící kontejner od vlastních sítí bez jeho restartu. Chcete-li změnit síť kontejneru ve standardním mostu, musíte jej zastavit a znovu vytvořit.

    Google AdInline article slot
  4. Přizpůsobitelné mosty: Každou vlastní síť lze nakonfigurovat s vlastními parametry (jako je MTU a pravidla firewallu), což umožňuje přizpůsobit sítě různým potřebám aplikací.

Jak vytvořit a používat vlastní mostovou síť

Vytvoření a použití vlastní mostové sítě je jednoduchý proces. Je to základ bezpečného a spravovatelného síťového nastavení Dockeru.

Krok 1: Vytvořte síť.

docker network create my-secure-network

Ve výchozím nastavení se vytvoří mostová síť. Můžete také zadat ovladač pomocí příznaku -d (např. docker network create -d bridge my-net).

Krok 2: Spusťte kontejnery v této síti.

docker run -d --name web --network my-secure-network nginx
docker run -d --name db --network my-secure-network postgres

Nyní může kontejner web komunikovat s kontejnerem db pomocí hostitelského jména db.

Krok 3: Připojte běžící kontejner k síti.

docker network connect my-secure-network already-running-container

Kontejner může být připojen k několika sítím současně – to je výkonná funkce pro vytváření složitých síťových vzorů, například když je frontend připojen jak k externí síti, tak k interní backendové síti.

Klíčové síťové ovladače a jejich použití

Síťová komunikace Dockeru je připojitelná a používá ovladače k zajištění základní funkcionality. Zde je rozpis hlavních ovladačů, se kterými se setkáte.

Ovladač Popis K čemu se nejlépe hodí
bridge Standardní síťový ovladač. Vytváří soukromou vnitřní síť na hostiteli. Jednohostitelské aplikace, kde kontejnery potřebují vzájemně komunikovat. Je to standardní a nejběžnější volba.
host Odstraňuje síťovou izolaci. Kontejner přímo používá síťový zásobník hostitele. Aplikace kritické z hlediska výkonu nebo služby, které potřebují spravovat velké množství portů nebo síťových operací (např. celosíťový DNS/DHCP server, jako je Pi-hole). Bezpečnostní varování: tento režim odstraňuje klíčovou úroveň izolace.
none Zakáže síťovou komunikaci pro kontejner. Má pouze rozhraní zpětné smyčky (lo). Vysoce izolované úlohy, jako je dávkové zpracování v offline režimu nebo úlohy, které nevyžadují síťový přístup.
overlay Spojuje několik Docker démonů dohromady a umožňuje komunikaci mezi hostiteli. Cluster Docker Swarm a vícehostitelské aplikace.
macvlan Přiřazuje MAC adresu kontejneru, čímž jej činí viditelným jako fyzické zařízení ve vaší síti. Zastaralé aplikace nebo migrace virtuálních strojů, kde kontejner musí být přímo ve fyzické síti.
ipvlan Podobný macvlan, ale bez jedinečných MAC adres, poskytující plnou kontrolu nad adresací IPv4/IPv6. Síťová prostředí, kde je omezení na počet přidělovaných MAC adres.

Pro většinu vývojářů bude ovladač bridge – zejména vlastní most – hlavním nástrojem v arzenálu.

Podrobné pochopení režimu Host

Síťový ovladač host je výkonný, ale specializovaný nástroj. Odstraňuje síťovou izolaci mezi kontejnerem a hostitelem Dockeru, což znamená, že kontejner používá síťový zásobník hostitele přímo. Jak poznamenává jeden praktik, je to ideální pro služby vyžadující zpracování broadcastového provozu, jako jsou DNS a DHCP služby.

⚠️ Důležité varování: Síť hostitele není multiplatformní. Funguje správně pouze na Linuxových hostitelích. Na macOS a Windows (přes Docker Desktop) se chová odlišně kvůli implementaci virtuálního stroje. Kromě toho ztrácíte možnost používat objevování služeb DNS Dockeru pro kontejner a nemůžete jej připojit k jiným sítím, dokud je v režimu hostitele.

Příklad s Docker Compose:

version: "3"
services:
  web:
    image: nginx:latest
    network_mode: host

Tento kontejner bude přímo dostupný na IP adrese vašeho hostitele. Direktiva ports není vyžadována.

Publikování portů: Připojení kontejnerů k vnějšímu světu

Ve výchozím nastavení nejsou porty v mostových sítích přístupné z vnějšku hostitele. Chcete-li zpřístupnit službu zvenčí, publikujete porty pomocí příznaku -p nebo --publish.

docker run -d -p 8080:80 --name webserver nginx

Tento příkaz mapuje port 8080 na hostiteli Dockeru na port 80 v kontejneru. Provoz přicházející na IP adresu vašeho hostitele na port 8080 je přesměrován do kontejneru.

  • Chcete-li publikovat všechny otevřené porty, použijte příznak -P.
  • Chcete-li omezit přístup pouze na lokální hostitele, publikujte na 127.0.0.1: docker run -p 127.0.0.1:8080:80 nginx.
  • Je důležité poznamenat, že nemusíte publikovat porty pro komunikaci kontejnerů ve stejné mostové síti; mohou komunikovat přímo pomocí svých jmen kontejnerů a portů.

DNS a objevování služeb

Ve výchozím nastavení kontejnery dědí nastavení DNS hostitele Dockeru. Existuje však kritický rozdíl:

  • Standardní mostová síť: Kontejnery obdrží kopii souboru /etc/resolv.conf hostitele.
  • Vlastní sítě: Kontejnery používají vestavěný DNS server Dockeru na adrese 127.0.0.11. Tento server přesměrovává externí DNS dotazy na nakonfigurované servery hostitele. Právě tento vestavěný DNS zajišťuje kouzelné překládání jmen kontejnerů. Pokud aplikace uvnitř kontejneru potřebuje explicitně dotazovat DNS server Dockeru, musí použít adresu 127.0.0.11.

Nastavení DNS můžete přepsat pro každý kontejner pomocí příznaků --dns, --dns-search a --dns-opt.

Praktický pracovní postup: Změna sítě kontejneru

Změnit síťovou konfiguraci kontejneru je možné, ale existují důležitá omezení.

  1. Pro kontejner v mostové síti: Můžete jej připojovat a odpojovat od sítí za běhu.

    # Připojit běžící kontejner k vlastní síti
    docker network connect my-new-network my-container
    # Odpojit jej od standardního mostu
    docker network disconnect bridge my-container

    Nemůžete odpojit kontejner od jeho poslední sítě; vždy musí být připojen alespoň k jedné.

  2. Pro kontejner v síti hostitele: Není možné změnit jeho síťovou konfiguraci nebo jej připojit k jiné síti během běhu. Při pokusu obdržíte chybu:

    Error response from daemon: container sharing network namespace with another container or host cannot be connected to any other network

    Chcete-li změnit jeho síť, musíte zastavit, odstranit a znovu vytvořit kontejner, přičemž zachováte jeho konfiguraci pomocí stejných proměnných prostředí, svazků a dalších nastavení.

Často kladené otázky

Jaký je rozdíl mezi standardním mostem a vlastní mostovou sítí? Nejdůležitější rozdíl je automatický překlad DNS: kontejnery ve vlastní síti mohou komunikovat jménem kontejneru, zatímco kontejnery ve standardním mostu se mohou navzájem oslovovat pouze IP adresou. Vlastní sítě také poskytují lepší izolaci a flexibilitu připojování/odpojování kontejnerů za běhu.

Jak zpřístupním kontejner ze své lokální sítě nebo internetu? Musíte publikovat porty kontejneru pomocí příznaku -p nebo --publish. Například -p 8080:80 mapuje port 8080 na vašem hostiteli Dockeru na port 80 v kontejneru, čímž zpřístupní službu na IP adrese vašeho hostitele.

Mohu připojit kontejner k několika sítím? Ano, to je výkonná funkce. Kontejner může být připojen k několika sítím současně pomocí opakovaného použití příznaku --network při jeho vytváření nebo příkazu docker network connect pro běžící kontejnery. To je užitečné pro vytváření aplikací s externími a interními privátními sítěmi.

Proč nemohu pingnout své kontejnery z hostitele Dockeru? V Docker Desktop pro Mac a Windows nemůžete přímo pingnout Linuxové kontejnery z hostitele kvůli implementaci sítě uvnitř virtuálního stroje. To je známé omezení a rozhraní mostu docker0 není na hostiteli viditelné. Uživatel Windows však může pingnout Windows kontejnery.

Kdy bych měl použít síťový ovladač host? Ovladač host byste měli použít pouze pro specifické případy, kdy je kritický výkon nativní sítě nebo služba potřebuje zpracovávat síťové funkce (např. DNS/DHCP server). Toho je dosaženo za cenu bezpečnosti a přenositelnosti, protože spolehlivě funguje pouze na Linuxu a odstraňuje síťovou izolaci.

Zdroje

— Editorial Team

Advertisement 728x90

Číst dál