我正在尝试在单个节点上运行多个Docker镜像实例,并向节点发送请求,以允许Docker在实例之间进行负载平衡。
如果我使用下面显示的运行命令,容器按预期运行,我可以从端口80上的另一台机器发送请求,并且请求由容器提供服务。但是,如果我尝试使用下面显示的 Service 命令启动服务,我会运行5个复制任务,但请求只返回404错误。
如何通过我公开的端口与服务进行通信?
此示例包含一个ASP.Net Core 2.0 api,它返回应用程序实例唯一的Guid。
控制器
using Microsoft.AspNetCore.Mvc;
using System;
namespace MinimalDockerTest.Controllers {
[Route("api/[controller]")]
public class NodeController : Controller {
[HttpGet]
public IActionResult Get() {
return Ok(NodeId);
}
private static Guid NodeId {
get;
} = Guid.NewGuid();
}
}
Dockerfile
#Context is binary output folder, i.e. bin/publishoutput
FROM microsoft/aspnetcore:2.0-nanoserver-sac2016
EXPOSE 80
WORKDIR /app
Copy . .
ENTRYPOINT ["dotnet", "MinimalDockerTest.dll"]
构建命令
docker build -t minimaltest .
运行命令
docker run -p 80:80 --name minimaltest minimaltest
服务命令
docker service create -p 80:80 --replicas 5 --name minimaltest minimaltest
请求
GET: http://node_ip/api/node
系统
修改
在这里找到了一些很好的信息。
我相信您需要以“主机”模式发布端口(docs.microsoft.com/en-us/virtualization/windowscontainers / ...)。此外,它将是运行容器和主机之间的一对一端口映射,因此您将无法在同一端口上运行多个容器。 路由网格尚未在Windows上运行。
现在问题仍然存在;何时支持网状路由?
答案 0 :(得分:0)
确保您没有从注册表中提取不同的图像。默认情况下,docker service
将从注册表中解析图像名称,以便它可以在群集中的多个节点上运行。虽然docker run
将使用本地节点上存在的图像。您可以使用--no-resolve-image
选项禁用此解决过程:
docker service create -p 80:80 --replicas 5 --name minimaltest \
--no-resolve-image minimaltest
答案 1 :(得分:0)