2016-08-13 4 views
4

Я экспериментировал с Docker сети, и я не могу найти способ, чтобы выполнить следующие действия:Сообщать Докер хозяина из Докер контейнера

Запустить простой сервер NetCat в хосте:

nc -l -p 5555 

, а затем связаться с этим сервером от в пределах контейнер-докер, например

# grab the docker network interface ip 
hostip=$(ip route | awk '/docker0/ { print $NF }') 
# pass in the docker network interface as a host and try a curl command 
docker run --add-host=docker:"${hostip}" --rm -it hiromasaono/curl curl docker:5555 

Запрос на завивание просто зависает, и сервер netcat хоста не получает запрос.

Если я вместо этого начать докер с --net=host вариант, он работает:

docker run --net=host --rm -it hiromasaono/curl curl 127.0.0.1:5555 

и сервер Netcat принимает

GET/HTTP/1.1 
User-Agent: curl/7.35.0 
Host: 127.0.0.1:5555 
Accept: */* 

Как я могу общаться с простым сервером хоста NetCat внутри контейнера Докер без использования --net=host (по умолчанию --net=bridge)?

(FYI: Я бегу докер клиент/сервер 1.11.2)

Potentailly Соответствующие ресурсы Я Изученные в поисках ответа:

ответ

-1

Есть несколько вещей, которые вам необходимо изучить, чтобы решить эту проблему.

  1. Netcat должен прослушивать все интерфейсы (или, по крайней мере, на интерфейсе, к которому могут подключаться клиенты Docker). Не на локальном хосте. После того, как вы запустите netcat -l -p 5555, если в другом терминале вы запустите netstat -a -l -n | grep 5555, вы должны увидеть 0.0.0.0:5555 или *:5555. Если вместо этого вы увидите 127.0.0.1:5555, тогда это не сработает, и вам сначала нужно решить эту проблему, прежде чем смотреть в Docker.
  2. Docker должен иметь возможность выполнить ping docker хост, и он не должен разрешаться до 127.0.0.1. Попробуйте docker run --net=host --rm -it hiromasaono/curl ping docker. Если вы видите, что это pinging 127.0.0.1, то ваша конфигурация неверна, и вам нужно исправить эту строку: hostip=$(ip route | awk '/docker0/ { print $NF }'). Если это не 127.0.0.1, но пинги не преуспевают, значит, ваша настройка сети неправильная или неправильный хостинг.
+0

Спасибо за ваш ответ. 1. Выглядит хорошо для меня: 'tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN' 2. Ping успешный с и без' --net = host', предполагая, что имя хоста докера установлено как описанный в моем вопросе –

+0

Могут ли быть блокировки брандмауэра на порт 5555? Если имя хоста docker не указывает на 127.0.0.1, и вы можете выполнить ping IP-адрес, который указывает на него из контейнера докера, тогда моя догадка - это брандмауэр на хосте. –

+0

Еще раз спасибо за ответ: у меня нет активных брандмауэров, насколько я могу судить. Можете ли вы успешно связаться с портом «LISTEN» хоста из контейнера докеров? –

0

Насколько я понимаю, на основе двух замечаний [1][2], следующий неофициальный хак, кажется, работает для меня на сегодня (2016.10.27):

В Dockerfile для приложения, которое необходимо для подключения к хосту Докера, я добавил следующие строки:

... 
# netstat 
RUN apt-get update && apt-get install net-tools -y 
... 
CMD (netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2" dockerhost"}' >> /etc/hosts) && \ 
     ...old CMD line... 
... 

Это, кажется, делает хозяин Docker доступным мне внутри контейнера как dockerhost.


Примечание для будущих читателей: см также https://github.com/docker/docker/issues/23177 — как письма, этот вопрос остается открытым, так что есть ненулевая вероятность, что может стать официальным в какой-то момент в будущем и замещают любые обходные пути; хотя он также может быть закрыт и уволен, как это случилось с его различными предшественниками.