Я впервые экспериментирую с Docker и пытаюсь запустить веб-приложение Spring Boot внутри контейнера Docker. Я создаю приложение (которое упаковывается в автономный jar-файл) и затем добавляю его в образ Docker (это то, что я хочу).
Вы можете найти мой SSCCE по этому Репозиторий загрузки на GitHub, в README которого есть все инструкции для воспроизведения того, что я вижу. Но в основном:
- Я встраиваю веб-приложение в банку
- Запустите
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. Вы можете убедиться в этом сами, запустив приложение вне докера (то есть только локально на вашем хост-компьютере), запустив ./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
зашел в контейнер и запустил еще 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, который даже удалено не отделен от моего приложения (проверьте исходный код, убедитесь сами)!!!
./gradlew clean build && java -jar build/libs/bootup.jar
, вы увидите, что он запускается нормально. Поэтому, когда вы запускаете это локально на своем хосте, оно раскручивается и без проблем обслуживает контент изhttp://localhost:9200
. Это только кажется, когда он запускается изнутри контейнера Docker, где что-то, кажется, душит его или заставляет его действовать шатко. Как выглядит мойDockerfile
? Другими словами, это не проблема моего приложения (как отдельного приложения), это проблема моего приложения, работающего в Docker. - person smeeb   schedule 26.08.2016docker build
заработает, и мне неудобно запускать ваш код вне песочницы. - person BMitch   schedule 26.08.2016docker-machine ls
2)docker-machine ip default
- person Andrea Di Lisio   schedule 28.08.2016docker --version
, он говорит мне 1.12.0. (1) Выводdocker-machine
был очень большим, но начинался сUsage: docker-machine [OPTIONS] COMMAND [arg...]
. И (2) выводdocker-machine ip default' is
Host не существует: по умолчанию`. - person smeeb   schedule 28.08.2016curl
был от хоста - что вы получаете за тот жеcurl
из контейнера? - person creativeChips   schedule 29.08.2016curl http://localhost:9200
, я получуcurl: (7) Failed to connect to localhost port 9200: Connection refused
. Мы на что-то, может быть?!? Еще раз спасибо! - person smeeb   schedule 29.08.2016bootup.jar
на самом деле уже запущен. Пожалуйста, смотрите мои обновления со скриншотами... это что-нибудь значит для вас?!? Итак, похоже, что мое приложение отправляет правильный HTML-код (см. 2-й снимок экрана), но по какой-то причине браузеру это не нравится... и, отвечая на ваш вопрос, нет< /b>, если я укажу браузеруhttp://127.0.0.1:9200
, он буквально получит пустой ответ, и ничего не будет доступно, если я Просмотр исходного кода страницы. - person smeeb   schedule 29.08.2016Network
инструментов разработчика? Особенно код состояния и ответ (внутренняя вкладкаResponse
) - person Nitzan Tomer   schedule 29.08.2016Network
в Chrome Developer Tools. Кажется, нигде нет вкладкиResponse
, не знаю, что это означает. - person smeeb   schedule 29.08.2016http://0.0.0.0:9200
, я получаю точно такие же результаты, как если бы я перешел кhttp://127.0.0.1:9200
(см. выше). - person smeeb   schedule 29.08.2016curl
? Поделись, пожалуйста. Не мешало бы посмотреть иwget
тоже... - person creativeChips   schedule 29.08.2016curl http://localhost:9200 curl: (52) Empty reply from server
и я не ожидаю, чтоwget
будет другим. Также я очистил все кеши и даже зашел вhttp://localhost:9200
из браузеров, которые раньше даже не открывал. Нет разницы. - person smeeb   schedule 29.08.2016<vmip>
— это IP-адрес моего докер-контейнера. Вы предлагаете мне попытаться подключиться к нему по телнету или что-то в этом роде?!? - person smeeb   schedule 29.08.2016