Soy nuevo en los contenedores docker y me encuentro con el siguiente problema. Estoy desarrollando una página web que realiza solicitudes a una API expuesta. Ambos se publican en distintos contenedores que se enlazan a través de una red. Este es mi archivo docker-compose.yml:
version: '2' services: api: image: my/api networks: - api ports: - "8080:5000" container_name: api web: build: context: ./DockerWeb networks: - api ports: - "80:5000" container_name: web networks: api: driver: bridge He notado que si me adjunto al contenedor que ejecuta mi página web, puedo hacer ping al contenedor api sin ningún problema usando ping api
El problema surge al intentar realizar cualquier llamada de servicio web al contenedor API. Estoy tratando de inicializar un objeto HttpClient, sin embargo, la propiedad BaseAddress de dicho objeto debe establecerse en un Uri válido.
_client = new HttpClient(); _client.BaseAddress = new Uri(config.ApiUrl); //config.ApiUrl = "api"Esto arroja el siguiente error
UriFormatException: URI no válido: no se pudo determinar el formato del URI.
¿Hay alguna manera de a) Exponer el nombre del contenedor de una manera diferente o b) hacer una llamada a un servicio web sin la necesidad de usar un URI? ¿Cómo puedo lograr esto?
ACTUALIZAR
Actualicé ApiUrl para que contenga el valor http:api:8080 , sin embargo, ahora recibo una excepción al realizar la llamada
System.AgregateException: se produjeron uno o más errores. (Se produjo un error al enviar la solicitud). ---> System.Net.Http.HttpRequestException: se produjo un error al enviar la solicitud. ---> System.Net.Http.CurlException: no se pudo conectar al servidor
También probé llamar al punto final de API directamente desde mi contenedor web usando wget
wget http://api:8080/Sin embargo, sigo recibiendo un error:
Conectando a api (api)|172.24.0.4|:8080... falló: Conexión rechazada
¿Podría ser esto un error de configuración de la API?
api es solo el nombre de host. El URI sería http://api:8080 (o https://api:someotherport si configura SSL/TLS).
Aquí hay 2 tipos de comunicación:
Web de contenedor > API de contenedor
En este caso, de hecho, puede usar el nombre de host "api" para conectarse a su API. Esto es lo que tendría que hacer si su html se genera del lado del servidor.
Cliente web > API de contenedor
Aquí, sin embargo, supongo que está utilizando algún tipo de aplicación web JavaScript (Angular u otra). En ese caso, el html (y la llamada) no se realiza desde el contenedor web sino directamente desde su navegador web.
Entonces, en ese caso, debe usar http://localhost:8080 (supongo que Docker se está ejecutando en su máquina local).
Espero que ayude
El puerto interno se utiliza para conexiones dentro de la red docker. Entonces, en este caso, la solicitud debe ir a http://api:5000