【问题标题】:docker-compose: Exposing port of docker image to hostdocker-compose:将 docker 镜像的端口暴露给主机
【发布时间】:2017-10-03 13:58:37
【问题描述】:

我有这个 docker-compose.yml sn-p,它旨在将 Maven 构建的 Java SOAP 端点暴露给其他 docker 映像(不包含在 sn-p 中,但它们可以工作):

mocksumma: image: openjdk:9-jdk ports: - "56808:56808" expose: [56808] volumes: - ./mocksumma/target/mocksumma-1.0-SNAPSHOT.jar:/mocksumma.jar #command: "sleep 10000000000" command: "java --add-modules java.se.ee -jar /mocksumma.jar 'http://localhost:56808/mediehub/search/services/SearchWS?wsdl'"

我还想从我的主机环境(Ubuntu 17.04、docker compose 1.8.1、docker 1.12.6)访问它,但是在访问http://localhost:56808 时,我要么关闭连接,要么遇到 ERR_SOCKET_NOT_CONNECTED。已确认 Web 服务可以使用容器本身内的“telnet localhost 56808”进行响应)。来自主机的 Telnet 立即返回连接关闭:

$ telnet localhost 56808 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Connection closed by foreign host.

我的理论是,由于某种原因,端口没有暴露或转发(端口)到主机,因为我忽略或误解了某些东西。

建议?

【问题讨论】:

  • 如果它在容器内使用 telnet,然后尝试使用主机系统中的 telnet 测试它(而不是使用那里的浏览器)。这有助于故障排除。
  • @YannicHamann 添加 telnet 输出
  • 你的端口配置没问题。客户端可以连接。似乎又是一个问题。当您在那里使用 telnet 时,立即关闭容器内的连接?
  • @YannicHamann 有趣。现在这也失败了。我今天先走了,明天再来。到目前为止,谢谢。
  • 尝试将您的命令更改为command: "java --add-modules java.se.ee -jar /mocksumma.jar 'http://0.0.0.0:56808/mediehub/search/services/SearchWS?wsdl'

标签: docker docker-compose


【解决方案1】:

你应该把你的命令改成

command: "java --add-modules java.se.ee -jar /mocksumma.jar 'http://0.0.0.0:56808/mediehub/search/services/SearchWS?wsdl'"

所以更新的撰写文件将是

 mocksumma:
    image: openjdk:9-jdk
    ports:
    - "56808:56808"
    expose: [56808]
    volumes:
    - ./mocksumma/target/mocksumma-1.0-SNAPSHOT.jar:/mocksumma.jar
    #command: "sleep 10000000000"
    command: "java --add-modules java.se.ee -jar /mocksumma.jar 'http://0.0.0.0:56808/mediehub/search/services/SearchWS?wsdl'"

查看在容器内运行的命令,我假设您的 mocksumma.jar 文件根据参数 url 绑定到网络接口。这意味着当您使用 use url as http://0.0.0.0:56808/mediehub/search/services/SearchWS?wsdl 时,它会绑定到 localhost:56808

现在在容器内localhost 将指向容器的环回接口,并且它只会在流量来自容器本身时才响应。当您尝试映射此端口或另一个容器尝试通过56808 到达此容器时,请求将来自eth0 或容器的类似接口。

但您的绑定仅针对localhost:56808。要解决此问题,您需要将其绑定到所有可用接口,这可以通过绑定到0.0.0.0:56808 来完成。 0.0.0.0 是一个特殊的 IPv4 地址,用于绑定到所有可用的接口

【讨论】:

    【解决方案2】:

    尝试使用这种格式,例如文档

    https://docs.docker.com/compose/compose-file/#expose

    例子

     mocksumma:
    image: openjdk:9-jdk
    ports:
    - "56808:56808"
    expose: 
    - "56808"
    volumes:
    - ./mocksumma/target/mocksumma-1.0-SNAPSHOT.jar:/mocksumma.jar
    #command: "sleep 10000000000"
    command: "java --add-modules java.se.ee -jar /mocksumma.jar 'http://localhost:56808/mediehub/search/services/SearchWS?wsdl'"
    

    【讨论】: