Serverul meu are două interfețe de rețea, deci două IP-uri, un IP de internet și o adresă privată.
Am adăugat următorul script la /etc/iproute2/rt_tables
:
252 enp0s3
251 enp0s8
Și a adăugat următorul script la /etc/rc.local
:
IP route add default prin 172.17.171.151 dev enp0s3 table enp0s3
regulă ip add din 172.17.171.151 tabelul enp0s3
IP route add default prin 172.17.168.121 dev enp0s8 table enp0s8
regulă ip add din 172.17.168.121 tabelul enp0s8
Acum, totul a funcționat bine.
Pot da ping la aceste două ip-uri, așa că icmp a funcționat normal. De asemenea, pot SSH la server prin orice IP, așa că portul 22 funcționează bine.
Cu toate acestea, când folosesc următorul docker-compose pentru a porni un nginx, am constatat că doar portul 80 al oricăreia dintre cele 2 IP-uri poate fi accesat de browser-ul client, iar portul 80 al celuilalt IP nu răspunde.
versiunea: "3"
Servicii:
nginx:
reporniți: întotdeauna
container_name: nginx
imagine: nginx
porturi:
- 0.0.0.0:80:80
volume:
- ./log:/var/log/nginx
Ce a cauzat asta? Cum pot iesi din aceasta situatie?
Notă: Fișierul de configurare de mai sus este un mediu de testare pe care l-am construit cu o mașină virtuală, deci adresele IP sunt toate adrese private.
Pasi pentru reproducere:
- Utilizare
Oracle VM VirtualBox
pentru a porni un ubuntu 16.04 cu două interfețe de rețea bridge.
- Conectați-vă la mașina virtuală.
- Consultați scriptul de mai sus pentru a modifica
/etc/iproute2/rt_tables
și /etc/rc.local
.
- Instalați docker și docker-compose.
- Utilizați docker-compose de mai sus pentru a porni un Nginx.
- Indiferent de interfața de rețea deschisă, gazda poate accesa portul 80 al adresei IP corespunzătoare a mașinii virtuale.
- Dacă două interfețe de rețea sunt deschise în același timp, numai portul 80 al uneia dintre interfețele de rețea poate fi deschis, iar cealaltă nu are niciun răspuns.
Informatie suplimentara: Dacă pornesc Nginx direct pe mașina virtuală, portul 80 dintre cele două IP-uri poate fi accesat de mașina gazdă.