英文:
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
容器正在运行并且端口已暴露,但当我尝试从浏览器访问http://localhost:8081/doctorservice?wsdl时,它不起作用。
英文:
I have an application which publishes a web service and I tried to deploy it on a docker container but it doesn't work.
I used @WebService and @WebMethod from javax.jws to declare my service and I published it with
Endpoint.publish("http://localhost:8081/doctorservice",
new DoctorServiceImplementation());
The contents of my Dockerfile are
FROM openjdk:8
ADD target/service-publisher.jar service-publisher.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","service-publisher.jar"]
I created the docker image with
docker build -f Dockerfile -t webservice .
And run it with
docker run --name webservice -p 8081:8081 -d webservice
The container runs and the ports are exposed but when I try to access http://localhost:8081/doctorservice?wsdl from the browser it doesn't work.
答案1
得分: 2
我找到了解决我的问题的方法:我必须将服务发布到0.0.0.0而不是localhost,所以我替换了
Endpoint.publish("http://localhost:8081/doctorservice",
new DoctorServiceImplementation());
与
Endpoint.publish("http://0.0.0.0:8081/doctorservice",
new DoctorServiceImplementation());
用于在Docker容器内运行的应用程序。
英文:
I found the solution to my problem: I had to publish the service to 0.0.0.0 instead of localhost so I replaced
Endpoint.publish("http://localhost:8081/doctorservice",
new DoctorServiceImplementation());
with
Endpoint.publish("http://0.0.0.0:8081/doctorservice",
new DoctorServiceImplementation());
for the app running inside the docker container
答案2
得分: -1
一开始看,除了你试图访问的地址之外,你做得都正确。
即使服务已公开,你也不在容器的“localhost”上,因此你应该使用容器的IP地址。
简而言之,不要使用http://localhost:8081/doctorservice?wsdl,而是尝试这个http://<容器IP地址>:8081/doctorservice?wsdl。
查看这个答案以获取容器的IP地址:
https://stackoverflow.com/questions/17157721/how-to-get-a-docker-containers-ip-address-from-the-host
英文:
At first glance, you did everything correct except for the address you are trying to reach.
Even if the service is exposed you are not in the "localhost" of the container, hence you should use the ip of the container.
TLDR, instead of http://localhost:8081/doctorservice?wsdl try this http://<CONTAINER_IP_ADDRESS>:8081/doctorservice?wsdl
Check this answer to fetch the IP address of your container:
https://stackoverflow.com/questions/17157721/how-to-get-a-docker-containers-ip-address-from-the-host
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论