Как отправить HTTP-запросы на мой сервер, работающий в Docker-контейнере?
Я установил Java-приложение, которое работает как веб-сервер и обрабатывает http-запросы. Я проверял, что он работает вне контейнера (что он делает), но когда в контейнере мои запросы, кажется, не доходят до него.
Сервер прослушивает порт 3971, и файл Docker выглядит так:
FROM java:8
ADD VaultServer /
EXPOSE 3971
EXPOSE 3972
ENTRYPOINT ["java", "-jar", "VaultServer.jar"]
Вызов корневого адреса должен что-то вернуть (обычно я посылаю GET по http://localhost:3971/).
Я попытался заменить localhost на ip-адрес docker-machine, а также на ip-адрес, который я получаю при проверке работающего контейнера на моем сервере, но ни один из них не отвечает. Когда я звоню по ip-адресу docker-machine, я получаю ERR_CONNECTION_REFUSED. Есть ли что-то еще, что мне нужно включить?
5 ответов
Вы делаете EXPOSE 3972, которая предоставляет порт другим связанным контейнерам, но НЕ хост-машине
Чтобы выставить порт на хост-машине, вы делаете...
docker run -p 3972:3972 ....... etc
Вы также можете сделать...
docker run -P
который выставляет все порты, выставленные EXPOSE для хоста (это не значение по умолчанию - вы должны использовать флаг -P здесь)
Вы используете Docker Toolbox???
В моем случае обычная установка докера не работала на моей Windows 10, поэтому мне пришлось установить панель инструментов Docker; Docker Toolbox добавляет виртуальную машину, на которой Docker запускает все свои контейнеры.
Например, чтобы получить доступ к моим докеризированным приложениям, я должен использовать: http://192.168.99.100:8080/app.
Здесь 192.168.99.100 - это виртуальная машина ip.
Надеюсь, это поможет вам!!!!
Используйте "action="http://192.168.99.100:8080/rest/data/ingest"в своем html для ссылки на путь отдыха вашего контейнера Docker. См. Нижний HTML-код, строка 4.
http://192.168.99.100:8080/rest/data/ingest Разбивка:
1) 192.168.99.100:8080= IP-адрес док-станции и номер порта.
2) / rest / = В вашем файле web.xml
3) data / = @Path ("/ data")
4) / ingest = @Path ("/ ingest")
HTML-код:
<html>
<body>
<h1>Data Ingest: Web Uploader</h1>
<form action="http://192.168.99.100:8080/rest/data/ingest" method="post" enctype="multipart/form-data">
<p>Select files
: <input type="file" name="file" size="10000000" multiple/> </p>
<input type="submit" value="Upload Files"/>
</form>
</body>
</html>
КОД JAVA:
@Path("/data")
public class YourClass {
@POST
@Path("/ingest")
public Response yourMethod (...){
}
Я могу показать вам, как я создаю основной проект dotnet с другими контейнерами (MSSQL и Elasticsearch), возможно, это вам поможет.
Чтобы docker-compose.yml добавил зависимости для другого контейнера:
services:
prime.web:
image: prime.web
build:
context: ./Prime.Web
dockerfile: Dockerfile
links:
- sql.data
- elasticsearch
sql.data:
image: microsoft/mssql-server-linux
elasticsearch:
image: elasticsearch
И напишите в docker-compose.override.yml, где вы переопределите свой файл настроек приложения и получите доступ к другому контейнеру:
services:
prime.web:
environment:
- 'ConnectionStrings:primekinetics=Server=tcp:sql.data,1433;InitialCatalog=prime;User ID=sa;Password=Pass@word;Connection Timeout=30;'
- 'ElasticSearchConnection=http://elasticsearch:9200/'
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "5105:80"
sql.data:
environment:
- SA_PASSWORD=Pass@word
- ACCEPT_EULA=Y
ports:
- "5433:1433"
elasticsearch:
ports:
- "9200:9200"
Я надеюсь, что это будет полезно.
Сначала создайте докер образ с тегом.
Затем, используя команду запуска, вы фактически сопоставляете порт на своем хост-компьютере с портом в вашем контейнере.
$ docker image build -t your-docker-image-name-which-has-api-server .
$ docker run --rm -it -p 8000:8000/tcp your-docker-image-name-which-has-api-server:latest
Отправляйте свои HTTP-запросы с помощью клиента httpie.
http -v http://localhost:8080