如何将HTTP请求发送到在docker容器中运行的服务器?

时间:2016-03-31 16:11:32

标签: java http docker webserver

我已经设置了一个java应用程序,它充当Web服务器并处理http请求。我已经测试过它在容器外面工作了(它确实如此),但是在容器中我的请求似乎没有达到它。

服务器侦听端口3971,Dockerfile如下所示:

FROM java:8
ADD VaultServer /
EXPOSE 3971
EXPOSE 3972
ENTRYPOINT ["java", "-jar", "VaultServer.jar"]

调用根地址应该返回一些东西(通常我会发送一个GET到http://localhost:3971/)。

我尝试用docker-machine的ip地址替换'localhost',并且在检查我的服务器的运行容器时用ip地址替换,但似乎都没有响应。当我调用docker-machine的ip地址时,我得到了ERR_CONNECTION_REFUSED。我需要启用其他东西吗?

4 个答案:

答案 0 :(得分:13)

你正在做EXPOSE 3972,它将端口暴露给其他链接的容器,但不暴露给主机

要将端口暴露给您执行的主机...

docker run -p 3972:3972 ....... etc

你也可以......

docker run -P

暴露EXPOSE暴露给主机的所有端口(这不是默认值 - 你必须在这里使用-P标志)

答案 1 :(得分:1)

您正在使用Docker Toolbox吗?

就我而言,正常的docker安装在Windows 10上无法正常运行,因此我必须安装Docker工具箱。 docker工具箱添加了一个虚拟机,其中docker运行了所有容器。

例如,要访问我的dockerized应用,我必须使用:http://192.168.99.100:8080/app

在这里,192.168.99.100是虚拟机ip。

希望对您有帮助!!!!

答案 2 :(得分:0)

使用html中的“action =”http://192.168.99.100:8080/rest/data/ingest“来引用您的Docker容器的Rest路径。请参阅底部HTML代码,第4行。

http://192.168.99.100:8080/rest/data/ingest细分:

1)192.168.99.100:8080 = Docker的IP地址&港口 #。

2)/ rest / =在你的web.xml文件中

3)data / = @Path(“/ data”)

4)/ ingest = @Path(“/ ingest”)

HTML CODE:

<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 CODE:

@Path("/data")
public class YourClass {

@POST
@Path("/ingest")
public Response yourMethod (...){
}

答案 3 :(得分:0)

我可以向您展示我如何使用其他容器(MSSQL和Elasticsearch)构建dotnet核心项目,也许它会对您有所帮助。

要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中写入,您将覆盖您的appsetting文件,并将访问另一个容器:

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"

我希望它会有所帮助。

相关问题