Powrót do strony głównej

Docker Container Networking Explained: A Practical Guide

This comprehensive guide explains Docker container networking from the ground up, covering default bridge limitations, user-defined bridge advantages, key network drivers, DNS service discovery, port publishing, and practical configuration steps. It equips developers and system administrators with the knowledge to build secure, isolated, and scalable containerized applications.

Docker Networking: Complete Guide to Containers
Advertisement 728x90

Sieciowa komunikacja kontenerów Docker: praktyczny przewodnik

Sieciowa komunikacja kontenerów Docker: praktyczny przewodnik

Kiedy zaczynasz pracę z Dockerem, jednym z pierwszych wyzwań jest zrozumienie, jak kontenery komunikują się ze sobą i ze światem zewnętrznym. Sieciowa komunikacja kontenerów Docker, mówiąc najprościej, to system wirtualnych sieci i reguł zapewniających taką łączność, oferując izolację, bezpieczeństwo i możliwość podłączenia dla twoich konteneryzowanych aplikacji. Zrozumienie tych koncepcji to nie tylko teoria; to podstawa tworzenia bezpiecznych, skalowalnych i łatwych w utrzymaniu wdrożeń kontenerów.

Czego się nauczysz

Zrozumiesz podstawowe koncepcje modelu sieciowego Docker: od standardowego mostu po specjalistyczne sterowniki, a także nauczysz się konfigurować bezpieczne izolowane sieci dla swoich kontenerów. Pod koniec artykułu będziesz w stanie projektować topologie sieciowe, które izolują krytyczne usługi, zapewniają bezproblemowe wykrywanie usług i rozwiązują typowe problemy z łącznością. Kluczowy wniosek: niestandardowe sieci mostkowe znacznie przewyższają standardowy most w większości scenariuszy produkcyjnych.

Google AdInline article slot

Podstawy sieciowej komunikacji Docker

W swej istocie sieciowa komunikacja kontenerów to zdolność kontenerów do łączenia się i komunikowania ze sobą oraz z usługami sieciowymi poza Dockerem. Domyślnie kontenery mają włączoną sieć i mogą nawiązywać połączenia wychodzące. Kontener widzi interfejs sieciowy z adresem IP, bramę, tablicę routingu i usługi DNS, ale nie ma informacji o typie sieci, do której jest podłączony, ani o tym, czy jego sąsiedzi to takie same kontenery Docker.

Gdy Docker Engine uruchamia się po raz pierwszy w systemie Linux, tworzy pojedynczą wbudowaną sieć zwaną „standardowym mostem”. Jeśli uruchomisz kontener bez opcji --network, zostanie on podłączony do tego standardowego mostu. Chociaż taka konfiguracja jest funkcjonalna, ma istotne ograniczenia, z których najbardziej zauważalnym jest brak automatycznego rozpoznawania DNS między kontenerami.

Niestandardowe sieci mostkowe: lepszy wybór

W przypadku każdej poważnej aplikacji powinieneś tworzyć niestandardowe sieci mostkowe. Te niestandardowe sieci oferują kilka kluczowych zalet w porównaniu ze standardowym mostem:

Google AdInline article slot
  1. Automatyczne rozpoznawanie DNS: Kontenery w niestandardowej sieci mogą komunikować się ze sobą za pomocą nazwy kontenera lub aliasu. Na przykład kontener web może połączyć się z kontenerem db, używając po prostu nazwy hosta db. Jest to niemożliwe w standardowym moście, gdzie wymagane są przestarzałe flagi --link lub ręczna edycja pliku /etc/hosts.

  2. Lepsza izolacja: Wszystkie kontenery bez określonego --network łączą się ze standardowym mostem, co stwarza ryzyko interakcji między niepowiązanymi kontenerami. Niestandardowe sieci zapewniają ograniczony obszar sieci, izolując kontenery od siebie, chyba że są jawnie podłączone.

  3. Podłączanie i odłączanie w locie: Możesz podłączać lub odłączać działający kontener od niestandardowych sieci bez jego ponownego uruchamiania. Aby zmienić sieć kontenera w standardowym moście, należy go zatrzymać i odtworzyć.

    Google AdInline article slot
  4. Konfigurowalne mosty: Każdą niestandardową sieć można skonfigurować z własnymi parametrami (takimi jak MTU i reguły zapory), co pozwala dostosować sieci do różnych potrzeb aplikacji.

Jak utworzyć i używać niestandardowej sieci mostkowej

Tworzenie i używanie niestandardowej sieci mostkowej to prosty proces. Jest to podstawa bezpiecznej i zarządzalnej konfiguracji sieciowej Docker.

Krok 1: Utwórz sieć.

docker network create my-secure-network

Domyślnie tworzona jest sieć mostkowa. Możesz również określić sterownik za pomocą flagi -d (np. docker network create -d bridge my-net).

Krok 2: Uruchom kontenery w tej sieci.

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

Teraz kontener web może komunikować się z kontenerem db, używając nazwy hosta db.

Krok 3: Podłącz działający kontener do sieci.

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

Kontener może być podłączony do wielu sieci jednocześnie – to potężna funkcja do tworzenia złożonych wzorców sieciowych, na przykład gdy frontend jest podłączony zarówno do sieci zewnętrznej, jak i wewnętrznej sieci backendowej.

Kluczowe sterowniki sieciowe i ich zastosowanie

Sieciowa komunikacja Docker jest wtyczkowa i używa sterowników do zapewnienia podstawowej funkcjonalności. Oto zestawienie głównych sterowników, z którymi się spotkasz.

Sterownik Opis Do czego najlepiej się nadaje
bridge Standardowy sterownik sieciowy. Tworzy prywatną wewnętrzną sieć na hoście. Aplikacje jednowątkowe, gdzie kontenery muszą komunikować się ze sobą. To standardowy i najczęstszy wybór.
host Usuwa izolację sieciową. Kontener bezpośrednio używa stosu sieciowego hosta. Aplikacje krytyczne pod względem wydajności lub usługi, które muszą zarządzać dużą liczbą portów lub operacjami sieciowymi (np. ogólnosieciowy serwer DNS/DHCP, taki jak Pi-hole). Ostrzeżenie bezpieczeństwa: ten tryb usuwa kluczowy poziom izolacji.
none Wyłącza komunikację sieciową dla kontenera. Ma tylko interfejs pętli zwrotnej (lo). Wysoko izolowane zadania, takie jak przetwarzanie wsadowe w trybie offline lub zadania niewymagające dostępu do sieci.
overlay Łączy wiele demonów Docker, umożliwiając komunikację między hostami. Klastry Docker Swarm i aplikacje wielowątkowe.
macvlan Przypisuje adres MAC do kontenera, czyniąc go widocznym jako fizyczne urządzenie w twojej sieci. Starsze aplikacje lub migracja maszyn wirtualnych, gdzie kontener musi znajdować się bezpośrednio w fizycznej sieci.
ipvlan Podobny do macvlan, ale bez unikalnych adresów MAC, zapewniając pełną kontrolę nad adresacją IPv4/IPv6. Środowiska sieciowe, gdzie istnieje ograniczenie liczby przypisywanych adresów MAC.

Dla większości programistów sterownik bridge – szczególnie niestandardowy most – będzie głównym narzędziem w arsenale.

Szczegółowe zrozumienie trybu Host

Sterownik sieciowy host to potężne, ale specjalistyczne narzędzie. Usuwa on izolację sieciową między kontenerem a hostem Docker, co oznacza, że kontener bezpośrednio używa stosu sieciowego hosta. Jak zauważa jeden z praktyków, jest to idealne rozwiązanie dla usług wymagających obsługi ruchu rozgłoszeniowego, takich jak usługi DNS i DHCP.

⚠️ Ważne ostrzeżenie: Sieć hosta nie jest wieloplatformowa. Działa poprawnie tylko na hostach Linux. Na macOS i Windows (przez Docker Desktop) zachowuje się inaczej ze względu na implementację maszyny wirtualnej. Ponadto tracisz możliwość korzystania z wykrywania usług DNS Docker dla kontenera i nie możesz podłączyć go do innych sieci, gdy znajduje się w trybie hosta.

Przykład z Docker Compose:

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

Ten kontener będzie bezpośrednio dostępny pod adresem IP twojego hosta. Dyrektywa ports nie jest wymagana.

Publikowanie portów: łączenie kontenerów ze światem zewnętrznym

Domyślnie porty w sieciach mostkowych nie są dostępne z zewnątrz hosta. Aby udostępnić usługę na zewnątrz, publikujesz porty za pomocą flagi -p lub --publish.

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

To polecenie mapuje port 8080 na hoście Docker na port 80 w kontenerze. Ruch przychodzący na adres IP twojego hosta na port 8080 jest przekierowywany do kontenera.

  • Aby opublikować wszystkie otwarte porty, użyj flagi -P.
  • Aby ograniczyć dostęp tylko do lokalnego hosta, opublikuj na 127.0.0.1: docker run -p 127.0.0.1:8080:80 nginx.
  • Ważne jest, aby zauważyć, że nie musisz publikować portów do komunikacji między kontenerami w tej samej sieci mostkowej; mogą one komunikować się bezpośrednio, używając swoich nazw kontenerów i portów.

DNS i wykrywanie usług

Domyślnie kontenery dziedziczą ustawienia DNS hosta Docker. Istnieje jednak krytyczna różnica:

  • Standardowa sieć mostkowa: Kontenery otrzymują kopię pliku /etc/resolv.conf hosta.
  • Niestandardowe sieci: Kontenery używają wbudowanego serwera DNS Docker pod adresem 127.0.0.11. Ten serwer przekierowuje zewnętrzne zapytania DNS do skonfigurowanych serwerów hosta. To właśnie ten wbudowany DNS zapewnia magiczne rozpoznawanie nazw kontenerów. Jeśli aplikacja wewnątrz kontenera musi jawnie zapytać serwer DNS Docker, powinna użyć adresu 127.0.0.11.

Możesz zastąpić ustawienia DNS dla każdego kontenera za pomocą flag --dns, --dns-search i --dns-opt.

Praktyczny przepływ pracy: zmiana sieci kontenera

Zmiana konfiguracji sieciowej kontenera jest możliwa, ale istnieją ważne ograniczenia.

  1. Dla kontenera w sieci mostkowej: Możesz podłączać i odłączać go od sieci w locie.

    # Podłącz działający kontener do niestandardowej sieci
    docker network connect my-new-network my-container
    # Odłącz go od standardowego mostu
    docker network disconnect bridge my-container

    Nie możesz odłączyć kontenera od jego ostatniej sieci; zawsze musi być podłączony przynajmniej do jednej.

  2. Dla kontenera w sieci hosta: Nie można zmienić jego konfiguracji sieciowej ani podłączyć do innej sieci podczas działania. Przy próbie otrzymasz błąd:

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

    Aby zmienić jego sieć, musisz zatrzymać, usunąć i odtworzyć kontener, zachowując jego konfigurację za pomocą tych samych zmiennych środowiskowych, woluminów i innych ustawień.

Często zadawane pytania

Jaka jest różnica między standardowym mostem a niestandardową siecią mostkową? Najważniejszą różnicą jest automatyczne rozpoznawanie DNS: kontenery w niestandardowej sieci mogą komunikować się za pomocą nazwy kontenera, podczas gdy kontenery w standardowym moście mogą łączyć się ze sobą tylko za pomocą adresu IP. Niestandardowe sieci zapewniają również lepszą izolację i elastyczność podłączania/odłączania kontenerów w locie.

Jak udostępnić kontener w mojej lokalnej sieci lub internecie? Musisz opublikować porty kontenera za pomocą flagi -p lub --publish. Na przykład -p 8080:80 mapuje port 8080 na twoim hoście Docker na port 80 w kontenerze, czyniąc usługę dostępną pod adresem IP twojego hosta.

Czy mogę podłączyć kontener do wielu sieci? Tak, to potężna funkcja. Kontener może być podłączony do wielu sieci jednocześnie za pomocą wielokrotnego użycia flagi --network podczas jego tworzenia lub polecenia docker network connect dla działających kontenerów. Jest to przydatne do tworzenia aplikacji z zewnętrznymi i wewnętrznymi sieciami prywatnymi.

Dlaczego nie mogę pingować swoich kontenerów z hosta Docker? W Docker Desktop dla Mac i Windows nie możesz bezpośrednio pingować kontenerów Linux z hosta ze względu na implementację sieci wewnątrz maszyny wirtualnej. Jest to znane ograniczenie, a interfejs mostu docker0 nie jest widoczny na hoście. Jednak użytkownik Windows może pingować kontenery Windows.

Kiedy należy używać sterownika sieciowego host? Sterownika host należy używać tylko w konkretnych przypadkach, gdy kluczowa jest wydajność natywnej sieci lub usługa musi obsługiwać funkcje sieciowe (np. serwer DNS/DHCP). Osiąga się to kosztem bezpieczeństwa i przenośności, ponieważ działa on niezawodnie tylko na Linux i usuwa izolację sieciową.

Źródła

— Editorial Team

Advertisement 728x90

Czytaj dalej