spring-boot - 如何将Spring-Boot Web服务转换为Docker镜像?

标签 spring-boot docker dockerfile

我想从Docker容器访问我的网站,但不能。我尝试实现的步骤如下。完成所有步骤后,我无法访问http://localhost:8080/index页面,我在哪里出错了?

Spring-Boot项目的名称为demo。我的部分代码:

package com.qwerty.demo.rest;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FunRestService {

    @GetMapping("/index")
    public String setIndex() {
        return "HELLO WORLD!";
    }
}

我的dockerfile代码:
FROM openjdk:8
COPY . /usr/var/www/MYPROJECT
WORKDIR /usr/var/www/MYPROJECT
EXPOSE 8080
CMD ./mvnw spring-boot:run

我使用此命令将Spring-Boot项目构建为myimage1
docker build -t myimage1 .

然后,使用此命令从myimage1创建一个新容器。
docker run --name mycontainer1 myimage1

然后Maven下载必要的文件并为我启动我的应用程序。最后输出:
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.2.RELEASE)

2019-01-19 17:40:32.604  INFO 6 --- [           main] com.qwerty.demo.DemoApplication     : Starting DemoApplication on 8086b6e010fb with PID 6 (/usr/var/www/MYPROJECT/target/classes started by root in /usr/var/www/MYPROJECT)
2019-01-19 17:40:32.613  INFO 6 --- [           main] com.qwerty.demo.DemoApplication     : No active profile set, falling back to default profiles: default
2019-01-19 17:40:34.119  INFO 6 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-01-19 17:40:34.170  INFO 6 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-01-19 17:40:34.171  INFO 6 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.14]
2019-01-19 17:40:34.186  INFO 6 --- [           main] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib]
2019-01-19 17:40:34.288  INFO 6 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-01-19 17:40:34.289  INFO 6 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1559 ms
2019-01-19 17:40:34.602  INFO 6 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-01-19 17:40:34.882  INFO 6 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''2019-01-19 17:40:34.888  INFO 6 --- [           main] com.qwerty.demo.DemoApplication     : Started DemoApplication in 3.176 seconds (JVM running for 69.839)

我们应该怎么做才能将一个这样的Spring-Boot项目(使用Dockerfile)转换为图像?如何访问我的网页?

最佳答案

运行Docker容器时,默认情况下不会发布任何应用程序碰巧监听的所有端口。

为了发布端口,您需要在使用镜像运行容器时指定端口。有关如何执行此操作的所有详细信息,可以检查docker run命令文档中的“EXPOSE”部分:https://docs.docker.com/engine/reference/run/

简而言之,您想在运行容器时添加另一个选项:

docker run --name mycontainer1 -p 8080:8080 myimage1

我不确定您是否想通过添加
EXPOSE 8080

在您的Dockerfile中。实际上,这并不意味着在使用镜像运行容器时端口将被暴露。您可能会在Dockerfile reference中找到:

The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published. To actually publish the port when running the container, use the -p flag on docker run to publish and map one or more ports, or the -P flag to publish all exposed ports and map them to high-order ports.

关于spring-boot - 如何将Spring-Boot Web服务转换为Docker镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54269973/

相关文章:

linux - 创建 Docker 镜像时 Makefile 错误

docker - 无法访问由 Jenkins 管道创建的容器

docker - 实现Docker FROM的不同方式是什么?

asp.net - Docker for Windows 构建为 COPY 添加了前缀 `/var/lib/docker/tmp/`?

jenkins - 如何在 Dockerfile 中为 LDAPS 的 Jenkins 添加 SSL 自签名证书?

java - Java API 日期错误

java - 在捕获模式下使用hoverfly时出现x509错误

linux - Wiki.js 无法通过企业代理

带有加密 JWT 访问 token 的 Spring Boot OAuth2

java - 如何在 spring boot 1.4.1 中配置 querydsl?