我有这个简单的 Java SOAP 服务,它在本地计算机上运行良好。
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class EchoService {
@WebMethod
public String echo(@WebParam(name = "message") String message) {
return message;
}
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/echoservice", new EchoService());
System.out.println("Service published at http://localhost:8080/echoservice");
}
}
当我在本地启动此服务时,我可以通过 http://localhost:8080/echoservice 访问该服务
然后我尝试使用docker并部署容器化版本。这是我的 Dockerfile
FROM maven:3.8.4-openjdk-11 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/*.jar ./app.jar
COPY --from=build /app/target/libs ./libs
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
启动容器后,我可以看到服务器正在运行,但无法再通过 http://localhost:8080/echoservice 访问。
这里应该出现什么问题? 这与 Docker 网络接口有关吗? 有办法解决这个问题吗?
简短的回答,EXPOSE 只是一个文档工具,您需要通过使用 docker run -p 8080:8080 [image-name] 运行映像来实际将端口发布到您的主机
https://docs.docker.com/engine/reference/builder/#expose
EXPOSE指令实际上并不发布端口。它充当构建映像的人员和运行容器的人员之间的一种文档,有关要发布哪些端口。要在运行容器时发布端口,请在 docker run 上使用 -p 标志来发布和映射一个或多个端口,或使用 -P 标志来发布所有公开的端口并将它们映射到高位端口。