Докер: не может получить доступ к серверу - PullRequest
0 голосов
/ 25 августа 2018

Вот немного предыстории. Я реализовал несколько веб-API с использованием архитектуры микросервисов. Я пытаюсь сделать мои микросервисы доступными через HTTPS. Микросервисы разрабатываются с использованием ядра .net, поэтому, согласно документу Microsoft, для обеспечения HTTPS мне необходимо настроить Kestrel. Вот как я это сделал.

.UseKestrel(options =>
            {
                options.Listen(IPAddress.Loopback, 5000);
                options.Listen(IPAddress.Loopback, 5001, listenOptions =>
                {
                    listenOptions.UseHttps("cert.pfx", "pwd");
                });
            }) 

Для простоты я использую kestrel и пропускаю обратный прокси. Я обязательно включу Nginx в качестве обратного прокси, но это будущая работа. Я тестировал локально, все заработало. Затем я развернул его на Docker. Вот файл docker-compose.override

version: '3.4'

services:
dataservice:
  environment:
    - ASPNETCORE_ENVIRONMENT=Development
    - ASPNETCORE_URLS=https://+:443;http://+:80
  ports:
    - "5000:80"
    - "5001:443"

В dockerfile порты 5000 и 5001 открыты. Я встроил проект в образы и запустил его в Docker, используя docker run -it --rm -p 5000:80 --name *name* *imagename*. Докер показывает Now listening on: http://127.0.0.1:5000 и Now listening on: https://127.0.0.1:5001. Теперь проблема в том, что оставьте часть https в стороне, API не могут получить доступ даже по http. Браузер просто показывает This page isn’t working 127.0.0.1 didn’t send any data. ERR_EMPTY_RESPONSE. Я нашел подобный вопрос отсюда Docker: не могу открыть порт от контейнера к хосту , каким-то образом сервер должен слушать 0.0.0.0. Хотя я не до конца понимаю причину, я изменил конфигурацию пустельги на

options.Listen(IPAddress.Any, 5000);

снова создал и запустил образы докера, и Docker показывает Now listening on: http://0.0.0.0:5000, но он все равно не работает. Я также пытался заменить IP на localhost, это бесполезно. Я не использовал .UseHttpsRedirection(), https не должен иметь ничего общего с проблемой.

Мне не хватает какой-либо конфигурации или что-то не так? Было бы очень полезно, если бы кто-то мог пролить свет. Заранее спасибо.

1 Ответ

0 голосов
/ 25 августа 2018

Вы должны listen на 80 и 443 внутри контейнера, то есть options.Listen(IPAddress.Any, 80);, потому что это объявление докера

ports: 
   - "5000:80"

означает, что локальный порт 80 (порт из вашего исходного кода) экспортируется ввнешний порт 5000, а не наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...