无法通过本地主机访问 docker 容器应用程序,通过 IP 访问超时

Cannot access docker container app by localhost, access by IP got timeout

我上周刚买了一台新电脑。所以我像往常一样在 Windows 10 中使用最新的 Windows Docker 桌面设置我的工作环境。然后创建了一个非常简单的 spring 引导 REST 服务只是为了打个招呼,3 天前使用 Spring 引导 Buildpacks 创建了映像,它在端口映射“docker 运行 上运行良好-p 8090:8080 davy/myapp”。这个图像即使在今天也能正常工作:即使在今天,我也可以通过“http://localhost:8090/sayHello”访问我的应用程序。

the working image

所以,我开始构建我的真实应用程序并完成了一些功能。我想测试我的应用程序并使用 spring boot Buildpacks 创建了一个新映像。

现在我遇到了一个大问题:我无法通过端口映射访问容器中的应用程序运行ning with port mapping “docker 运行 -p 8090:8080 davy/myapp” 不再是“http://localhost:8090/sayHello”。它得到一个错误页面说“本地主机没有发送任何数据”

cannot send data image

然后我通过“docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 548e29f46ca7”得到了我的容器IP,显示为“ 172.17.0.2/”。所以我尝试了http://172.17.0.2:8090/sayHello。现在我在等待一段时间后超时,我收到“172.17.0.2 响应时间太长”:

timeout image

我没有看到端口绑定有什么不同:都是 0.0.0.0:8090->8080/tcp

port binding for 2 images

我使用 Spring boot Buildpacks 多次 re-built 图像,1 次 Dockerfile 和 docker-compose.yml,但我无法使容器像不再是旧容器了。

我也试过“docker 运行 -p 8088:8080 davyhu/myapp -m http.server --bind 0.0.0.0”,结果一样结果:无法通过本地主机访问应用程序,并且 IP 超时。

在此先感谢您的帮助!


以下是更多信息:

pom.xml 构建包的配置(pom.xml 中的两个版本都没有变化):

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <image>
                    <name>davyhu/${project.artifactId}</name>
                </image>
            </configuration>
        </plugin>
    </plugins>
</build>

PDFController.java

public class PdfGenerationController {

private static final Logger logger = LoggerFactory.getLogger(PdfGenerationController.class);

private static final SimpleDateFormat DateFormatterIn1 = new SimpleDateFormat("yyyy-MM-dd");
//private static final SimpleDateFormat DateFormatterIn2 = new SimpleDateFormat("dd/MM/yyyy");
private static final SimpleDateFormat DateFormatterOut = new SimpleDateFormat("dd/MM/yyyy");
private static final SimpleDateFormat DateFormatterIn2 = new SimpleDateFormat("yyyy-MM-dd");
//private static final SimpleDateFormat DateFormatterOut = new SimpleDateFormat("yyyy-MM-dd");

@Autowired
private ResourceBundleMessageSource source;
@Value("${pdf.title}")
private static String pdfTitle;
@Value("${pdf.footerText1}")
private static String pdfFooterText1;

@CrossOrigin(origins = "http://localhost:4200")
@PostMapping("/getPdf")
public ResponseEntity<byte[]> getPDF(
        @RequestHeader(name = "Accept-Language", required = true) final Locale locale, 
        @RequestBody String jsonInput) {
    logger.info("myCustomerDetails() method started");
    logger.info(jsonInput);
    logger.info("locale = {}", locale);
    
    JSONObject data = new JSONObject(jsonInput);

    byte[] pdfFile = null;
    ResponseEntity<byte[]> response = null;
    HttpHeaders headers = new HttpHeaders();
    try {
        pdfFile = new PdfGenertor().generatePDF(data,locale);
    }catch (Exception e) {
        e.printStackTrace();
        response = new ResponseEntity<>(null, headers, HttpStatus.METHOD_FAILURE);
    }

    headers.setContentType(MediaType.APPLICATION_PDF);
    String filename = "fro_soa_form.pdf";
    headers.setContentDispositionFormData(filename, filename);
    headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
    response = new ResponseEntity<>(pdfFile, headers, HttpStatus.OK);
    return response;
}

private String formatDate(SimpleDateFormat format, String str) {
    try {
        Date date = format.parse(str);
        return DateFormatterOut.format(date);
    } catch (Exception e) {
        return "";
    }
}

@GetMapping("/sayHello")
public String sayHello() {
    return "Hello";
}

}

它的代码在 eclipse 中与 postman 一起工作正常(使用 Jason 输入和 header 接受的语言显示 PDF)。

第一张和第二张图片都是用“mvn spring-boot:build-image”构建的。

如果我需要什么post,请告诉我。

谢谢!

Dockerfile: 
FROM openjdk:11-slim as build
MAINTAINER xxxx.ca
COPY target/fro_soa_backend-0.0.1-SNAPSHOT.jar fro_soa_backend-0.0.1-SNAPSHOT.jar

ENTRYPOINT ["java","-jar","/fro_soa_backend-0.0.1-SNAPSHOT.jar"]

好吧只是告诉你 172.17..0.2 是 ip 容器,因此无法从容器中访问它,它是从容器创建的,以便从其他服务或 micro-services 获得访问权限。

您的应用程序配置似乎没有正确显示到此端口,这意味着您的应用程序不在 8080 端口上,这就是为什么它得到空响应的原因,当您添加功能时,您需要使用 Dockerfile并在 8080 中公开您的应用程序。

FROM  <image_name>
EXPOSE   8080

我想不通出了什么问题。所以我只是从头开始创建一个新的工作区,导入代码,用 Docker 文件将应用程序重建到 Docker 中,然后端口映射再次工作。

现在我的前端 Angular 和后端 Spring 引导应用程序可以在本地主机上通信。