无法连接到本地 Docker 运行 Kestrel 服务器
Cannot connect to local Docker running Kestrel server
我有一个 Kestrel 服务器 returns Hello World
任何 HTTP 请求。
static class Program
{
static void Main(string[] args)
{
var webHostBuilder = WebHost.CreateDefaultBuilder(args)
.UseSetting("applicationName", "Hello World")
.Configure(builder => {
builder.Run(async context =>
{
var textBytes = UTF8.GetBytes("Hello World!");
await context.Response.Body.WriteAsync(textBytes, 0, textBytes.Length, default (CancellationToken));
});
})
.UseUrls("http://+:8000");
var webHost = webHostBuilder.Build();
webHost.Run();
}
}
我已将构建程序集添加到 Docker 映像并使用 DockerFile
:
构建它
FROM microsoft/dotnet
WORKDIR /app
ADD /application /app
EXPOSE 8000
ENTRYPOINT [ "dotnet", "hello-world-server.dll" ]
我已经 运行 有了这个:
>docker run hello-world-server --publish-list 8000:8000
当我向 http://localhost:8000
发送请求时,我收到了 502 返回。
我在 Windows 10 上使用 Windows 个容器。
构建和 运行 的完整输出如下:
C:\...\hello-world-server-docker>docker build -t hello-world-server .
Sending build context to Docker daemon 84.99kB
Step 1/5 : FROM microsoft/dotnet
---> d08db1d19023
Step 2/5 : WORKDIR /app
Removing intermediate container 873dea47b78b
---> de4b80a52d54
Step 3/5 : ADD /application /app
---> ba75fe5b5efc
Step 4/5 : EXPOSE 8000
---> Running in 1ac9c977c9b4
Removing intermediate container 1ac9c977c9b4
---> 22cb3848d762
Step 5/5 : ENTRYPOINT [ "dotnet", "hello-world-server.dll" ]
---> Running in 17f3b01f6ed0
Removing intermediate container 17f3b01f6ed0
---> 82c7e3aadfc2
Successfully built 82c7e3aadfc2
Successfully tagged hello-world-server:latest
C:\...\hello-world-server-docker>docker run hello-world-server --publish-list 8000:8000
Hosting environment: Production
Content root path: C:\app
Now listening on: http://[::]:8000
Application started. Press Ctrl+C to shut down.
当向 localhost:8000
发出请求时,Kestrel 的控制台上没有进一步的输出,而通常是 普通 控制台应用程序。
我也尝试过 运行 将其与 >docker run hello-world-server --publish 8000:8000
结合使用。
我认为问题出在 docker 运行 命令中。 --publish-list 8000:8000
现在是容器入口点的参数。
运行 容器和公开端口的命令是:
docker run -p 8000:8000 hello-world-server
docker run
的每个命令行选项都必须放在 图像名称 之前。图像名称之后的所有内容都是容器本身的命令。
我有一个 Kestrel 服务器 returns Hello World
任何 HTTP 请求。
static class Program
{
static void Main(string[] args)
{
var webHostBuilder = WebHost.CreateDefaultBuilder(args)
.UseSetting("applicationName", "Hello World")
.Configure(builder => {
builder.Run(async context =>
{
var textBytes = UTF8.GetBytes("Hello World!");
await context.Response.Body.WriteAsync(textBytes, 0, textBytes.Length, default (CancellationToken));
});
})
.UseUrls("http://+:8000");
var webHost = webHostBuilder.Build();
webHost.Run();
}
}
我已将构建程序集添加到 Docker 映像并使用 DockerFile
:
FROM microsoft/dotnet
WORKDIR /app
ADD /application /app
EXPOSE 8000
ENTRYPOINT [ "dotnet", "hello-world-server.dll" ]
我已经 运行 有了这个:
>docker run hello-world-server --publish-list 8000:8000
当我向 http://localhost:8000
发送请求时,我收到了 502 返回。
我在 Windows 10 上使用 Windows 个容器。
构建和 运行 的完整输出如下:
C:\...\hello-world-server-docker>docker build -t hello-world-server .
Sending build context to Docker daemon 84.99kB
Step 1/5 : FROM microsoft/dotnet
---> d08db1d19023
Step 2/5 : WORKDIR /app
Removing intermediate container 873dea47b78b
---> de4b80a52d54
Step 3/5 : ADD /application /app
---> ba75fe5b5efc
Step 4/5 : EXPOSE 8000
---> Running in 1ac9c977c9b4
Removing intermediate container 1ac9c977c9b4
---> 22cb3848d762
Step 5/5 : ENTRYPOINT [ "dotnet", "hello-world-server.dll" ]
---> Running in 17f3b01f6ed0
Removing intermediate container 17f3b01f6ed0
---> 82c7e3aadfc2
Successfully built 82c7e3aadfc2
Successfully tagged hello-world-server:latest
C:\...\hello-world-server-docker>docker run hello-world-server --publish-list 8000:8000
Hosting environment: Production
Content root path: C:\app
Now listening on: http://[::]:8000
Application started. Press Ctrl+C to shut down.
当向 localhost:8000
发出请求时,Kestrel 的控制台上没有进一步的输出,而通常是 普通 控制台应用程序。
我也尝试过 运行 将其与 >docker run hello-world-server --publish 8000:8000
结合使用。
我认为问题出在 docker 运行 命令中。 --publish-list 8000:8000
现在是容器入口点的参数。
运行 容器和公开端口的命令是:
docker run -p 8000:8000 hello-world-server
docker run
的每个命令行选项都必须放在 图像名称 之前。图像名称之后的所有内容都是容器本身的命令。