2016-11-30 1 views
1

Ich habe ein benutzerdefiniertes Netzwerk (Bridge-Modus) hb1 erstellt und 2 Container hinzugefügt. Ich kann jedoch von einem externen Host in meinem Netzwerk keine Verbindung zu ihnen herstellen.Verbinden mit Container von einem Remote-Computer

Ich überprüfte und befolgte die Anweisungen here und here so genau wie ich konnte.

[email protected]:~ $ docker network inspect hb1 
[ 
    { 
     "Name": "hb1", 
     "Id": "278a4ba8bb7a4a34b25b5f5fde9a965a807ff896d5e57c2b1d7d39af60d0a046", 
     "Scope": "local", 
     "Driver": "bridge", 
     "EnableIPv6": false, 
     "IPAM": { 
      "Driver": "default", 
      "Options": {}, 
      "Config": [ 
       { 
        "Subnet": "192.168.1.32/27", 
        "Gateway": "192.168.1.33" 
       } 
      ] 
     }, 
     "Internal": false, 
     "Containers": { 
      "7dc7be3ae45813450bb7f75a6e2c7b4d93e59aa147aa7d393061748b8201381a": { 
       "Name": "modest_bohr", 
       "EndpointID": "eda20bbb52319b10911f3da6f6afadbd2167298d5a9cfd5c91f933f4b6d5fe86", 
       "MacAddress": "02:42:c0:a8:01:22", 
       "IPv4Address": "192.168.1.34/27", 
       "IPv6Address": "" 
      }, 
      "f12fbc30bcf5e37737bfe8c7868dcd40e6c632bb3672f5641ffd6960ede4f777": { 
       "Name": "infallible_torvalds", 
       "EndpointID": "92d0ecfad597485c25ad309d48c3c77b9368f25ebbd851b1168f59a795c497f2", 
       "MacAddress": "02:42:c0:a8:01:23", 
       "IPv4Address": "192.168.1.35/27", 
       "IPv6Address": "" 
      } 
     }, 
     "Options": {}, 
     "Labels": {} 
    } 
] 

Wenn ich von meinem Docker Host ping, funktioniert es wie erwartet.

[email protected]: ~$ ping -c 1 192.168.1.34 
PING 192.168.1.34 (192.168.1.34) 56(84) bytes of data. 
64 bytes from 192.168.1.34: icmp_seq=1 ttl=64 time=0.474 ms 

--- 192.168.1.34 ping statistics --- 
1 packets transmitted, 1 received, 0% packet loss, time 0ms 
rtt min/avg/max/mdev = 0.474/0.474/0.474/0.000 ms 

von einem Remote-Host kann der Container jedoch nicht erreicht werden.

[email protected]: ~$ ping -c 1 192.168.1.34 
PING 192.168.1.34 (192.168.1.34) 56(84) bytes of data. 
From 192.168.1.100 icmp_seq=1 Destination Host Unreachable 

--- 192.168.1.34 ping statistics --- 
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms 

wie soll ich das Docker Benutzer definierten Netzwerk oder meinem lokalen Netzwerk konfigurieren, so dass ich den Behälter auf einer separaten IP-Adresse acces können?

+0

192.168.0.0 ist ein privates Netzwerk. Um von einem Remote-Rechner auf Ihren Container zugreifen zu können, müssen Sie den Port Ihres Containers dem Port Ihres Servers zuordnen mit 'docker run -p port-of-server: port-of-container ...'. Dann kannst du mit der public-ip deines Servers + dem Port auf deinen Container zugreifen. – lvthillo

+0

Das ist nicht korrekt, er muss den Port nicht als seinen Container als Teil der Bridge abbilden, und er verhält sich wie eine unabhängige Maschine. –

Antwort

1

Ich antwortete heute auf eine sehr ähnliche Frage, können Sie einen Blick auf meine Antwort hier und folgen Sie ihr, es funktioniert perfekt für mich.

Assign LAN IP address to Docker container different from host's IP address

Hier ist die Antwort:

Erstellen Persistence Network Bridge

Die Bridge, ist ein Gerät (in unserem Fall virtuelles Gerät), das Netzwerk swiches ähnlich verhält (arbeitet hauptsächlich auf Netzwerkebene 2), dh es kann zwei oder mehr Netzwerkschnittstellen mit demselben lokalen Netzwerk (LAN) verbinden, wenn sie dasselbe Subnetz haben.

Sie neue Ausdauer Brücke erstellen wollen br0 (es beim Systemstart automatisch gestartet wird erhalten), fügen Sie Ihre physische Netzwerkschnittstelle hinein (in meinem Fall ist es eth0). Beachten Sie, dass nach dem Hinzufügen Ihrer Schnittstelle zur Bridge die Schnittstelle keine IP-Adresse mehr benötigt, da die Bridge die IP-Adresse erhält und anstelle Ihrer Schnittstelle verwendet werden kann, dh Sie können über die Bridge kommunizieren, als ob sie war Ihre physische Schnittstelle und es wird die eingehenden/ausgehenden Datenpakete an das richtige Ziel weiterleiten. Sie müssen der Bridge keine Hardware (MAC-Adresse) zuweisen, sie übernimmt automatisch die MAC der ersten hinzugefügten Schnittstelle.

Warnung: Es wird dringend empfohlen, diese Schritte nicht remote auszuführen, außer Sie haben physischen Zugriff auf Ihren Server! Sie könnten Ihre Verbindung zu Ihrem Server verlieren, wenn Sie nicht vorsichtig waren.

Installieren Brücken Verwaltung Dienstprogramm:

sudo apt install bridge-utils 

Das System nicht in der Lage sein, die Brücke ohne bridge-utils Paket zu erstellen.

Persistenz Brücke erstellen, bearbeiten interfaces Datei:

sudo vim /etc/network/interfaces 

Fügen Sie die follwing Konfiguration an das Ende der Datei (passen sie an Ihre Bedürfnisse anpassen):

auto br0 
iface br0 inet static 
    bridge_ports eth0 
    address 192.168.1.10 
    netmask 255.255.255.0 
    broadcast 192.168.1.255 
    gateway 192.168.1.1 

Jetzt entfernen Docker Standard Bridge Docker0, wie wir es nicht brauchen:

sudo systemctl stop docker 
sudo ip link set dev docker0 down 
sudo brctl delbr docker0 

bearbeiten Docker Dienst-Startskript Ihre Brücke (br0) anstelle von Docker-Standardbrücke (docker0), zu verwenden, und einige wichtige Brücke Parameter übergeben:

Ubuntu:

sudo vim /etc/systemd/multi-user.target.wants/docker.service 

die Datei anpassen aussehen dies:

[Service] 

ExecStart=/usr/bin/dockerd -H fd:// --bridge=br0 --fixed-cidr=192.168.1.32/27 --default-gateway=192.168.1.1 

sagen Sie nun das System über die Änderungen an der Datei:

sudo systemctl daemon-reload 

Das System neu starten:

sudo reboot 

Jetzt ist Ihre Brücke überprüfen, sollte es da sein!

ip addr 

Jetzt erstellen Sie Ihre Container wie unten, dies Ihrem Container eine feste IP führen wird zu geben:

docker run --name myContainer \ 
    -it --restart always --memory 100M \ 
    --network bridge --cap-add NET_ADMIN \ 
    --hostname client1.noureldin.local \ 
    --add-host "client1.noureldin.local client1":192.168.1.123 \ 
    mnoureldin/general-purpose:latest /bin/bash -c " \ 
    ip addr flush dev eth0; \ 
    ip addr add 192.168.1.123/24 brd + dev eth0; \ 
    ip route add default via 192.168.1.1 dev eth0; \ 
    /bin/bash" 

Der wichtigen Teil im Zusammenhang mit Ihren Netzwerkanforderungen ist:

--network bridge --cap-add NET_ADMIN \ 
    ip addr flush dev eth0; \ 
    ip addr add 192.168.1.123/24 brd + dev eth0; \ 
    ip route add default via 192.168.1.1 dev eth0; \ 

Natürlich müssen Sie sicherstellen, dass Sie iproute2 net-tools iputils-ping Pakete in Ihrem Container installiert haben, um die üblichen Netzwerkbefehle ausführen zu können die feste IP erfolgt durch ip Befehl).

Zum ersten Mal, wenn Sie die Container laufen, können Sie keine Änderungen in IP-Adresse feststellen, weil Ihr Transportwagen wahrscheinlich nicht iproute2 Paket hat (dh es nicht ip Befehl ist), intall nur die genannten Pakete und dann starte den Container neu und alles sollte genau so sein wie du willst!

Hoffe, dass hilft.

Verwandte Themen