Хост 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
:
картину исходный код http://localhost:9200
:
изображение инструментов разработчика Chrome проверки страница в http://localhost:9200
:
картинка Network
вкладка в инструментах разработчика Chrome:
что, черт возьми, здесь происходит?!?!? согласно источнику, браузер должен отображать мой Ну привет, из Докерленда! сообщение просто замечательно. Согласно фактической странице браузера, похоже, что есть сеть ошибка. И согласно инструментам разработчика 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 справочная документация по порядку загрузки для внешней конфигурации
предполагая, что вы используете 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