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