Хост Mac не любит переадресацию портов контейнера Docker

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

вы можете найти SSCCE в этом загрузочное РЕПО на GitHub, у которого README есть все инструкции, чтобы воспроизвести то, что я вижу. Но в основном:

  • я строю веб-приложение в jar
  • выполнить docker build -t bootup ., который преуспевает
  • выполнить docker run -it -p 9200:9200 -d --name bootup bootup и затем контейнер, кажется, запускается просто отлично, как свидетельствует docker ps вывод
  • однако, когда я указываю в браузере http://localhost:9200, Я ничего не получаю

docker ps выход:

CONTAINER ID        IMAGE               COMMAND                  CREATED
a8c4ee64a1bc        bootup              "/bin/sh -c 'java -ja"   2 days ago

STATUS              PORTS                    NAMES
Up 12 seconds       0.0.0.0:9200->9200/tcp   bootup

веб-приложение настроено для работы на порту 9200, не значение по умолчанию Java 8080. Вы можете увидеть это сами, запустив приложение за пределами docker (так, только локально на главной машине), запустив ./gradlew clean build && java -jar build/libs/bootup.jar.

насколько мне известно, на моем хосте нет брандмауэра, который блокировал бы порты (я на Mac 10.11.5 и проверил это System Preferences >> Security & Privacy >> Firewall выключено).

кто-нибудь может определить, где я иду не так?


обновления:

Я побежал curl, netstat и lsof на хозяин:

HOST:
curl http://localhost:9200
curl: (52) Empty reply from server

netstat -an | grep 9200
tcp6       0      0  ::1.9200               *.*                    LISTEN     
tcp4       0      0  *.9200                 *.*                    LISTEN 

lsof -n -i4TCP:9200 | grep LISTEN
com.docke 2578 myuser   19u  IPv4 <someHexNumber>      0t0  TCP *:wap-wsp (LISTEN)

а то docker exec'D в контейнер и побежал другой netstat:

CONTAINER:
netstat -an | grep 9200
bash: netstat: command not found

обновление с фотографиями:

изображение моего браузера (Chrome) указано на http://localhost:9200:

enter image description here

картину исходный код http://localhost:9200:

enter image description here

изображение инструментов разработчика Chrome проверки страница в http://localhost:9200:

enter image description here

картинка Network вкладка в инструментах разработчика Chrome:

enter image description here

что, черт возьми, здесь происходит?!?!? согласно источнику, браузер должен отображать мой Ну привет, из Докерленда! сообщение просто замечательно. Согласно фактической странице браузера, похоже, что есть сеть ошибка. И согласно инструментам разработчика Chrome, мое приложение возвращает все виды содержимого HTML/CSS/JS, которое даже не удаленно кроме моего приложения (проверьте исходный код, убедитесь сами)!!!

4 ответов


собираюсь добавить еще один ответ здесь, потому что я видел что-то, связанное с репозиторием Github, который вы опубликовали:

таким образом, РЕПО - это весеннее загрузочное РЕПО с приложением.файл yml.

ваш Dockerfile выглядит следующим образом:

FROM openjdk:8

RUN mkdir /opt/bootup

ADD build/libs/bootup.jar /opt/bootup
WORKDIR /opt/bootup
EXPOSE 9200
ENTRYPOINT java -jar bootup.jar

который добавляет встроенный jar к изображению. Если мое понимание верно, кувшин не входят приложения.в формате YML потому что:

  • это не часть сборки (gradle будет упаковывать только src / main). Он находится в корневой папке проекта
  • он явно не добавлен в Docker

таким образом, можно предположить, что ваше приложение фактически работает на 8080 (по умолчанию) на данный момент?

несколько вариантов, которые можно попробовать:

  • попробуйте разоблачить 8080 вместо 9200 (или разоблачить оба) и посмотреть, имеет ли это значение?
  • команда entrypoint может добавить порт --server.port=9200
  • приложение.файл yml должен быть добавлен к изображению (вам может потребоваться добавить аргумент, чтобы правильно ссылаться на него) [ADD application.yml /opt/bootup, после ]
  • включить приложения.YML-файл в src / main / resources, чтобы весенняя загрузка могла забрать его автоматически.

ссылки

Spring Boot справочная документация по порядку загрузки для внешней конфигурации


файл Dockerfile не предоставляет демону 9200. Добавить

EXPOSE 9200

в Dockerfile перед ENTRYPOINT


предполагая, что вы используете Docker Toolbox, а не бета-версию ...

есть 3 этапа для экспонирования правильно порт:

  • использовать EXPOSE 8080 где 8080-это просто номер порта в Dockerfile
  • используйте-p 8080: 8080 в вашем docker выполнить команду
  • убедитесь, что вы настроили перенаправление портов в виртуальном окне Oracle, чтобы машина boot2docker могла получать запросы от порта 8080.

это относится как к Windows, так и к OSX, где используется Docker Toolbox. Linux не использует Oracle VirtualBox для запуска docker, поэтому этим хостам не нужно делать третий пункт


Я запустил ваше РЕПО как есть на Docker 1.12 на OSX.

если вы внимательно посмотрите на свой запуск контейнера:

2016-08-29 20:52:31.028  INFO 5 --- [           main] o.eclipse.jetty.server.ServerConnector   : Started ServerConnector@47949d1a{HTTP/1.1}{0.0.0.0:8080}
2016-08-29 20:52:31.033  INFO 5 --- [           main] .s.b.c.e.j.JettyEmbeddedServletContainer : Jetty started on port(s) 8080 (http/1.1)

хотя application.yml и Dockerfile оба содержат 9200 приложение, начиная с 8080