2017-03-17 6 views
-1

Networking ist nicht eine meiner Stärken, also vergib mir, wenn ich etwas hier vermisse.Wie Docker Container in benutzerdefinierten Netzwerk debuggen, die nicht auf das Internet zugreifen können

Ich benutze Centos7 als mein Host-Betriebssystem. Docker Version 17.03.0-CE, bauen 60ccb22.

I schaffen ein Netzwerk mit:

docker network create --driver=bridge --subnet=10.19.0.0/16 development

I laufen, einen Behälter unter Verwendung von:

sudo docker run -dit --name=php-nginx1 --net=development --ip=10.19.74.23 --volume /vagrant/wordpress:/var/www/wordpress --expose 80 php-nginx

Wenn ich ping 216.58.216.36 (Google) aus dem Inneren des Behälters Ergebnisse sind:

PING 216.58.216.36 (216.58.216.36) 56(84) bytes of data. From 10.19.74.23 icmp_seq=1 Destination Host Unreachable

Wenn ich den Container ohne Angabe des Netzwerkes ausführen, kann ich 216.58.216.36 ohne Probleme anpingen.

Kernel IP routing table 
Destination  Gateway   Genmask   Flags Metric Ref Use Iface 
default   10.19.0.1  0.0.0.0   UG 0  0  0 eth0 
10.19.0.0  *    255.255.0.0  U  0  0  0 eth0 

Route von dem Host:

Die Ergebnisse der ifconfig auf dem Host sind

docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 
    inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 
    inet6 fe80::42:7fff:fee2:8f4e prefixlen 64 scopeid 0x20<link> 
    ether 02:42:7f:e2:8f:4e txqueuelen 0 (Ethernet) 
    RX packets 13674 bytes 609692 (595.4 KiB) 
    RX errors 0 dropped 0 overruns 0 frame 0 
    TX packets 16644 bytes 182882110 (174.4 MiB) 
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 
    inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255 
    inet6 fe80::5054:ff:fe22:5b53 prefixlen 64 scopeid 0x20<link> 
    ether 52:54:00:22:5b:53 txqueuelen 1000 (Ethernet) 
    RX packets 322262 bytes 409758704 (390.7 MiB) 
    RX errors 0 dropped 0 overruns 0 frame 0 
    TX packets 47924 bytes 3329709 (3.1 MiB) 
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 
    inet 10.19.74.21 netmask 255.255.255.0 broadcast 10.19.74.255 
    inet6 fe80::a00:27ff:feb9:e12 prefixlen 64 scopeid 0x20<link> 
    ether 08:00:27:b9:0e:12 txqueuelen 1000 (Ethernet) 
    RX packets 2 bytes 120 (120.0 B) 
    RX errors 0 dropped 0 overruns 0 frame 0 
    TX packets 28 bytes 2016 (1.9 KiB) 
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 
    inet 127.0.0.1 netmask 255.0.0.0 
    inet6 ::1 prefixlen 128 scopeid 0x10<host> 
    loop txqueuelen 1 (Local Loopback) 
    RX packets 84 bytes 7244 (7.0 KiB) 
    RX errors 0 dropped 0 overruns 0 frame 0 
    TX packets 84 bytes 7244 (7.0 KiB) 
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 

Ifconfig den Behälter bilden, ist: in

eth0  Link encap:Ethernet HWaddr 02:42:0a:13:4a:17 
     inet addr:10.19.74.23 Bcast:0.0.0.0 Mask:255.255.0.0 
     inet6 addr: fe80::42:aff:fe13:4a17/64 Scope:Link 
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
     RX packets:16 errors:0 dropped:0 overruns:0 frame:0 
     TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 
     collisions:0 txqueuelen:0 
     RX bytes:1296 (1.2 KB) TX bytes:648 (648.0 B) 

lo  Link encap:Local Loopback 
     inet addr:127.0.0.1 Mask:255.0.0.0 
     inet6 addr: ::1/128 Scope:Host 
     UP LOOPBACK RUNNING MTU:65536 Metric:1 
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
     collisions:0 txqueuelen:1 
     RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

Strecke die countainer Ergebnisse bilden Ergebnisse in:

Kernel IP routing table 
Destination  Gateway   Genmask   Flags Metric Ref Use Iface 
default   gateway   0.0.0.0   UG 100 0  0 eth0 
10.0.2.0  0.0.0.0   255.255.255.0 U  100 0  0 eth0 
10.19.0.0  0.0.0.0   255.255.0.0  U  0  0  0 br- ca991944118f 
10.19.74.0  0.0.0.0   255.255.255.0 U  0  0  0 eth1 
link-local  0.0.0.0   255.255.0.0  U  1003 0  0 eth1 
172.17.0.0  0.0.0.0   255.255.0.0  U  0  0  0 docker0 

Ich weiß nicht, was ich mit dem Downvote machen soll. Ich habe mir andere Fragen zu Docker-Containern angeschaut, die nicht auf das Internet zugreifen können, aber sie scheinen alle damit zu tun zu haben, dass Container überhaupt nicht auf externe Adressen zugreifen können. Dieser Container kann auf das Internet zugreifen, wenn er nicht dem von mir erstellten Netzwerk zugewiesen ist, aber nicht, wenn er mit dem von mir erstellten Netzwerk verbunden ist.

Da meine Netzwerkkenntnisse begrenzt sind, habe ich Schwierigkeiten zu finden, wo ich mit der Fehlersuche beginnen soll. Eine Lösung für dieses spezielle Problem wäre großartig, aber eine Möglichkeit, dieses Problem zu beheben, wäre noch besser.

Wie kann ich dieses Problem debuggen?

+0

Ich kann an fast Null Gründe denken, warum Sie die manuelle Netzwerkkonfiguration für einen Wordpress-Container durchlaufen müssen. – user2105103

+0

Was sind die Nachteile der manuellen Netzwerkkonfiguration jetzt, dass es für mich funktioniert? Was wäre Ihre Empfehlung, dies zu gestalten, wenn Sie keine manuelle Vernetzung verwenden? –

+0

Portabilität .... – user2105103

Antwort

0

Sie versuchen anscheinend, ein Andocknetzwerk und einen Container mit demselben IP-Subnetz zu konfigurieren, das Sie auf eth1 haben. Dies führt zu Datenverkehr, der nicht ordnungsgemäß geroutet werden kann, da Linux nicht weiß, an welchen der beiden Datenverkehr gesendet werden soll. Im besten Fall (den Sie anscheinend erlebt haben) sendet es weiterhin Daten an eth1 und Ihr Container kann nicht kommunizieren. Im schlimmsten Fall können Sie über eth1 nicht mit irgendetwas reden.

Die Lösung besteht darin, Container nicht als leichte VM zu behandeln, da dies nicht der Fall ist. Drehe sie im Docker mit einem unbenutzten Subnetz hoch (Docker versucht dies automatisch mit Netzwerken zu tun, die du erstellst, wenn du es nicht anders treibst). Erlauben Sie den Containern, eine beliebige IP in diesem Netzwerk zu erhalten. Und für externe Verbindungen, die auf docker-Container zugreifen müssen, veröffentlichen Sie einen Port auf dem Docker-Host und lassen Außenstehende eine Verbindung zu diesem Port auf dem Host herstellen, um mit Ihrem Container zu sprechen.

Docker's networking user guide hat mehr Details darüber, wie Netzwerk funktioniert innerhalb von Andockfenster und Befehle zu verwenden.

+0

Danke. Das war das Problem. –

Verwandte Themen