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ářů.
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:
Automatický překlad DNS: Kontejnery ve vlastní síti se mohou navzájem oslovovat jménem kontejneru nebo aliasem. Například kontejner
webse může připojit ke kontejnerudbjednoduše pomocí hostitelského jménadb. To není možné ve standardním mostu, kde jsou vyžadovány zastaralé příznaky--linknebo ruční úprava/etc/hosts.Lepší izolace: Všechny kontejnery bez uvedení
--networkse 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.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 slotPř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.confhostitele. - 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 adresu127.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í.
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-containerNemůžete odpojit kontejner od jeho poslední sítě; vždy musí být připojen alespoň k jedné.
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 networkChcete-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
- Docker Docs. "Networking overview." https://docs.docker.com/engine/network/
- GitHub. "arnab-logs/understanding-docker-networks." https://github.com/arnab-logs/understanding-docker-networks
- Docker Docs. "Explore networking how-tos on Docker Desktop." https://docs.docker.com/desktop/features/networking/networking-how-tos/
- Docker Docs. "Network drivers." https://docs.docker.com/engine/network/drivers/
- Docker Docs (Chinese translation). "网络 | 容器教程." https://docs.dockerd.com.cn/engine/network/
- Linux Handbook. "Using Docker Compose with Host Network Configuration." https://linuxhandbook.com/docker-compose-host-network-configuration/
- Docker Docs. "Bridge network driver." https://docs.docker.com/engine/network/drivers/bridge/
- Baeldung. "How to Change the Network of a Running Docker Container?" https://www.baeldung.com/ops/docker-container-change-network
— Editorial Team
Zatím žádné komentáře.