c# - 网络::ERR_NAME_NOT_RESOLVED 泊坞窗
问题描述
我有一个非常简单的 docker 设置 - React WebApp(管理面板)和 .netCore Customer Api,它们连接到桥接网络。我实际上正在创建一个健康检查监视器。
两个容器都已连接,我可以通过 ip 和容器名称 ping 通,没有任何问题。当我卷曲健康检查端点时,它工作正常。
但是,当我从 admin-app react 代码中的相同 url 进行获取时,它会抛出 net::ERR_NAME_NOT_RESOLVED docker。请在此处查看代码
async loadData() {
try {
fetch('http://customer-api:5000/api/hc')
.then(function (response) {
console.log(response)
});
} catch (e) {
console.log(e);
}
}
到目前为止我做了什么 -
- 确保两者都在同一个网络中
- 端口是正确的
- 可以从外部浏览器和容器访问客户 api
管理应用程序码头工人
# pull official base image
FROM node:13.12.0-alpine
# set working directory
WORKDIR /app
# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH
# install app dependencies
COPY admin-app/package.json ./
COPY admin-app/package-lock.json ./
RUN npm install --silent
RUN npm install react-scripts@3.4.1 -g --silent
# add app
COPY ./admin-app ./
# start app
CMD ["npm", "start"]
客户 api 码头工人
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
ENV WEB_PORT=5000 \
ASPNETCORE_URLS=http://+:5000 \
ASPNETCORE_ENVIRONMENT="Local"
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY ["customerprofile/Figg.Customer.Api/Figg.Customer.Api.csproj", "Figg.Customer.Api/"]
COPY ["core/Figg.Shared/Figg.Shared.csproj", "Figg.Shared/"]
COPY ["core/Figg.Core/Figg.Core.csproj", "Figg.Core/"]
COPY ["customerprofile/Figg.Customer.Domain/Figg.Customer.Domain.csproj", "Figg.Customer.Domain/"]
RUN dotnet restore "Figg.Customer.Api/Figg.Customer.Api.csproj"
COPY . .
WORKDIR "/src/customerprofile/Figg.Customer.Api"
RUN dotnet build "Figg.Customer.Api.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Figg.Customer.Api.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
EXPOSE $WEB_PORT
ENTRYPOINT ["dotnet", "Figg.Customer.Api.dll"]
有什么想法吗
平工程
/app # ping customer-api
PING customer-api (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: seq=0 ttl=64 time=0.062 ms
64 bytes from 172.21.0.2: seq=1 ttl=64 time=0.049 ms
64 bytes from 172.21.0.2: seq=2 ttl=64 time=0.068 ms
64 bytes from 172.21.0.2: seq=3 ttl=64 time=0.049 ms
64 bytes from 172.21.0.2: seq=4 ttl=64 time=0.094 ms
我找到了它没有到达我的容器的原因 - 但是如何解决这个问题?请看这里的图片,这将解释
解决方案
您的 Docker 容器正在您的主机(您自己的系统)上运行
Docker 向主机发布了以下端口:
- ClientAPI 的 8092(“8092:3000”中的第一个字符串)
- AdminApp 为 3000。(这是“3000:3000”字符串中的前 3000。这就是为什么我总是建议使用不同的端口以免混淆)
BTW:你提到的这 5000 是从哪里来的?我猜那是“8092:3000”字符串中的“3000”。错字?
主机可以访问 localhost:3000 (admin-app) 和 localhost:8092 (ClientAPI)。
如果一个容器需要到达另一个容器,它需要寻址服务和内部端口。在您的图片中:AdminApp 可以使用 customer-api:3000 (或 5000?错字?:-) 访问 ClientAPI
如果您客户端呈现 AdminApp,则它需要外部世界(主机之外)的 ClientAPI 地址。这意味着到达主机(运行容器的计算机)并且该主机可以将请求发送到 customer-api:3000。
结论:您需要一个 ProxyServer(Nginx?)。将 Nginx 放在主机上(不建议)或作为单独的容器放在另一个 2 旁边。在最后一个(也是最好的)选项中,你给每个容器一个 IP 地址并让 Nginx 代理(动词)请求到右边容器。
我们在我们自己的环境中运行它,Nginx 为大约 6 个不同的容器提供服务。在主机上,我们有一个 docker(外部)网络,它将端口 80 和 443 的每个请求传递到 Nginx 容器中的代理服务器。并且该容器将每个请求(基于 Nginx 配置文件中的 server_name)传递到正确的容器。
推荐阅读
- c++ - 如何使浮点数显示 -0 也显示为 0?
- python - 为什么这个字符串不附加一个 for 循环工作?
- javascript - 将 SVG 文件插入 HTML
- shopify - Shopify 产品列表中的变体
- terraform - 用于 100 个子网的 Terraform cidrsubnets 循环
- angular - 如何避免 Angular 11 中硬编码的 @HostListener 事件?
- arrays - 如何形成一个精确的查询来查找数组内部的 id
- angular - 迁移到微前端结构后,没有动态创建组件的提供者
- python - 从python中的文本文件中删除所有空行
- python - 多个条件的python函数