我有这个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。已确认Web服务在容器内部使用“telnet localhost 56808”进行响应。来自主机的Telnet立即返回已关闭的连接:
$ telnet localhost 56808
Trying 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绑定到网络接口。这意味着当你使用url作为http://0.0.0.0:56808/mediehub/search/services/SearchWS?wsdl
时,它会绑定到localhost:56808
。
现在在容器内部,localhost
将指向容器的loopback接口,它只会在流量来自容器内部时才会回答。当您尝试映射此端口或其他容器尝试在56808
到达此容器时,请求将在eth0
或容器的类似接口上发出。
但你的绑定只对localhost:56808
。要解决此问题,您需要将其绑定到所有可用的接口,这可以通过绑定到0.0.0.0:56808
来完成。 0.0.0.0
是一个特殊的IPv4地址,用于绑定所有可用的接口
尝试使用此格式,如文档
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'"