Docker Swarm Windows 在服务中 运行 时无法从浏览器访问服务器容器

Docker Swarm Windows Server container not accesible from browser when run in a service

我正在尝试 运行 微服务部署的原型(此时仅用于研发目的)。我制作了一个非常基本的 API 端点,并在 visual studio 中使用 docker-compose 来创建容器。 API代码如下:

[RoutePrefix("api/test")]
public class TestController : ApiController
{

    [HttpGet]
    [Route("")]
    public HttpResponseMessage Get()
    {
        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "Microservice Test Successful 2");

        return response;
    }
}

部署的容器具有以下详细信息(列表中的第二个):

    CONTAINER ID        IMAGE                     COMMAND                   CREATED             STATUS              PORTS                  NAMES
31d4d7f15d3e        testmicroservice:latest   "C:\ServiceMonitor.e…"   16 hours ago        Up 16 hours                                testservice.1.ttt25efcq418xbsu7vqksl94p
816c526ef9f3        testmicroservice          "cmd /c 'start /B C:…"    16 hours ago        Up 16 hours         0.0.0.0:8785->80/tcp   dockercompose2417227251495589316_gdms.testmicroservice_1

我可以在我的浏览器中通过已发布的端口非常愉快地访问它,并从 API:

返回预期的结果

我试图将这个相同的图像部署为 docker 服务(在 docker 中激活群模式)并映射了一个不同的端口来访问它:

ID                  NAME                MODE                REPLICAS            IMAGE                     PORTS
m3wfea6n9anl        testservice         replicated          1/1                 testmicroservice:latest   *:5050->80/tcp

该服务似乎 运行ning 正确并且此任务的容器似乎也 运行ning 正常(它是上面代码段中两个容器中的第一个。

出于某种原因,当我尝试访问相同的端点但使用新端口(再次在我的浏览器中的本地主机上)时,我得到 "unable to connect"。

完整的 docker 服务详情如下。

    [
    {
        "ID": "m3wfea6n9anligjrrihbi03vt",
        "Version": {
            "Index": 500
        },
        "CreatedAt": "2018-10-04T16:19:17.2891599Z",
        "UpdatedAt": "2018-10-04T16:19:17.2921526Z",
        "Spec": {
            "Name": "testservice",
            "Labels": {},
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "testmicroservice:latest",
                    "Init": false,
                    "StopGracePeriod": 10000000000,
                    "DNSConfig": {},
                    "Isolation": "default"
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "Delay": 5000000000,
                    "MaxAttempts": 0
                },
                "Placement": {},
                "ForceUpdate": 0,
                "Runtime": "container"
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 1
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "RollbackConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "EndpointSpec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 80,
                        "PublishedPort": 5050,
                        "PublishMode": "ingress"
                    }
                ]
            }
        },
        "Endpoint": {
            "Spec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 80,
                        "PublishedPort": 5050,
                        "PublishMode": "ingress"
                    }
                ]
            },
            "Ports": [
                {
                    "Protocol": "tcp",
                    "TargetPort": 80,
                    "PublishedPort": 5050,
                    "PublishMode": "ingress"
                }
            ],
            "VirtualIPs": [
                {
                    "NetworkID": "ylj65tghq4ek1ewmtysaitmcx",
                    "Addr": "10.255.0.31/16"
                }
            ]
        }
    }
]

图像的docker文件是这样的:

FROM microsoft/aspnet:4.7.2-windowsservercore-1709
ARG source
WORKDIR /inetpub/wwwroot
COPY ${source:-obj/Docker/publish} .

任何关于我可能遗漏的建议都很好。

我现在已经设法让它工作了,我想我会分享我所做的,以防其他人遇到同样的情况。

我认为我遇到的问题是由以下几个因素造成的:

1) Docker CE

上的 Windows 服务器 Containers/Hosts 不完全支持路由网格

2) 容器和主机之间的操作系统内核不匹配,这再次导致入口网络和发布端口出现问题(尽管它没有抛出任何 warning/error 来表明这一事实).

我是如何让它工作的:

1) 创建了一个 1803 Windows Server VM 并安装了 Docker EE Basic(Windows Server 2016 及更高版本免费提供)。我相信 运行 1709 上的虚拟机也可以工作)。如果您有 VM 运行 Windows Server 2016+,您可以按照 Docker Website 的说明安装 docker 的 EE Basic 版本(确保将其更新到最新版本版本)。

2) 更改了我用来创建图像的 Docker 文件以使用 microsoft/aspnet 的 1803 版本:

FROM microsoft/aspnet:4.7.2-windowsservercore-1803
ARG source
WORKDIR /inetpub/wwwroot
COPY ${source:-obj/Docker/publish} .

(如果您使用的是 1709 Windows 服务器虚拟机,那么它将是:

FROM microsoft/aspnet:4.7.2-windowsservercore-1709
ARG source
WORKDIR /inetpub/wwwroot
COPY ${source:-obj/Docker/publish} .

3) 将新映像部署到 VM。

4) 在服务器上设置集群模式:

Docker Swarm Init

5) 将图像部署为服务:

Docker Service Create --name testservice --publish 3000:80 testmicroservice

按照这些步骤,我现在在具有许多不同的复制服务的多节点集群上拥有一个功能齐全的集群 运行。

希望这对您有所帮助。