我有这个docker-compose.yml片段,该片段旨在将由Maven构建的Java中的SOAP端点公开给其他docker图像(不包含在片段中,但它们可以工作):
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。已使用容器本身内的“telnet localhost 56808”确认该Web服务响应。来自主机的Telnet立即返回关闭的连接:
$ telnet localhost 56808Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.Connection closed by foreign host.
我的理论是,由于某种原因,端口没有暴露或转发(端口)给主机,因为我忽略或误解了某些内容。

有什么建议吗?

最佳答案

您应该将命令更改为

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绑定(bind)到网络接口(interface)。这意味着当您使用url作为http://0.0.0.0:56808/mediehub/search/services/SearchWS?wsdl时,它会绑定(bind)到localhost:56808

现在,在容器内部,localhost将指向容器的环回接口(interface),并且仅当流量来自容器内部时才回答。当您尝试映射此端口或另一个容器尝试通过56808到达此容器时,请求来自eth0或该容器的类似接口(interface)。

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

关于docker - docker-compose:将docker镜像的端口暴露给主机,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46546430/

10-16 06:06