我在docker中运行了2个.net核心应用程序(一个是Web API,另一个是使用Web API的Web应用程序):
我似乎无法通过Web应用程序与api进行通信,但是我可以通过在http://localhost:44389的浏览器中直接访问api来访问该api
我的Web应用程序中有一个环境变量,该环境变量具有相同的信息,但无法获取。
如果我要在azure上指定我的API的部署版本,它就可以与该地址通信。似乎问题出在容器之间互相交谈。
我读到,创建网桥应该可以解决该问题,但事实并非如此。我在做什么错了?
这是我的docker撰写文件:
version: '3.4'
services:
rc.api:
image: ${DOCKER_REGISTRY}rcapi
build:
context: .
dockerfile: rc.Api/Dockerfile
ports:
- "44389:80"
rc.web:
image: ${DOCKER_REGISTRY}rcweb
build:
context: .
dockerfile: rc.Web/Dockerfile
environment:
- api_endpoint=http://localhost:44389
depends_on:
- rc.api
networks:
my-net:
driver: bridge
答案 0 :(得分:3)
docker-compose
自动在您的容器之间创建网络。由于容器位于同一网络中,因此您可以使用别名在容器之间进行连接。 docker-compose
使用容器名称和容器IP创建别名。因此,在您的情况下,docker-compose
应该看起来像
version: '3.4'
services:
rc.api:
image: ${DOCKER_REGISTRY}rcapi
build:
context: .
dockerfile: rc.Api/Dockerfile
ports:
- "44389:80"
rc.web:
image: ${DOCKER_REGISTRY}rcweb
build:
context: .
dockerfile: rc.Web/Dockerfile
environment:
- api_endpoint=http://rc.api
depends_on:
- rc.api
networks:
my-net:
driver: bridge
与rc.api
中一样,在其容器中打开端口80,因此rc.web
可以使用http://rc.api:80
或http://rc.api
访问80端口(无端口,因为HTTP端口默认为80)
答案 1 :(得分:0)
您需要调用http://rc.api,因为您有两个容器并且API容器localhost与Web应用程序容器localhost不同。
约定是每个服务都可以通过docker-compose.yml中指定的名称来解析。
因此,您可以在内部端口80上调用API,而不必将其暴露在特定的端口上。