Így kerüld el a WSL 2 és Docker network IP tartományának ütközését

Piros és sárga UTP kábel pixabay.com-ról, fotofixautomat-tól

A WSL2-ről már többször volt szó, mivel lehetőséget ad Windowson a Linuxos Docker konténerek erőforrástakarékosabb használatára. A Docker telepítésével viszont még nem végeztünk a konfigurációval, mert sajnos, hacsak nem Docker desktoppal telepíted a Dockert, a konténerek hálózata ütközhet a WSL 2-es gép aktuális hálózati beállításával. Erre ugyan nincs tökéletes megoldás egyelőre, én viszont találtam egy kerülőutat, amit most meg is osztok veled.

Tartalomjegyzék

Docker network

[Tartalom]

A Docker service elindításával automatikusan létrejönnek hálózati interfészék, amikből majd a konténerek kapják az IP címeiket. Lehet egyedi hálózatokat is definiálni egyedi IP tartománnyal akár manuálisan, akár a Docker Compose-ra bízva, de enélkül is létezik a telepítés után egy alapértelmezett hálózat, amiből azok a konténerek kapják az IP címeiket, amiknél nem rendelkeztünk másként. Akármelyik Docker networkről is beszélünk, először a "172.16.0.0/12"-es IP tartományból fog generálódni egy helyi hálózat, ami a 172.16.0.0 és 172.31.255.255 közötti IP címeket jelenti. Ha ez elfogyott, akkor rátér a "192.168.0.0/16" IP tartományra, ami a 192.168.0.0 és 192.168.255.255 közötti IP-ket foglalja magába. Ez persze nem jelenti, hogy a teljes tartomány le lesz foglalva, hanem kis szeleteket szakít ki a Docker, mint "172.17.0.1/16", majd "172.18.0.1/16", "172.19.0.1/16", ahol a második pont előtti, kivastagított rész fix az adott hálózatra csatlakozó összes konténer IP címében.

Annyira azért van okos a Docker, hogy ha véletlenül a környezetében le lenne már foglalva egy adott IP tartomány, azt nem használja fel. A konténereknek kiosztott IP címek pedig megmaradnak, amíg a konténert töröljük, de legközelebb is ugyanabból a tartományból kap egy IP címet, mint első indításakor.

WSL network

[Tartalom]

A WSL 2-es gépek hálózata hasonlóan működik azzal a különbséggel, hogy az újraindításukkal az IP címük is megváltozik a tartományon belül, de ez a kisebb probléma. A Windows újraindíításával viszont nem csak az IP változik, hanem egy teljesen új beállítással jön létre a WSL hálózati adaptere, egy teljesen új, véletlenszerű IP tartománnyal.

Ütközö IP tartományok

[Tartalom]

Ahogy említettem, a Docker elég intelligens ahhoz, hogy csak szabad IP tartományokat használjon fel. Ez azt jelenti, hogy a WSL buta? Nem. A WSL is figyelembe veszi az általa látható hálózati adaptereket, de a gépeken belüli privát hálózatokat értelemszerűen nem láthatja. Lehet tehát, hogy egy újraindítás után egy olyan, a hoszt gépről szabad IP tartományt választ, ami viszont a WSL gépen belül ütközik egy már korábban létrehozott Docker network IP tartományával.

Az ötlet

[Tartalom]

A fórumokon javasoltakkal ellentétben az nem megoldás, hogy a WSL gépen belül Linux oldalról konfigurálsz statikus IP-t a gépnek, mivel az csak a Windows újraindításáig lenne érvényes és utána úgyis lehetne újrakonfigurálni.

Órákon át gondolkodtam és összességében napokon keresztül, mire beugrott egy kerülő megoldás. Ha nem konfigurálhatjuk a WSL gép adapterét, hogy milyen IP tartományokat használhasson fel, akkor talán megmondhatjuk neki, hogy miket ne. Ahogy említettem, a WSL adapterének létrehozásakor is figyelembe lesz véve a hoszton levő többi hálózat. Kell tehát olyan adaptert létrehozni, ami lefedi a Docker által elsődlegesen használt tartományokat.

Hogy biztosra menjek, úgy döntöttem, hogy az összes 172.16.0.0 és 172.31.255.255 közötti IP-t lefedem. Ehhez a VirtualBoxot használtam, de válaszd, ami neked jobban kézreáll.

Hálózati adapter létrehozása VirtualBoxban

[Tartalom]

Az általam használt egy darab adapter létrehozása akkor elég, ha nincs az ezáltal lefedett tartományban már egy létező és megtartandó IP, ami fix Windowsról nézve és ezáltal a WSL nem tudja felhasználni. Ha mégis van ilyen IP, akkor több hálózatként kell létrehozni kisebb IP tartományokból összeállítva több adaptert.

A VirtualBox főablakát megnyitva a "CTRL+H" billentyűkombinációval meg kell nyitni a "Host Network Manager" ablakot, ami a "File" menüből is kiválasztható.

VirtualBox Host Network Manager megnyitása

Majd a "Create" gombra kell kattintani vagy a CTRL+SHIFT+C billentyűkombinációval megnyitni az adapter létrehozó ablakot.

VirtualBox adapter létrehozó ablak megnyitása

Ehhez el kell fogadni, hogy a VirtualBox változtatásokat hajtson végre. Alapból a "No", azaz "Nem" lesz kijelölve, de rá kell kattintani a "Yes" gombra.

Változtatások végrehajtásának elfogadása ablak

A VirtualBox ezzel létrehozott egy adaptert egy általa generált IP tartománnyal, ami valószínűleg "192.168"-cal kezdődik, a neve pedig "VirtualBox Host-Only Ethernet Adapter", vagy valószínűbb, hogy valamilyen sorszámot fűz még a végére egy kettőskereszt után.

Automatikusan generált új adapter beállításainak ablaka

Itt viszont már a "Properties" menüben az "Adapter" fülön az "IPv4 Address" értékét kell megváltoztatni "172.16.0.1"-re. Ez gyakorlatilag az átjáró IP címe lesz, amihez még meg kell adni az "IPv4 Network Mask" értékét is. Ennek az értéke egész számban kifejezve 12 lenne, ahogy azt korábban írtam, tehát a bináris értékében az első 12 számjegy 1-es, a maradék 20 számjegy pedig 0. A VirtualBox viszont IP cím formátumban várja a maszkot, ami "255.240.0.0". Ha más maszkra van szükséged és nem megy fejből az összes, több táblázatot is lehet találni az interneten, amik felsorolják az átalakításokat, ahogy az a "cloudaccess.net"-en is látható.

Új IP tartomány értékei

Az "Apply" gombra kattintva ismét el kell fogadni a módosításokat a felugró ablakban, de utána már látszik az adapterek listájában is az új érték. Ráadásul itt már egész számként mutatja a maszkot, tehát elírás esetén vissza lehet ellenőrizni és javítani.

Új IP tartomány értékei mentés után

Ezen a ponton már újra is indíthatod a gépet és az új IP tartomány már a "192.168"-cal kezdődő lesz a WSL gépekben.

Hálózati adapter átnevezése Windowson

[Tartalom]

Mivel ezt az adaptert lehet, hogy soha semmire nem fogod használni a hoszton, érdemes legalább valami felismerhető nevet adni neki. Bár a VirtualBoxban nem nagyon változtatható meg a név és mindig azon a néven fog látszani, mint amivel létrehozta, mint hálózati eszköz, de a Windows adapter beállításaiban azért átnevezhető.

Ehhez kattints a tálcán a jobb alsó sarokban a hálózat ikonra jobb egérgombbal, majd ott az "Open Network & Internet Settings" menüpontra.

Open Network & Internet Settings menü megnyitása

Az alábbi ablaknak kell megjelennie.

Network & Internet Settings ablak

Ahol le kell görgetni az "Advanced network settings" szekcióig.

Advanced network settings szekció

Itt a "Change adapter options" ablakban meg kell keresni a VirtualBoxban létrehozott adapter nevét.

Adapter megkeresése

Jobb egérgombbal kattintva az adapteren a "Rename" opciót választva már át is lehet nevezni az adaptert.

Rename opció a menüben

Én például megadtam a "docker-wsl-collision-fix" nevet jelezve, hogy ezzel az IP címek, illetve tartományok ütközését szerettem volna elkerülni.

Új adapter név

Végszó

[Tartalom]

Valójában a fenti megoldás sem tökéletes, hiszen előbb utóbb előfordulhat, hogy lesz annyi Docker network, hogy már a 192.168-as tartományba is belecsúszik, de ezt már talán el lehet fogadni egy ilyen speciális környezetnél. Figyelni kell arra viszont, hogy ha sok hálózatot hozol létre és törölsz egymás után, úgy tűnik, a Docker nem fogja azonnal újrahasználni a valaha létezett, de már törölt IP tartományt. Ez a Docker service újraindításával megoldható, azaz minden Windows újraindítással gyakorlatilag eltűnik ez a probléma is, ha egyáltalán előfordul.

Idővel talán lesz ennél szebb megoldás. Az is lehet, hogy már létezik, csak dokumentálatlan, mint ahogy azt a WSL esetén nem ritkán lehet tapasztalni, amiről várható még cikk a jövőben. Ha te tudsz erre szebb megoldást, kérlek, tedd feleslegessé ezt a cikket azzal, hogy megosztod mindenkivel kommentben :).

Kategóriák: 
Megosztás/Mentés