J'ai créé un conteneur Service Docker qui fonctionne correctement sur ma machine Windows, mais lorsque j'essaie de l'exécuter sur ma machine Linux, le problème est que le service ne trouve pas le service injecté.

Détails:

  1. Service Un conteneur créé à l'aide du fichier de composition docker.
  2. Conteneur du service B injecté à l'aide de la variable d'environnement dans le conteneur du service A
  3. Le conteneur du service A fonctionne bien et le conteneur du service B fonctionne également bien.
  4. Le problème survient lorsque le conteneur du service A essaie d'accéder au conteneur du service B. Le conteneur Service B n'est pas accessible. Le DNS interne du service B n'a pas pu être résolu par le conteneur du service A.
  5. Les conteneurs de service A et de service B sont connectés à un réseau interne créé manuellement dans le cadre du fichier de composition Docker. Le DNS pour le service B se résout facilement lorsque j'exécute ces conteneurs Linux sur le système d'exploitation hôte Windows, mais la même chose échoue lorsque je l'exécute dans le système d'exploitation hôte Linux.

J'ai essayé plusieurs choses et je suis arrivé à la conclusion que le - DNS interne du service B pouvait être résolu par le service A dans le système d'exploitation hôte Windows mais ne pouvait pas être résolu dans le système d'exploitation Linux.

DockerCompose (partie du fichier principal)

services:
  serviceb:
    container_name: serviceb
    image: serviceb
    restart: always
    ports: 
     - "30041:80"
    networks: 
     - internal-network
  servicea:
    container_name: servicea
    image: servicea
    restart: always
    ports: 
     - "30091:80"
    networks: 
     - internal-network
    environment: 
      ConnectionString__Service: http://serviceb:80
    depends_on: 
      -serviceb
networks: 
  internal-network:
    driver: bridge
    name: test

Remarque : ServiceA et ServiceB sont à titre de référence

J'ai écrit des journaux dans mon service et je peux vérifier que le DNS est résolu dans le cas de Windows mais pas dans le cas de Linux. Pourquoi Linux se comporte différemment est la principale préoccupation.

Log pour machine Linux : Vous trouverez ci-dessous la réponse que je reçois lorsque j'accède au service B. entrez la description de l'image ici

La seule différence que je vois dans mon environnement Windows et Linux est que l'environnement Windows n'a pas de proxy alors que l'environnement Linux a un proxy sur son réseau.

Édition 1 : J'ai beaucoup cherché et j'arrive maintenant à comprendre que le problème ne survient que sur un réseau proxy. Je pourrais le confirmer car la configuration fonctionne correctement sur une machine sans réseau proxy. J'ai défini le proxy dans le fichier /etc/systemd/system/docker.service.d/proxy.conf et il est transporté à l'intérieur le conteneur Docker.

0
Shubhanshu Rastogi 10 févr. 2020 à 09:41

1 réponse

Meilleure réponse

Le problème était sûrement dû au proxy existant dans le réseau. J'ai modifié le ~/.docker/config.json avec les valeurs Proxy, puis créé les conteneurs. Les valeurs proxy ont également été définies à l'intérieur des conteneurs et lorsque j'ai essayé de faire la découverte du service, le DNS a échoué.

Problème : le client HTTP qui a été créé pour accéder au service B à partir du service A utilisait les valeurs du proxy. Les valeurs proxy à l'intérieur du conteneur empêchaient la découverte du service.

Solution:

  1. Ne définissez pas de valeurs proxy à l'intérieur du conteneur, c'est-à-dire ne modifiez pas config.json OU
  2. Créer un client HTTP avec useProxy=false
0
Shubhanshu Rastogi 13 févr. 2020 à 04:18