Docker nabízí tři běžné typy sítí – bridge používané v rámci jednoho hostitele, overlay pro komunikaci s více hostiteli a macvlan sítě, které umožňují vytvářet „klony“ fyzických rozhraní hostitelského systému a používat je k připojení kontejnerů k vaší lokální síti.
Pro příklad uvedu hostitelské rozhraní wlx001a9f95d363
– WiFi karty v režimu AP:
3: wlx001a9f95d363: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:1a:9f:95:d3:63 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.1/24 brd 192.168.1.255 scope global wlx001a9f95d363
valid_lft forever preferred_lft forever
inet6 fe80::21a:9fff:fe95:d363/64 scope link
valid_lft forever preferred_lft forever
Chcete-li vytvořit síť macvlan s názvem macvlan0
připojenou k tomuto rozhraní:
docker network create -d macvlan -o parent=wlx001a9f95d363 \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
macvlan0
…ale nedělejte to!
Přiřazení adresy
Když vytvoříte kontejner připojený k vaší síti macvlan, Docker vybere adresu z rozsahu subnetu a přiřadí ji vašemu kontejneru. Problém vznikne, pokud Docker vybere adresu, která již byla přiřazena jinému hostiteli ve vaší síti.
Tomu se můžete vyhnout rezervováním části rozsahu subnetu pro použití Dockerem při splnění dvou podmínek:
- Jakoukoli službu DHCP ve vaší síti musíte nakonfigurovat tak, aby nepřidělovala adresy v daném rozsahu.
- O tomto vyhrazeném rozsahu adres musíte Dockeru říct.
První závisí na vaší místní síťové infrastruktuře a musíte si nějak poradit sami.
Na mém hostitelském systému jsem nastavil rozsah v souboru /etc/dnsmasq.conf
interface=wlx001a9f95d363
# Dynamicky přidělovaný rozsah adres
dhcp-range=192.168.1.64,192.168.1.127,255.255.255.0,12h
# Default gateway (implicitní brána)
dhcp-option=3,192.168.1.1
# DNS servery
dhcp-option=6,8.8.8.8,8.8.4.4
# Statické IP adresy přiřazené podle MAC adres
dhcp-host=7c:7a:91:33:6e:bd,192.168.1.2
dhcp-host=74:e5:0b:54:29:aa,192.168.1.3
# Rezervovaný rozsah pro Docker macvlan (od 192.168.1.128 do 192.168.1.255)
# Tento rozsah není spravován DHCP a nebude definován v dhcp-range.
Splnění druhé podmínky ovlivníte volbou --ip-range
pro vytvoření sítě Dockeru.
Hostitelský DHCP server přiděluje adresy v rozmezí od 192.168.1.64 do 192.168.1.127. Dockeru mohu přiřadit adresy od 192.168.1.128 bez obav z možnosti konfliktů IP adres. Háček je v tom, že Docker umožňuje zadat jejich rozsah zřejmě jen pomocí „beztřídního směrování“ CIDR (Classless Inter-Domain Routing)
docker network create -d macvlan -o parent=wlx001a9f95d363 \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
--ip-range 192.168.1.192/27 \
macvlan0
- Maska podsítě /27 značí, že má 27 bitů nastavených na 1. Prvních 27 bitů v adrese je určeno pro identifikaci sítě a zbytek pro identifikaci jednotlivých zařízení (hostů) v síti.
- IP adresa 192.168.1.192 v binárním formátu je:
11000000.10101000.00000001.11000000
. - Maska podsítě /27 v binárním formátu je:
11111111.11111111.11111111.11100000
, což odpovídá 255.255.255.224 v desítkové formě.
To znamená, že tato síť může obsahovat 32 adres (25 = 32, protože zbývajících 5 bitů je určeno pro hosty). Avšak první adresa 192.168.1.192 je síťová adresa a poslední adresa 192.168.1.223 je broadcastová adresa, takže pro přidělování adres hostům je k dispozici 30 adres od 192.168.1.193 do 192.168.1.222.
Propojení hostitele s kontejnerem
S kontejnerem připojeným k síti macvlan zjistíte, že zatímco může bez problémů kontaktovat jiné systémy ve vaší místní síti, kontejner se nebude moci připojit k vašemu hostiteli a hostitel ke kontejneru. Toto je omezení rozhraní macvlan. Bez speciální podpory ze strany síťového přepínače není váš hostitel schopen posílat pakety na svá vlastní rozhraní macvlan.
Naštěstí existuje řešení tohoto problému: můžete vytvořit další rozhraní macvlan na svém hostiteli a použít ho ke komunikaci s kontejnery v síti macvlan.
Nejprve rezervuji adresu z našeho rozsahu sítí pro použití hostitelským rozhraním pomocí možnosti –aux-address k vytvoření sítě ukotvení. Díky tomu náš konečný příkazový řádek vypadá takto:
docker network create -d macvlan -o parent=wlx001a9f95d363 \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
--ip-range 192.168.1.192/27 \
--aux-address 'host=192.168.1.223' \
macvlan0
To zabrání Dockeru přiřadit tuto adresu kontejneru.
Dále vytvoříme nové rozhraní macvlan0aux typu macvlan na hostiteli:
ip link add macvlan0aux link wlx001a9f95d363 type macvlan mode bridge
Nyní musíme nakonfigurovat rozhraní s adresou, kterou jsme si rezervovali, a vyvolat ji:
ip addr add 192.168.1.223/32 dev macvlan0aux
ip link set macvlan0aux up
- /32 značí, že tato adresa patří pouze jednomu zařízení a nelze ji použít pro více zařízení v síti.
Na závěr musíme našemu hostiteli říci, aby toto rozhraní používal při komunikaci s kontejnery. To je relativně snadné, protože jsme omezili naše kontejnery na konkrétní podmnožinu CIDR místní sítě:
ip route add 192.168.1.192/27 dev macvlan0aux
S touto routou bude váš hostitel automaticky používat rozhraní macvlan0aux při komunikaci s kontejnery v síti macvlan0.
Uvedená konfigurace rozhraní a směrování není trvalá a zanikne při restartartu hostitele. Trvalé nastavení závisí na distribuci. V mém případě jsem definice přidal do souboru /etc/network/interfaces
auto macvlan0aux
iface macvlan0aux inet static
pre-up ip link add macvlan0aux link wlx001a9f95d363 type macvlan mode bridge
address 192.168.1.223
netmask 255.255.255.255
up ip route add 192.168.1.192/27 dev macvlan0aux
up ip link set macvlan0aux up
Zbývá dodat pevné nervy a hodně štěstí! Také mě to potrápilo.