Не удается подключиться к незащищенному порту контейнера, запущенному с помощью docker-compose в Windows - PullRequest
0 голосов
/ 12 мая 2018

У меня проблемы с доступом к приложениям, которые должны предоставлять порты хосту через docker-compose. Вот воспроизводимый пример:

Я создаю новое угловое приложение, используя угловой CLI:

ng new angular-docker

Затем я создаю Dockerfile со следующим содержимым в этом каталоге:

FROM node:8

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app

RUN npm install

EXPOSE 4200

CMD ["npm", "start"]

Затем я создаю файл docker-compose.yaml в том же каталоге:

version: '3'

services:
  angular:
    build: .
    container_name: angular-docker
    volumes:
      - ./src:/usr/src/app/src
    ports:
      - "4200:4200"

Тогда я бегу:

docker-compose up

Я жду, пока получу следующую строку в выводе docker-compose

angular-docker | ** Angular Live Development Server is listening on localhost: 4200, open your browser on http://localhost:4200/ **

С docker inspect angular-docker Я вижу, что действует правило переадресации портов:

...
"Ports": {
            "4200/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "4200"
                }
            ]
        },
...

Теперь, когда я пытаюсь перейти на http://localhost:4200 в Chrome, я получаю ERR_EMPTY_RESPONSE.

Однако, когда я использую docker exec -it angular-docker bash, чтобы зайти в контейнер, я получаю ответ, когда я curl localhost:4200.

Мое окружение:

  • ОС: Windows 10 Pro Версия 10.0.16299 Build 16299
  • Докер: 18.03.1-ce-win65 (17513)

Я подумал, что это может быть проблема с брандмауэром. Поэтому для отладки я закрыл приложение брандмауэра (я использую Kaspersky Internet Security), но не повезло.

Почему я не могу получить доступ к контейнеру из открытого порта?

EDIT:

netstat -an | findstr ":4200" возвращает следующее:

Proto  Local Address          Foreign Address        State
TCP    0.0.0.0:4200           0.0.0.0:0              LISTENING
TCP    [::1]:4200             [::]:0                 LISTENING

Ответы [ 4 ]

0 голосов
/ 13 мая 2018

Вы не можете использовать значение по умолчанию npm start из коробки в контейнере Docker.

Одной из альтернатив является обновление этой команды в package.json для запуска ng serve -H 0.0.0.0 следующим образом:

"start": "ng serve -H 0.0.0.0"

Этот дополнительный -H 0.0.0.0 предназначен для прослушивания всех интерфейсов из контейнера.

Тогда, когда ваши сопоставления портов работают, вы должны получить свой сайт на желаемом порту localhost:4200 с хост-машины.

0 голосов
/ 13 мая 2018

Попробуй измениться так

services: 
 application:
   container_name: angular-docker
   image: Your_image_build_from_docker_file
   ports:
    - "4200:4200"
   volumes:
    - ./src:/usr/src/app/src
0 голосов
/ 13 мая 2018

Не могли бы вы проверить http://127.0.0.1:4200

На многих серверах Linux я сталкиваюсь с проблемой, когда «localhost» разрешается в «:: 1» как ipv6, в то время как приложение настроено только на прослушивание адресов ipv4. Двойная проверка с "127.0.0.1" может понять это.

0 голосов
/ 12 мая 2018

Когда вы используете EXPOSE в Docker, порт остается доступным для TCP-соединений с другими контейнерами в вашей Docker-сети.Если вы хотите иметь возможность подключить порт с помощью http, вам следует сопоставить порты с вашего локального компьютера с портом контейнера.

PORTS
 -3000:3000

Если первый порт - это порт на вашем локальном компьютере, а второй - на контейнере.

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