Docker. Rodzaje sieci.
Dla maszyn wirtualnych mamy różne rodzaje sieci do komunikacji ze światem czy innymi maszynami, tak i docker posiada też swoje specjalne rodzaje sieci przeznaczone dla kontenerów, które dają możliwość wymiany informacji po protokole TCP/IP, pomiędzy sobą, hostem czy internetem.
Tu możemy wyróżnić pięć a właściwie 6 rodzajów sieci:
- Bridge
- Host
- None
- MACVLAN i IPVLAN
- Overlay
Przyjrzymy się im teraz trochę bliżej. Kolejność nie jest przypadkowa ponieważ na początku listy mamy najczęściej wykorzystywane sieci a na dalej te rzadziej, w naprawdę wyjątkowych przypadkach sieciowych. Dlatego skupimy się na trzech głównych rodzajach sieci.
Warto też pamiętać, że każdy kontener zostaje przypisany do sieci, nawet jeśli tego nie ustawimy, ponieważ domyślnie każdy kontener ląduje w sieci typu bridge o nazwie default. Pozostałe rodzaje sieci musimy już jawnie zadeklarować i ustawić poprzez odpowiednie polecenia.
Wybór innego rodzaju sieci uzyskuje się poprzez jawną deklarację, przy uruchamianiu kontenera, parametru –network <rodzaj sieci>
W dokumentacji dockera możemy zauważyć określenie sterownik (driver) sieci, jednak uważam, że określenie rodzaj sieci czy typ sieci jest bardziej czytelne w naszym języku i ułatwia zrozumienie.
Bridge
Ten rodzaj sieci jest najczęściej używany w kontenerach. W tym przypadku tworzona jest oddzielna podsieć, z własną adresacja, maską i bramą (gateway). Wszystkie kontenery w tej sieci dostają wewnętrzny adres IP ze swojej puli. Kontenery mogą komunikować się pomiędzy sobą, właśnie poprzez te wewnętrzne adresy. Natomiast, aby komunikować się z zewnętrznymi sieciami, na przykład z siecią hosta dockera, to porty są przekierowywane (forwardowane) do hosta.
Domyślnie, jeśli nie zadeklarujemy inaczej, to każdy nowy kontener trafia do sieci typu bridge o nazwie bridge.

Docker używa wbudowanego serwera DNS dla swoich kontenerów więc jak najbardziej możliwa jest komunikacja po nazwach (hostnames) kontenerów. Szczególnie to jest przydatne, gdy mamy bardziej złożone aplikacje, które do swojego działania potrzebują zestawu kontenerów. Użycie nazw jest pewniejsze ponieważ adres IP jest dynamiczny i może być zmieniony po restarcie. Nazwy kontenerów najbardziej wykorzystywane są w plikach docker-compose.
Możemy tu też izolować kontenery pomiędzy sobą tworząc dodatkowe podsieci typu bridge.
docker network create mybridge docker run -d --name mynginx --network mybridge -p 8081:80 nginx
W powyższym przykładzie tworzymy nową własną podsieć bridge o nazwie mybridge i dalej uruchamiamy w tle nowy kontener mynginx podłączony do nowo utworzonej podsieci.
Host
W tym rodzaju sieci kontener z aplikacją na danym porcie jest wystawiany bezpośrednio w interfejsie naszego hosta i jest dostępny w sieci naszego hosta. Tak jak by aplikacja uruchomiona została bezpośrednio na naszym komputerze/hoście dockera. Co istotne, w przeciwieństwie do sieci typu bridge, nie będziemy mieli tu możliwości uruchomienia dwóch kontenerów, które korzystają z tego samego portu (np. nginx i port 80, gdzie zmieniamy tylko docelowy port do forwardowania). Ten rodzaj sieci działa tylko w obrębie jednego hosta.

docker run -d --network host --name mynginx nginx
W powyższym przykładzie uruchamiamy w tle nowy kontener mynginx podłączony do sieci hosta.
None
To ciekawy rodzaj sieci w której właściwie kontener nie jest podłączony do żadnej sieci. Ma na celu to izolacje takiego kontenera, tak by nie była możliwa jakakolwiek komunikacja sieciowa. Tworzony jest jedynie interfejs loopback w kontenerze po to by aplikacje widziały interfejs sieciowy.
Oczywiście jest możliwość dostania się do takiego kontenera bezpośrednio z hosta dockera, na przykład po przez polecenie exec -it

docker run -d --network none --name mynginx nginx
W powyższym przykładzie uruchamiamy w tle jest nowy kontener o nazwie myalpine na podstawie obrazu z systemem Alpine.
MACVLAN i IPVLAN
To wyjątkowy rodzaj ustawienia sieci dla kontenerów. W tym przypadku kontener dostaje swój wirtualny interfejs ze swoim adresem MAC w sieci hosta i dzięki temu jest traktowany jako równorzędne urządzenie z własnym indywidualnym adresem IP, tak jak wszystkie inne urządzenia w sieci hosta… Jest to przydatne szczególnie w przypadku starszych aplikacji czy oprogramowania monitorującego ruch bezpośrednio na interfejsie sieciowym. Pomijana jest tu warstwa sieci NAT.
Podstawowa różnica pomiędzy MACVLAN i IPVLAN polega na tym, że MACVLAN przypisuje inny adres MAC do każdego podłączonego kontenera dokera i uzyskują różne adresy IP, a IPVLAN przypisuje ten sam adres MAC wszystkim dołączonym do niego kontenerom ale dostają różne adresy IP.
Overlay
Ten rodzaj specjalnej sieci jest przeznaczony dla orkiestratora Docker Swarm i sluży do komunikacji wszystkich kontenerów w klastrze. Tak więc ta sieć jest przeznaczona do działania na wielu hostach dockera.
Docker Swarm został już wyparty poprzez Kubernetes, tak więc ten, ze swoimi siecami będzie bardziej wykorzystywany jako orkiestrator dla klastrów dla kontenerów dockera.
Na koniec, dla przypomnienia garść poleceń.
docker inspect <nazwa lub id kontenera>
– podaje szczegółowe informacje na temat kontenera,w tym jego ustawienia sieci
docker network ls
– wyświetla listę sieci dostępnych na hoście dockera
docker network inspect <nazwa sieci>
– zwraca szczegółowe informacje na temat sieci