通过已发布的端口与Docker服务进行通信

时间:2018-01-10 15:27:06

标签: c# docker docker-compose docker-swarm

我正在尝试在单个节点上运行多个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

系统

  • Windows 10 1703 Build 15063.0
  • Docker CE 17.12.0-ce-win46(15048)

修改

在这里找到了一些很好的信息。

  

我相信您需要以“主机”模式发布端口(docs.microsoft.com/en-us/virtualization/windowscontainers / ...)。此外,它将是运行容器和主机之间的一对一端口映射,因此您将无法在同一端口上运行多个容器。 路由网格尚未在Windows上运行。

Source

现在问题仍然存在;何时支持网状路由?

2 个答案:

答案 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)

显然,网格路由不适用于Windows 10版本1703.网格路由是Windows上的默认选项,版本为1709.

Box Boat

MS Blog

SO