我正在尝试构建一个由角度ui和.net核心webapi组成的docker-compose应用程序。但是,UI无法与webapi通信,因为当我尝试引用webapi时,我收到了ERR_NAME_NOT_RESOLVED。
这是我的docker-compose.yml
version: '3'
services:
ui:
image: demoui
container_name: demoui
build:
context: ./DemoUI/
dockerfile: Dockerfile
ports:
- '8080:80'
api:
image: demoapi
container_name: api
build:
context: ./DemoApi/DemoApi/
dockerfile: Dockerfile
ports:
- '80'
以下是相应的dockerfiles:
的WebAPI
# Build Stage
FROM microsoft/aspnetcore-build:2 AS build-env
WORKDIR /api
COPY DemoApi.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /publish
# Runtime Image Stage
FROM microsoft/aspnetcore:2
WORKDIR /publish
COPY --from=build-env /publish .
ENTRYPOINT ["dotnet", "/publish/DemoApi.dll"]
Angular UI:
#compile it up
FROM johnpapa/angular-cli as ng-build
WORKDIR /build
COPY . .
RUN npm rebuild node-sass
RUN npm i
RUN ng build --prod --build-optimizer
# copy compiled files to running container
FROM nginx as runtime
WORKDIR /usr/shared/nginx/html
#remove default contents of nginx directory
RUN rm *
COPY --from=ng-build /build/dist/ .
我可以运行一个docker ps -a并且两个容器都在运行,我可以从docker主机获得两个容器的正确响应。
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1beef15c8aaf demoui "httpd-foreground" 9 hours ago Up 9 hours 0.0.0.0:8080->80/tcp demoui
4d0ec94cdc51 demoapi "dotnet /publish/D..." 9 hours ago Up 9 hours 0.0.0.0:32776->80/tcp api
我可以从ui容器ping api。
docker exec 1beef ping api
PING api (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.087 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.091 ms
但是,当我尝试通过http.get(“http://api/api/values”)从UI引用api时,我得到一个ERR_NAME_NOT_RESOLVED。 我错过了什么?
编辑:我还成功地从UI容器中对api运行了一个cURL。 I.E.
curl http://api/api/values
(在端口80上作为默认值)返回预期值。对我而言,这意味着这确实是一个nginx问题。
答案 0 :(得分:0)
我不确定端口。 尝试公开'api'服务的端口:
api:
image: demoapi
...
ports:
- '8081:80'
然后,使用正确的网址重试:http.get(“http://api:8081/api/values”)
答案 1 :(得分:0)
对于所有浏览器应用,即使是使用 Docker 部署,调用 API 时也必须使用 localhost:<mapped_port>
,因为您是在主机上访问和使用您的应用,因此您的 API 将由主机解析首先,当然主机上没有 api
。
查看我的详细回答here