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.
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:
Automatyczne rozpoznawanie DNS: Kontenery w niestandardowej sieci mogą komunikować się ze sobą za pomocą nazwy kontenera lub aliasu. Na przykład kontener
webmoże połączyć się z konteneremdb, używając po prostu nazwy hostadb. Jest to niemożliwe w standardowym moście, gdzie wymagane są przestarzałe flagi--linklub ręczna edycja pliku/etc/hosts.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.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 slotKonfigurowalne 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.confhosta. - 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ć adresu127.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.
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-containerNie możesz odłączyć kontenera od jego ostatniej sieci; zawsze musi być podłączony przynajmniej do jednej.
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 networkAby 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
- 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
Brak komentarzy.