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

时间:2018-10-05 09:13:04

标签: docker docker-compose docker-swarm

我正在尝试运行微服务部署的原型(目前仅出于研发目的)。我做了一个非常基本的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中获取预期结果:

Screen shot from browser

我尝试将这个映像与Docker服务部署在一起(在docker中激活了swarm模式),并映射了另一个端口来访问它:

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

该服务似乎运行正常,并且该任务的容器也运行良好(这是上面代码段中的两个容器中的第一个容器。

由于某种原因,当我尝试访问同一端点但使用新端口(再次在浏览器中的localhost上)时,出现“无法连接”的情况。

完整的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"
                }
            ]
        }
    }
]

图像的dockerfile是这样的:

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

关于我可能错过的任何建议都是很棒的。

1 个答案:

答案 0 :(得分:0)

我现在设法解决了这个问题,并认为如果别人遇到相同的情况,我会分享我所做的事情。

我认为我面临的问题是由于以下两个因素造成的:

1)Docker CE上的Windows Server容器/主机不完全支持路由网格

2)容器与主机之间的操作系统内核之间的不匹配,这再次导致入口网络和发布端口出现问题(尽管它并未抛出任何警告/错误来表明这一事实)。

>

我是如何工作的:

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

2)更改了我用来创建映像的Dockerfile以使用Microsoft / aspnet的1803版本:

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

(如果您使用的是1709 Windows Server VM,则应该是:

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

完成这些步骤之后,我现在有了一个功能齐全的集群,该集群在具有许多不同复制服务的多节点集群上运行。

希望这会有所帮助。