如何从 docker 容器内的应用程序发布 Web 服务?

How to publish a web service from an application inside a docker container?

我有一个发布 Web 服务的应用程序,我试图将它部署在 docker 容器上,但它不起作用。 我使用 javax.jws 中的 @WebService 和 @WebMethod 来声明我的服务,并使用

发布它
Endpoint.publish("http://localhost:8081/doctorservice",
                new DoctorServiceImplementation());

我的Dockerfile的内容是

FROM openjdk:8
ADD target/service-publisher.jar service-publisher.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","service-publisher.jar"]

我用

创建了 docker 图像
docker build -f Dockerfile -t webservice .

和运行它与

docker run --name webservice -p 8081:8081 -d webservice 

容器 运行s 和端口已公开,但当我尝试从浏览器访问 http://localhost:8081/doctorservice?wsdl 时,它不起作用。

乍一看,除了您尝试到达的地址外,您所做的一切都是正确的。 即使服务暴露,你也不在容器的 "localhost" 中,因此你应该使用容器的 ip。

TLDR,而不是 http://localhost:8081/doctorservice?wsdl 试试这个 http://<_CONTAINER_IP_ADDRESS_>:8081/doctorservice?wsdl

检查此答案以获取容器的 IP 地址:

How to get a Docker container's IP address from the host

我找到了问题的解决方案:我必须将服务发布到 0.0.0.0 而不是本地主机,所以我替换了

Endpoint.publish("http://localhost:8081/doctorservice",
                new DoctorServiceImplementation());

Endpoint.publish("http://0.0.0.0:8081/doctorservice",
                new DoctorServiceImplementation());

对于 docker 容器内的应用 运行