2015-11-10 4 views
2

Моя установка заключается в следующем:Docker внутри Linux VM не может подключиться к веб-приложению

Host: Win10 
Guest: Ubuntu 15.10 (clean install, only docker and nodejs are added) 
Base image: https://hub.docker.com/r/microsoft/aspnet/ 1.0.0-beta8-coreclr 

Внутри гостя я установил Докер и созданный образ (добавлен образец веб-приложение с помощью YEOMAN к изображению выше). Когда я запускаю изображение внутри контейнера, я могу ping IP-адрес контейнера успешно использовать IP-адрес контейнера из Linux (например, 172.17.0.2).

$sudo docker run -d -p 80:5000 --name web myapp 

$sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' "web" 
172.17.0.2 

$ping 172.17.0.2 
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. 
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.060 ms 
1 packets transmitted, 1 received, 0% packet loss, time 999ms 

$curl 172.17.0.2:80 
curl: (7) Failed to connect to 172.17.0.2 port 80: Connection refused 

Я также могу подключиться к контейнеру и выполнять команды, как пинг, однако из Linux машины (гостя в VirtualBox, хост для докер) я не могу получить доступ к веб-приложение, размещенную внутри контейнера, как показано выше. Я попробовал несколько подходов, таких как сопоставление с IP-адресами хоста и т. Д., Но ни один из них не работал. У кого-нибудь есть идеи, с чего начать? Проблема связана с тем, что докер установлен внутри машины VirtualBox?

Заранее спасибо.

Edit: Вот бревна из контейнера:

Could not open /etc/lsb_release. OS version will default to the empty string. 
Hosting environment: Production 
Now listening on: http://localhost:5000 
Application started. Press Ctrl+C to shut down. 
+0

Является ли ваше веб-приложение прослушиванием порта 5000? – Gerrat

+0

Да, порт 5000 (это значение по умолчанию для сервера, на котором запущено ядро ​​dotNet). Я даже зарегистрировался в контейнере и попытался запустить сервер снова на этом порту, но появляется сообщение о том, что порт уже подключен к слушателю (предположим, что сервер работает как ожидалось). –

+0

Возможно, контейнеру нужно некоторое время для запуска. Не могли бы вы запустить 'docker logs web', чтобы узнать, полностью ли запущено приложение внутри контейнера? – Gonfva

ответ

2

Ваша команда говорит докер, по существу, прокси-запросы на 80 порт гостя Linux на порт 5000 контейнера. Таким образом, команда curl, которую вы пробовали, не работает, потому что вы пытаетесь использовать порт 80 на контейнере, в то время как сам контейнер имеет услугу, прослушивающую порт 5000.

Чтобы подключиться к контейнеру напрямую, вы должны использовать (on гость Linux):

curl 172.17.0.2:5000 

Для доступа через порт опубликованного на гостя Linux (от хоста):

curl (Linux guest IP) 

Или (от гостя Linux):

curl localhost 

Edit: Это также может оказаться проблематичным:

Now listening on: http://localhost:5000 

Вы хотите, чтобы ваше приложение внутри контейнера, чтобы связать все интерфейсы (0.0.0.0), так он прослушивает назначенный IP контейнера. С localhost он не будет доступен.

Вы можете найти этот пример полезным:

https://github.com/aspnet/Home/blob/dev/samples/1.0.0-beta8/HelloWeb/project.json

Эта строка указывает, что приложение привязки ко всем интерфейсам (с использованием "*") на порт 5004:

21   "kestrel": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.Kestrel --server.urls http://*:5004" 

Вы будете нужна аналогичная конфигурация.

+0

Когда я впервые попытался просто получить доступ к контейнеру с помощью порта 5000, это не удалось (как видно здесь http://pastebin.com/zNELZiY5). Затем я попытался изменить Dockerfile/project.json, как вы сказали, и все начинает работать безупречно! Большое спасибо! –

Смежные вопросы