Как отправить 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
Другие вопросы по тегам