Контейнер Docker Swarm Windows Server недоступен из браузера при запуске в службе - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь запустить прототип развертывания микросервиса (на данный момент только для целей НИОКР).Я создал очень простую конечную точку API и использовал docker-compose в visual studio для создания контейнера.Код 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) и назначен другой порт для доступа к нему:

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

Служба, похоже, работает правильно, и контейнер для этой задачи также работает нормально (это первый издва контейнера из приведенного выше фрагмента.

По какой-то причине, когда я пытаюсь получить доступ к той же конечной точке, но с новым портом (снова на локальном хосте в моем браузере), я не могу подключиться.

Полная информация о сервисе докера приведена ниже.

    [
    {
        "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"
                }
            ]
        }
    }
]

Докер-файл для изображения выглядит так:

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

Любые предложения относительно того, что я, возможно, пропустил, были бы хорошими.

1 Ответ

0 голосов
/ 19 октября 2018

Мне удалось заставить это работать сейчас, и я подумал, что поделюсь тем, что сделал, если кто-то столкнется с тем же.

Я считаю, что проблема, с которой я столкнулся, была вызвана несколькими факторами:

1) Routing Mesh не полностью поддерживается для контейнеров / хостов Windows Server в Docker CE

2) Несоответствие между ядрами операционной системы между контейнером и хостом, что снова вызвало проблемы свходящая сеть и порты публикации (хотя он не выдавал никаких предупреждений / ошибок, указывающих на этот факт).

Как мне это работает:

1) Создановиртуальная машина Windows Server 1803 и установленный Docker EE Basic (поставляется бесплатно с Windows Server 2016 и выше).Я считаю, что запуск ВМ на 1709 также работал бы).Если у вас есть виртуальная машина под управлением Windows Server 2016+, вы можете установить версию Docker EE Basic, следуя инструкциям на веб-сайте Docker (обязательно обновите ее до последней версии).

2) Изменил Dockerfile, который я использовал для создания образа, чтобы использовать версию 1803 microsoft / aspnet:

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

(если вы используете виртуальную машину Windows Server 1709, то это было бы:

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

3) Развертывание нового образа на виртуальной машине.

4) Настройка режима роя на сервере:

Docker Swarm Init

5) Развертывание образа как службы:

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

После этих шагов у меня теперь есть полнофункциональный рой, работающий на многоузловом кластере с несколькими различными реплицированными службами.

Надеюсь, это поможет.

...