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!
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:
Si el servicio API es alcanzable, deberías ver la dirección IP del contenedor API en la salida del comando “ping”.
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:
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!