【发布时间】:2021-07-09 22:29:12
【问题描述】:
我有一个 'mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim' Docker 容器,上面有 2 个东西: - 在其上运行的自定义 SDK - 一个通过 TCP 连接到 SDK 的 dotnet5 应用程序
如果我连接了 Docker 的 bash,我可以使用 telnet localhost 54321 成功连接到我的 SDK
如果我在我的开发计算机 (Windows) 上运行 Windows SDK 版本,并运行我的应用程序 IIS Express 而不是 Docker,我可以成功连接到 telnet 库(主机“localhost”,端口“54321”),这作品
但是,我想在 Docker 容器中运行 SDK 和我的 dotnet 应用程序,当我尝试从容器内部连接时(与 IIS 托管版本相同),这不起作用。通过从 docker 容器命令行运行“telnet localhost 54321”,我可以确认 SDK 正在运行。我做错了什么?
Dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
RUN apt-get update && apt-get install -y telnet
RUN apt-get update && apt-get install -y libssl1.1
RUN apt-get update && apt-get install -y libpulse0
RUN apt-get update && apt-get install -y libasound2
RUN apt-get update && apt-get install -y libicu63
RUN apt-get update && apt-get install -y libpcre2-16-0
RUN apt-get update && apt-get install -y libdouble-conversion1
RUN apt-get update && apt-get install -y libglib2.0-0
RUN mkdir /sdk
COPY ["Server/Sdk/SomeSDK*", "sdk/"]
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["Server/MyProject.Server.csproj", "Server/"]
COPY ["Shared/MyProject.Shared.csproj", "Shared/"]
COPY ["Client/MyProject.Client.csproj", "Client/"]
RUN dotnet restore "Server/MyProject.Server.csproj"
COPY . .
WORKDIR "/src/Server"
RUN dotnet build "MyProject.Server.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyProject.Server.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyProject.Server.dll"]
代码(在 IIS 上工作,当 SDK 在 Windows 上运行时,但当 SDK 和代码都在同一个 Docker 容器中运行时):
var telnetClient = new TelnetClient("localhost", 54321, TimeSpan.FromSeconds(1), new CancellationToken());
await telnetClient.Connect();
Thread.Sleep(2000);
await telnetClient.Send("init");
命令行(在 Windows CLI 和 Docker bash 中都可以使用(所以当代码不工作时,它也可以工作):
$telnet localhost 54321
$init
问题可能是(但我不确定,因为我从 dotnet 中使用直接命令行 '$telnet localhost 54321' 收到此结果:'telnet:远程主机拒绝连接'
【问题讨论】:
-
请检查容器中是否开启Telnet:dism /online /Enable-Feature /FeatureName:TelnetClient
-
这两个部分是在一个容器中运行,还是在两个单独的容器中运行,或者一个在一个容器中而一个不在? SDK组件的网络监听器是如何配置的(监听什么地址和端口)?
-
@markus 我会检查并回复你,但 telnet 在 Docker 容器内的命令行中工作,所以我认为它可以工作
-
@David 都在同一个容器内。 SDK 监听 54321 端口上的 TCP 连接
-
请将您的运行语句合并为一个语句