【问题标题】:How to send HTTP requests to my server running in a docker container?如何将 HTTP 请求发送到在 docker 容器中运行的服务器?
【发布时间】:2016-07-20 05:02:32
【问题描述】:

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

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

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

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

我尝试将 'localhost' 替换为 docker-machine 的 IP 地址,以及我在检查服务器的运行容器时获得的 IP 地址,但似乎都没有响应。当我调用 docker-machine 的 IP 地址时,我得到 ERR_CONNECTION_REFUSED。还有什么我需要启用的吗?

【问题讨论】:

  • 什么是 docker run 命令行?您是否发布了端口 3972? (-p 3972:3972)
  • 这只是'docker run vault-server'。抱歉,我仍然在处理 docker。如果 Dockerfile 必须公开端口,为什么我必须发布端口?

标签: java http docker webserver


【解决方案1】:

您正在执行 EXPOSE 3972,它将端口暴露给其他 链接 容器,但不暴露给主机

要将端口暴露给您所做的主机...

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

你也可以...

docker run -P

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

【讨论】:

  • 它说'"docker run" 需要至少 1 个参数。'
  • 在你常用的 docker run 参数之外提供这个标志
【解决方案2】:

你在使用 Docker 工具箱吗???

在我的情况下,正常的 docker 安装在我的 Windows 10 上不起作用,所以我必须安装 Docker 工具箱; docker 工具箱添加了一个虚拟机,docker 在其中运行所有容器。

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

这里,192.168.99.100是虚拟机ip。

希望对你有帮助!!!!

【讨论】:

    【解决方案3】:

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

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

    1) 192.168.99.100:8080= Docker 的 IP 地址和端口号。

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

    3) 数据/= @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 (...){
    }
    

    【讨论】:

    • 地狱基因...硬编码本地网址!
    • @yUdoDis 用户名相关
    【解决方案4】:

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

    为 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"
    

    希望对你有所帮助。

    【讨论】:

      【解决方案5】:

      首先用标签构建docker镜像。

      然后使用运行命令,您实际上将主机上的端口映射到容器上的端口

      $ 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
      

      使用 httpie 客户端发送您的 HTTP 请求

      http -v http://localhost:8080
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 2020-08-22
        • 1970-01-01
        • 2017-06-04
        相关资源
        最近更新 更多