docker-compose:将Docker镜像的端口暴露给主机

我有这个docker-compose.yml代码片断,用于将由Maven构build的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时,我得到了连接closures或ERR_SOCKET_NOT_CONNECTED。 Web服务已经被确认为使用容器本身内部的“telnet localhost 56808”来响应)。 从主机Telnet立即返回连接closures:

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

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

build议?

你应该改变你的命令

 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的networking接口。 这意味着当您使用使用url作为http://0.0.0.0:56808/mediehub/search/services/SearchWS?wsdl它绑定到localhost:56808

现在在一个容器内, localhost将指向容器的回送接口,它只会在stream量来自容器本身时才会回答。 当您尝试映射此端口或另一个容器尝试到达此容器( 56808 ,请求将发送到容器的eth0或类似接口。

但是你的绑定只能到localhost:56808 。 为了解决这个问题,你需要把它绑定到所有可用的接口,可以通过绑定到0.0.0.0:56808来完成。 0.0.0.0是一个特殊的地址,用于绑定所有可用的接口

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

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