es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No es posible establecer la comunicación entre la API y el servicio WEB en Docker.

Estoy intentando aprender Docker y soy nuevo en esta tecnología. Tengo un problema desde hace mucho tiempo:
Tengo una aplicación compuesta por el Framework REST de Django, Angular y MySQL como base de datos. Estoy intentando dockerizar cada uno de estos componentes y ejecutarlos usando docker-compose. Aquí está mi archivo docker-compose.yml:

version: '3'

services:

  db:
    image: mysql:5.7.33
    container_name: db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ******
      MYSQL_DATABASE: database
    volumes:
      - mysql_db:/var/lib/mysql

  api:
    build:
        context: ./api
        dockerfile: Dockerfile
    container_name: api
    volumes:
      - /api36:/home/api/api36
    ports:
      - "8010:8010"
    depends_on:
      - db

  ui:
    build:
        context: ./ui
        dockerfile: Dockerfile
    volumes:
      - /ui:/ui
    container_name: ui
    ports:
      - "4201:4201"
    depends_on:
      - db

volumes:
  mysql_db:

He actualizado el archivo settings.py para que apunte a db como HOST en DATABASES, por lo que puedo tener comunicación entre mi base de datos y las llamadas API.
Sin embargo, cuando carga la UI, enfrento una falla que dice: Failed to load resource: net::ERR_NAME_NOT_RESOLVED. Agregué serviceUrl como http://api:8010/ en mi archivo environment.ts. Como api es el nombre de mi servicio API, esperaba que docker-compose estableciera la comunicación internamente, pero parece que me falta algo. Además, puedo obtener el comportamiento esperado cuando agrego la ip de la máquina en el archivo environment.ts.
¿Alguien puede ayudarme con esto?
La forma en que levanto y ejecuto todos los contenedores es docker-compose up.

¡Gracias de antemano!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría ser la manera en que estás haciéndole referencia al servicio API en tu código UI. Dado que has nombrado tu servicio API como “api” en tu archivo “docker-compose.yml”, deberías hacer referencia a él como “http://api:8010/” en tu archivo “environment.ts”.

    Una posible razón para el error “ERR_NAME_NOT_RESOLVED” es que tu contenedor UI no es capaz de resolver el nombre de host “api” a la dirección IP del contenedor API. Docker-compose crea una red para todos los servicios definidos en el archivo “docker-compose.yml” y cada servicio es accesible por su nombre (como se define en el archivo “docker-compose.yml”) dentro de esa red.

    Para solucionar este problema, puedes intentar los siguientes pasos:

    1. Asegúrate de que el servicio API está funcionando y es accesible usando su nombre de host “api” dentro del contenedor UI. Puedes probar esto ejecutando el siguiente comando dentro del contenedor UI:
      ping api
      

      Si el servicio API es alcanzable, deberías ver la dirección IP del contenedor API en la salida del comando “ping”.

    2. Revisa los registros del contenedor UI para ver si hay algún error relacionado con la resolución DNS o la conectividad de red. Puedes ejecutar el siguiente comando para ver los registros:

      docker-compose logs ui
      

    3. Si los pasos anteriores no resuelven el problema, puedes intentar usar la dirección IP del contenedor API en lugar de su nombre de host en tu archivo “environment.ts”. Puedes obtener la dirección IP del contenedor API ejecutando el siguiente comando:
      docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <nombre-o-id-del-contenedor-api>
      

      Reemplaza “” con el nombre o ID del contenedor API.

    En general, es buena práctica usar nombres de host en lugar de direcciones IP al hacer referencia a servicios en un archivo Docker-compose, ya que hace que los servicios sean más portátiles y fáciles de administrar. Sin embargo, resolver nombres de host a direcciones IP puede resultar un poco complicado, especialmente cuando se trata de múltiples contenedores y redes. ¡Espero que esto te ayude a resolver tu problema!

Comments are closed.