Нет маршрута к хосту в контейнере docker - PullRequest
8 голосов
/ 07 марта 2020

Я запускаю контейнер Debian docker на машине Windows 10, которой требуется доступ к определенному URL-адресу на порту 9000 (164.16.240.30:9000)

Хост-машина может получить к нему доступ через браузер Однако, когда я вхожу в терминал и запускаю wget 172.17.240.30:9000, я получаю failed: No route to host.

В попытке решить эту проблему я добавил:

ports:
  - 9000:9000

к docker - Файл compose.yml, однако, похоже, ничего не изменил.

Если вы не можете догадаться, что я новичок в этом, что бы вы попробовали дальше?

Весь docker -compose.yml file:

version: '3.4'

services:
  tokengeneratorapi:
    network_mode: host
    image: ${DOCKER_REGISTRY}tokengeneratorapi
    build:
      context: .
      dockerfile: TokenGeneratorApi/Dockerfile
    ports:
      - 5000:80
      - 9000
    environment:
      ASPNETCORE_ENVIRONMENT: local
      SSM_PATH: /ic/env1/tokengeneratorapi/
      AWS_ACCESS_KEY_ID: 
      AWS_SECRET_ACCESS_KEY: 

Команда, которую я выполняю:

docker-compose build --build-arg BRANCH=featuretest --build-arg CHANGE_ID=99 --build-arg CHANGE_TARGET=develop --build-arg SONAR_SERVER=164.16.240.30

Ответы [ 4 ]

1 голос
/ 12 марта 2020

Ваш браузер имеет доступ к 164.16.240.30:9000, потому что он проходит через прокси (типичная среда enteprise), поэтому the proxy имеет сетевое подключение к 164.16.240.30. Это не значит, что ваш хост имеет такое же сетевое соединение. На самом деле, похоже, что у вашего хоста такого нет. Вот почему прямой wget из контейнера или из терминала имеет ошибку No route to host.

Все должно go через прокси. Попробуйте правильно настроить прокси - linux приложения обычно используют переменные среды http_proxy,https_proxy, но приложения могут иметь собственную опцию для настройки прокси, в конце концов вы можете настроить ее на уровне исходного кода. Это зависит от используемого приложения / кода.

1 голос
/ 16 марта 2020

Я думаю, что проблема в том, что вы используете режим хоста в файле конфигурации docker compose, и разрешен ли вам брандмауэр IPTABLES для портов на компьютере с Debian? Как насчет windows?

network_mode: host 

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

nestat -tunlp | grep 5000

И вы увидите, что порт 5000 не открыт и сопоставлен с 80 из docker, как и следовало ожидать. Однако порты 80 и 9000 должны быть открыты в сети Debian, но не привязаны ни к какому docker мосту, а только к IP-адресу Debian

Отсюда: https://docs.docker.com/network/host/

ВНИМАНИЕ: Опубликованные порты отбрасываются при использовании режима хост-сети

В качестве решения может быть удаление строки network_mode, и она будет работать, как ожидается.

1 голос
/ 08 марта 2020

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

Проверьте https://docs.docker.com/compose/compose-file/#network_mode и попробуйте установить его на хост.

0 голосов
/ 16 марта 2020

Ваш код не разрешает вашему контейнеру доступ к 164.16.240.30:9000. Вы должны получить 164.16.240.30:9000 из терминала вместо 172.17.240.30:9000.

...