Keine Route zum Hosting im Docker-Container


8

Ich verwende einen Debian-Docker-Container auf einem Windows 10-Computer, der auf eine bestimmte URL an Port 9000 zugreifen muss (164.16.240.30:9000 )

Der Host - Rechner darauf zugreifen kann fein über den Browser, aber wenn ich an das Terminal anmelden und laufe wget 172.17.240.30:9000ich failed: No route to host.

Um dies zu beheben, fügte ich hinzu:

ports:
  - 9000:9000

für die Datei docker-compose.yml scheint dies jedoch keinen Unterschied gemacht zu haben.

Falls Sie nicht erraten können, dass ich neu in diesem Bereich bin, was würden Sie als Nächstes versuchen?

Gesamte Datei docker-compose.yml:

version: '3.4'

services:
  tokengeneratorapi:
    network_mode: host
    image: ${DOCKER_REGISTRY}tokengeneratorapi
    build:
      context: .
      dockerfile: TokenGeneratorApi/Dockerfile
    ports:
      - 5000:80
      - 9000
    environment:
      ASPNETCORE_ENVIRONMENT: local
      SSM_PATH: /ic/env1/tokengeneratorapi/
      AWS_ACCESS_KEY_ID: 
      AWS_SECRET_ACCESS_KEY: 

Befehl, den ich ausführe:

docker-compose build --build-arg BRANCH=featuretest --build-arg CHANGE_ID=99 --build-arg CHANGE_TARGET=develop --build-arg SONAR_SERVER=164.16.240.30

Versuchen Sie, den Browser über wget zu simulieren, da stackoverflow.com/questions/43182879/using-wget-to-fake-browser Möglicherweise handelt es sich um eine Firewall, die die Verbindung trennt . Versuchen Sie auch, ufw zu deaktivieren ( wiki.debian.org/Uncomplicated%20Firewall%20%28ufw%29 ): "sudo service ufw stop", wenn es installiert und aktiviert ist.
Jannes Botis

1
Ihr Container benötigt Zugriff auf 164.16.240.30:9000, der nicht auf Ihrem Computer ausgeführt wird. Ihr Browser hat Zugriff auf diese 164.16.240.30:9000Ressource, der Container jedoch nicht. Habe ich recht? Warum versuchen Sie, andere Ressourcen 172.17.240.30:9000als das Terminal zu nutzen und nicht 164.16.240.30:9000?
Jan Garaj

Stellen Sie sicher, dass Ihre ~ / .wgetrc-Datei keine Proxy-Einträge enthält.
Gautam

Soweit ich weiß, sendet tokengeneratorapi Proxys an einen sonar_server. Ist das richtig ? Sind wir überhaupt sicher, dass Tokengeneratorapi ordnungsgemäß an Port 9000 weitergeleitet wird? Der nächste Schritt kann darin bestehen, sich in Ihrem Container anzumelden und den Sonarserver abzurufen oder zu locken: 9000. Und wenn es in Ordnung ist, zielen Sie auf Ihre tokengeneratorapi "Anwendung" wie 127.0.0.1:9000 ab und stellen Sie sicher, dass sie ordnungsgemäß weitergeleitet wird (immer noch im Container)
grodzi

Wollen Sie nicht sagen, dass Sie vom Container aus nicht auf 164.16.240.30:9000 zugreifen können? Wenn du sagst, I log in to the terminal and runbist du im Container? und warum Sie unterschiedliche IP 172.17.240.30 vs 164.16.240.30 verwenden
Vikrant Pawar

Antworten:


1

Es scheint, dass der Container Konnektivitätsprobleme aufweist, sodass Ihre vorgeschlagene Lösung wahrscheinlich nicht funktioniert, da nur ein Host-Port einem Container-Port zugeordnet wird (da Ihre Ziel-URL nicht der tatsächliche Host ist).

Überprüfen Sie https://docs.docker.com/compose/compose-file/#network_mode und versuchen Sie, es auf Host zu setzen.


Versuchte dies ohne Erfolg, siehe die aktualisierte Frage
m.edmondson


Guter Fang, ich entschuldige mich dafür! Können Sie überprüfen, ob es sich nicht um ein Firewall-Problem handelt? Die Firewall muss Verbindungen von den Docker-Containern über den Host zulassen.
Agermain

Ich bin mir nicht sicher, wie ich das machen würde, da der Host Windows 10 ist. Außerdem funktionieren Internetverbindungen zum Beispiel mit wget www.google.co.uk200. Vielleicht ist dies eine Linux-Sache, vielleicht Iptables?
m.edmondson

Stehen Sie hinter einem Firmenvertreter? Versuchen Sie es docker network prune. Worauf basiert das Bild?
Agermain

1

Ihr Browser hat Zugriff auf 164.16.240.30:9000, da er über einen Proxy (typische Unternehmensumgebung) läuft und über the proxyeine Netzwerkverbindung verfügt 164.16.240.30. Dies bedeutet nicht, dass auch Ihr Host über dieselbe Netzwerkverbindung verfügt. Eigentlich sieht es so aus, als hätte Ihr Gastgeber diesen nicht. Dies ist der Grund, warum direktes wget vom Container oder vom Terminal fehlerhaft ist No route to host.

Alles muss durch den Proxy gehen. Versuchen Sie, den Proxy richtig zu konfigurieren - Linux-Apps verwenden http_proxy,https_proxynormalerweise Umgebungsvariablen , aber Apps haben möglicherweise eine eigene Option zum Konfigurieren des Proxys. Eventuell können Sie ihn auf Quellcode-Ebene konfigurieren. Dies hängt von der verwendeten App / dem verwendeten Code ab.


1

Ich denke, das Problem ist, dass Sie den Host-Modus in Ihrer Docker-Compose-Konfigurationsdatei verwenden und die IPTABLES-Firewall für die Ports auf dem Debian-Computer zulässig ist. Wie wäre es mit Windows?

network_mode: host 

Dadurch wird die Docker-Bridge vollständig umgangen, sodass der von Ihnen angegebene Port-Abschnitt nicht angewendet wird. Alle Ports werden auf dem Hostsystem geöffnet. Sie können mit überprüfen

nestat -tunlp | grep 5000

Und Sie werden sehen, dass der Port 5000 nicht wie erwartet geöffnet und der 80 des Dockers zugeordnet ist. Die Ports 80 und 9000 sollten jedoch im Debian-Netzwerk geöffnet sein, jedoch nicht an eine Docker-Bridge nur an die Debian-IP gebunden sein.

Von hier aus: https://docs.docker.com/network/host/

WARNUNG: Veröffentlichte Ports werden im Host-Netzwerkmodus verworfen

Eine Lösung könnte darin bestehen, die Zeile network_mode zu entfernen, und sie funktioniert wie erwartet.


0

Ihr Code erlaubt Ihrem Container keinen Zugriff auf 164.16.240.30:9000. Sie sollten 164.16.240.30:9000stattdessen vom Terminal aus wget 172.17.240.30:9000.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.