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:9000
ich 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
docker
networking
docker-compose
dockerfile
containers
m.edmondson
quelle
quelle
164.16.240.30:9000
, der nicht auf Ihrem Computer ausgeführt wird. Ihr Browser hat Zugriff auf diese164.16.240.30:9000
Ressource, der Container jedoch nicht. Habe ich recht? Warum versuchen Sie, andere Ressourcen172.17.240.30:9000
als das Terminal zu nutzen und nicht164.16.240.30:9000
?I log in to the terminal and run
bist du im Container? und warum Sie unterschiedliche IP 172.17.240.30 vs 164.16.240.30 verwendenAntworten:
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.
quelle
wget www.google.co.uk
200. Vielleicht ist dies eine Linux-Sache, vielleicht Iptables?docker network prune
. Worauf basiert das Bild?Ihr Browser hat Zugriff auf
164.16.240.30:9000
, da er über einen Proxy (typische Unternehmensumgebung) läuft und überthe proxy
eine Netzwerkverbindung verfügt164.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 istNo route to host
.Alles muss durch den Proxy gehen. Versuchen Sie, den Proxy richtig zu konfigurieren - Linux-Apps verwenden
http_proxy,https_proxy
normalerweise 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.quelle
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?
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
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/
Eine Lösung könnte darin bestehen, die Zeile network_mode zu entfernen, und sie funktioniert wie erwartet.
quelle
Ihr Code erlaubt Ihrem Container keinen Zugriff auf
164.16.240.30:9000
. Sie sollten164.16.240.30:9000
stattdessen vom Terminal aus wget172.17.240.30:9000
.quelle