Podstawowe informacje
W ramach tworzenia sieci komputerowych w Docker wykorzystywane są takie mechanizmy jądra Linux, jak: - cgroups - kontrolujące zasoby - namespaces - izolujące procesy - iptables - tworzenie reguł dostępu, NAT - bridge - tworzenie mostków sieciowych - veth - wirtualne interfejsy sieciowe łączące kontener i hosta - overlay networks - tworzenie wirtualnych sieci łączących kontenery na wielu hostach
Cgroups¶
Cgroups (Control Groups) to mechanizm w jądrze Linuksa pozwalający na ograniczanie i kontrolowanie zasobów (takich jak CPU, pamięć RAM, I/O) przydzielanych dla grup procesów. W przypadku Dockera, cgroups pozwala ograniczać i monitorować zasoby używane przez każdy kontener. Docker automatycznie tworzy cgroup dla każdego kontenera, co pozwala efektywnie przydzielać i monitorować zasoby.
- CPU – Docker może ograniczyć ilość CPU, np. przez ustawienie CPU shares (priorytetów) lub maksymalnego użycia procentowego dla kontenera.
- Pamięć RAM – Docker może skonfigurować limity RAM dla kontenerów, co zapobiega ich nadmiernemu obciążaniu systemu.
- I/O – kontrolowanie operacji dyskowych pozwala na ustalanie priorytetów, co może zapobiec tzw. „I/O starvation” w przypadku dużych operacji zapisu/odczytu.
Namespaces¶
Namespaces to mechanizm jądra Linuksa pozwalający na izolowanie różnych aspektów środowiska, takich jak przestrzenie nazw procesów, sieci czy systemu plików. Docker używa różnych typów namespaces, aby utworzyć odizolowane środowisko kontenerowe. Kluczowe przestrzenie nazw to:
- PID namespace – izolacja procesów, co pozwala na oddzielenie procesu kontenera od procesów hosta.
- Network namespace – izolacja stosu sieciowego. Każdy kontener może mieć swoją własną sieć i interfejsy, dzięki czemu nie interferuje bezpośrednio z siecią hosta.
- Mount namespace – izolacja systemu plików, umożliwiająca kontenerom korzystanie z własnych struktur katalogów.
- User namespace – izolacja identyfikatorów użytkowników (UID i GID), co umożliwia uruchamianie procesów kontenera jako innego użytkownika niż root na hoście.
IPTables¶
Docker używa reguł iptables, aby kontrolować ruch sieciowy i zarządzać translacją adresów (NAT). Typowa konfiguracja iptables:
- Tworzy reguły przekierowania ruchu (port forwarding), co pozwala na mapowanie portów hosta na porty kontenera.
- Stosuje NAT, aby kontenery mogły uzyskać dostęp do sieci zewnętrznej (np. internetu). Adresy IP kontenerów są tłumaczone na adres IP hosta.
Bridge¶
Docker tworzy domyślnie most sieciowy (bridge) o nazwie docker0, do którego przypisane są kontenery. Most ten działa jak switch i pozwala na komunikację między kontenerami w tej samej sieci.
Dzięki temu mechanizmowi możliwe jest tworzenie wielu takich "switch'y".
veth¶
Docker używa par wirtualnych interfejsów sieciowych (veth) do łączenia kontenerów z mostem docker0. Para veth działa jak fizyczny kabel – jeden koniec pary jest w kontenerze, a drugi w sieci hosta, co pozwala na przekazywanie pakietów między nimi.
Overlay networks¶
Docker może także używać sieci overlay, które są tworzone na poziomie Docker Swarm lub z użyciem narzędzi jak Kubernetes. Do zarządzania sieciami overlay Docker wykorzystuje VXLAN (Virtual Extensible LAN), który umożliwia łączenie kontenerów na różnych hostach w jedną wirtualną sieć.