web-dev-qa-db-fra.com

Aucune route vers l'hôte dans le conteneur Docker

J'exécute un conteneur docker Debian sur une machine Windows 10 qui doit accéder à une URL particulière sur le port 9000 (164.16.240.30:9000)

La machine hôte peut bien y accéder via le navigateur, mais lorsque je me connecte au terminal et que je lance wget 172.17.240.30:9000 Je reçois failed: No route to Host.

Pour tenter de résoudre ce problème, j'ai ajouté:

ports:
  - 9000:9000

dans le fichier docker-compose.yml, mais cela ne semble pas avoir fait de différence.

Au cas où vous ne pourriez pas deviner que je suis nouveau dans ce domaine, qu'essaieriez-vous ensuite?

Fichier docker-compose.yml entier:

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: 

Commande que j'exécute:

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
8
m.edmondson

Il semble que ce soit le conteneur ayant des problèmes de connectivité, de sorte que la solution proposée ne fonctionnera probablement pas, car cela ne fait que mapper un port hôte sur un port conteneur (étant donné que votre URL cible n'est pas l'hôte réel).

Vérifiez https://docs.docker.com/compose/compose-file/#network_mode et essayez de le définir sur Host.

1
agermain

Je pense que le problème est que vous utilisez le mode hôte dans votre fichier de configuration de composition de docker et que le pare-feu IPTABLES est autorisé pour les ports de la machine Debian? Et les fenêtres?

network_mode: Host 

qui contourne complètement le pont docker afin que la section ports que vous spécifiez ne soit pas appliquée. Tous les ports seront ouverts sur le système hôte. Vous pouvez vérifier avec

nestat -tunlp | grep 5000

Et vous verrez que le port 5000 n'est pas ouvert et mappé au 80 du docker comme vous vous en doutez. Cependant, les ports 80 et 9000 doivent être ouverts sur le réseau Debian mais pas liés à un pont docker uniquement à l'adresse IP Debian.

De là: https://docs.docker.com/network/Host/

AVERTISSEMENT: les ports publiés sont ignorés lors de l'utilisation du mode réseau hôte

Une solution pourrait être de supprimer la ligne network_mode et cela fonctionnera comme prévu.

1
Jinxmcg

Votre navigateur a accès à 164.16.240.30:9000, car il passe par un proxy (environnement d'entreprise typique), donc the proxy dispose d'une connectivité réseau avec 164.16.240.30. Cela ne signifie pas que votre hôte a également la même connectivité réseau. En fait, il semble que votre hôte ne l'ait pas. C'est la raison pour laquelle le wget direct du conteneur ou du terminal a une erreur No route to Host.

Tout doit passer par le proxy. Essayez de configurer correctement le proxy - les applications Linux utilisent des variables d'environnement http_proxy,https_proxy généralement, mais les applications peuvent avoir leur propre option pour configurer le proxy, éventuellement vous pouvez le configurer au niveau du code source. Cela dépend de l'application/du code utilisé.

1
Jan Garaj

Votre code ne permet pas à votre conteneur d'accéder à 164.16.240.30:9000. Vous devriez wget 164.16.240.30:9000 du terminal au lieu de 172.17.240.30:9000.

0
boi yeet