From 6f8d28dca860bc38ebe6b4f1df1dbce4a1475810 Mon Sep 17 00:00:00 2001 From: "Yangkai.Shen" <237497819@qq.com> Date: Tue, 23 Aug 2022 14:46:32 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=89=93=E5=8C=85=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E4=B9=8B=20docker=20=E6=A1=88=E4=BE=8B=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo-docker/.gitignore | 25 ----- demo-docker/Dockerfile | 20 ---- demo-docker/README.md | 116 --------------------- demo-docker/pom.xml | 71 ------------- .../SpringBootDemoDockerApplicationTests.java | 16 --- demo-package/demo-package-docker/Dockerfile | 26 +++++ demo-package/demo-package-docker/README.md | 80 ++++++++++++++ demo-package/demo-package-docker/pom.xml | 52 +++++++++ .../com/xkcoding/docker/DockerApplication.java | 4 +- .../docker/controller/HelloController.java | 5 +- .../src/main/resources/application.yml | 0 .../xkcoding/docker/DockerApplicationTests.java | 13 +++ demo-package/pom.xml | 4 + pom.xml | 1 - 14 files changed, 181 insertions(+), 252 deletions(-) delete mode 100644 demo-docker/.gitignore delete mode 100644 demo-docker/Dockerfile delete mode 100644 demo-docker/README.md delete mode 100644 demo-docker/pom.xml delete mode 100644 demo-docker/src/test/java/com/xkcoding/docker/SpringBootDemoDockerApplicationTests.java create mode 100644 demo-package/demo-package-docker/Dockerfile create mode 100644 demo-package/demo-package-docker/README.md create mode 100644 demo-package/demo-package-docker/pom.xml rename demo-docker/src/main/java/com/xkcoding/docker/SpringBootDemoDockerApplication.java => demo-package/demo-package-docker/src/main/java/com/xkcoding/docker/DockerApplication.java (72%) rename {demo-docker => demo-package/demo-package-docker}/src/main/java/com/xkcoding/docker/controller/HelloController.java (77%) rename {demo-docker => demo-package/demo-package-docker}/src/main/resources/application.yml (100%) create mode 100644 demo-package/demo-package-docker/src/test/java/com/xkcoding/docker/DockerApplicationTests.java diff --git a/demo-docker/.gitignore b/demo-docker/.gitignore deleted file mode 100644 index 82eca33..0000000 --- a/demo-docker/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -/target/ -!.mvn/wrapper/maven-wrapper.jar - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/build/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ \ No newline at end of file diff --git a/demo-docker/Dockerfile b/demo-docker/Dockerfile deleted file mode 100644 index 2807799..0000000 --- a/demo-docker/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -# 基础镜像 -FROM openjdk:8-jdk-alpine - -# 作者信息 -MAINTAINER "Yangkai.Shen 237497819@qq.com" - -# 添加一个存储空间 -VOLUME /tmp - -# 暴露8080端口 -EXPOSE 8080 - -# 添加变量,如果使用dockerfile-maven-plugin,则会自动替换这里的变量内容 -ARG JAR_FILE=target/spring-boot-demo-docker.jar - -# 往容器中添加jar包 -ADD ${JAR_FILE} app.jar - -# 启动镜像自动运行程序 -ENTRYPOINT ["java","-Djava.security.egd=file:/dev/urandom","-jar","/app.jar"] \ No newline at end of file diff --git a/demo-docker/README.md b/demo-docker/README.md deleted file mode 100644 index 8ae00ce..0000000 --- a/demo-docker/README.md +++ /dev/null @@ -1,116 +0,0 @@ -# spring-boot-demo-docker - -> 本 demo 主要演示了如何容器化一个 Spring Boot 项目。通过 `Dockerfile` 的方式打包成一个 images 。 - -## Dockerfile - -```dockerfile -# 基础镜像 -FROM openjdk:8-jdk-alpine - -# 作者信息 -MAINTAINER "Yangkai.Shen 237497819@qq.com" - -# 添加一个存储空间 -VOLUME /tmp - -# 暴露8080端口 -EXPOSE 8080 - -# 添加变量,如果使用dockerfile-maven-plugin,则会自动替换这里的变量内容 -ARG JAR_FILE=target/spring-boot-demo-docker.jar - -# 往容器中添加jar包 -ADD ${JAR_FILE} app.jar - -# 启动镜像自动运行程序 -ENTRYPOINT ["java","-Djava.security.egd=file:/dev/urandom","-jar","/app.jar"] -``` - -## 打包方式 - -### 手动打包 - -1. 前往 Dockerfile 目录,打开命令行执行 - - ```bash - $ docker build -t spring-boot-demo-docker . - ``` - -2. 查看生成镜像 - - ```bash - $ docker images - - REPOSITORY TAG IMAGE ID CREATED SIZE - spring-boot-demo-docker latest bc29a29ffca0 2 hours ago 119MB - openjdk 8-jdk-alpine 97bc1352afde 5 weeks ago 103MB - ``` - -3. 运行 - - ```bash - $ docker run -d -p 9090:8080 spring-boot-demo-docker - ``` - -### 使用 maven 插件打包 - -1. pom.xml 中添加插件 - -2. ```xml - - 1.4.9 - - - - - com.spotify - dockerfile-maven-plugin - ${dockerfile-version} - - ${project.build.finalName} - ${project.version} - - target/${project.build.finalName}.jar - - - - - default - package - - build - - - - - - ``` - -2. 执行mvn打包命令,因为插件中 `execution` 节点配置了 package,所以会在打包的时候自动执行 build 命令。 - - ```bash - $ mvn clean package -Dmaven.test.skip=true - ``` - -3. 查看镜像 - - ```bash - $ docker images - - REPOSITORY TAG IMAGE ID CREATED SIZE - spring-boot-demo-docker 1.0.0-SNAPSHOT bc29a29ffca0 2 hours ago 119MB - openjdk 8-jdk-alpine 97bc1352afde 5 weeks ago 103MB - ``` - -4. 运行 - - ```bash - $ docker run -d -p 9090:8080 spring-boot-demo-docker:1.0.0-SNAPSHOT - ``` - -## 参考 - -- docker 官方文档:https://docs.docker.com/ -- Dockerfile 命令,参考文档:https://docs.docker.com/engine/reference/builder/ -- maven插件使用,参考地址:https://github.com/spotify/dockerfile-maven \ No newline at end of file diff --git a/demo-docker/pom.xml b/demo-docker/pom.xml deleted file mode 100644 index c489b51..0000000 --- a/demo-docker/pom.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - 4.0.0 - - demo-docker - 1.0.0-SNAPSHOT - jar - - demo-docker - Demo project for Spring Boot - - - com.xkcoding - spring-boot-demo - 1.0.0-SNAPSHOT - - - - UTF-8 - UTF-8 - 1.8 - 1.4.9 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - demo-docker - - - org.springframework.boot - spring-boot-maven-plugin - - - com.spotify - dockerfile-maven-plugin - ${dockerfile-version} - - ${project.build.finalName} - ${project.version} - - target/${project.build.finalName}.jar - - - - - - - - - - - - - - - - - diff --git a/demo-docker/src/test/java/com/xkcoding/docker/SpringBootDemoDockerApplicationTests.java b/demo-docker/src/test/java/com/xkcoding/docker/SpringBootDemoDockerApplicationTests.java deleted file mode 100644 index 3e009f4..0000000 --- a/demo-docker/src/test/java/com/xkcoding/docker/SpringBootDemoDockerApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.xkcoding.docker; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class SpringBootDemoDockerApplicationTests { - - @Test - public void contextLoads() { - } - -} diff --git a/demo-package/demo-package-docker/Dockerfile b/demo-package/demo-package-docker/Dockerfile new file mode 100644 index 0000000..49f39f9 --- /dev/null +++ b/demo-package/demo-package-docker/Dockerfile @@ -0,0 +1,26 @@ +# 多阶段构建 +FROM amazoncorretto:17.0.4-alpine3.15 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +# layertools extract 命令会将 spring boot fatjar 解压成多个 layers +RUN java -Djarmode=layertools -jar application.jar extract + + +FROM amazoncorretto:17.0.4-alpine3.15 +# 作者信息 +MAINTAINER "Yangkai.Shen 237497819@qq.com" + +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ + +# 添加一个存储空间 +VOLUME /tmp + +# 暴露8080端口 +EXPOSE 8080 +# 入口 +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/urandom","org.springframework.boot.loader.JarLauncher"] diff --git a/demo-package/demo-package-docker/README.md b/demo-package/demo-package-docker/README.md new file mode 100644 index 0000000..66f1460 --- /dev/null +++ b/demo-package/demo-package-docker/README.md @@ -0,0 +1,80 @@ +## spring-boot-demo-docker + +> 本 demo 主要演示了如何容器化一个 Spring Boot 项目。通过 `Dockerfile` 的方式打包成一个 images 。 + +### 1.开发步骤 + +#### 1.1.创建一个 HelloWorld 的 SpringBoot 项目 + +参考 `demo-base-helloworld` 案例即可 + +#### 1.2.创建Dockerfile + +```dockerfile +# 多阶段构建 +FROM amazoncorretto:17.0.4-alpine3.15 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +# layertools extract 命令会将 spring boot fatjar 解压成多个 layers +RUN java -Djarmode=layertools -jar application.jar extract + + +FROM amazoncorretto:17.0.4-alpine3.15 +# 作者信息 +MAINTAINER "Yangkai.Shen 237497819@qq.com" + +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ + +# 添加一个存储空间 +VOLUME /tmp + +# 暴露8080端口 +EXPOSE 8080 +# 入口 +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/urandom","org.springframework.boot.loader.JarLauncher"] +``` + +#### 1.2.打包 + +1. 首先在 spring-boot-demo 根目录下,先执行编译打包 Jar 文件 + +```shell +$ mvn clean -DskipTests package +``` + +2. 再进入 `demo-package-docker` 目录,构建镜像 + +```shell +$ cd demo-package/demo-package-docker +$ docker build -t demo-package-docker:v1 . +``` + +3. 查看生成镜像 + +```shell +$ docker images | grep demo +demo-package-docker v3 58e9b4918f61 19 minutes ago 353MB +demo-package-docker v2 35303ce1960c 22 minutes ago 351MB +demo-package-docker v1 7d4a9e953a19 28 minutes ago 351MB +``` + +4. 测试运行 + +```shell +$ docker run -p 8080:8080 demo-package-docker:v1 +``` + +> 注意: +> 1.Spring Boot 提供的 maven 插件中已包含 `spring-boot-loader-tools` 依赖,该依赖可以将 SpringBoot FatJar 解压为每个layer,这样在 Docker 多阶段构建的时候,可以让 Docker 复用已存在的 layer,达到加速构建、加速上传、加速下载的目的 +> 2.同学们可以通过修改代码、添加依赖等方式重新 build 不同版本的镜像,然后通过 `docker inspect xxx` 命令对比不同版本的 layer,观察输出信息是否存在相同的 layer sha256 值,存在即表示 Docker 已经复用了该 layer + +### 2.参考 + +- Spring Boot 官方文档:https://docs.spring.io/spring-boot/docs/3.0.0-M4/reference/htmlsingle/#container-images.dockerfiles +- docker 官方文档:https://docs.docker.com/ +- Dockerfile 命令,参考文档:https://docs.docker.com/engine/reference/builder/ diff --git a/demo-package/demo-package-docker/pom.xml b/demo-package/demo-package-docker/pom.xml new file mode 100644 index 0000000..440d6de --- /dev/null +++ b/demo-package/demo-package-docker/pom.xml @@ -0,0 +1,52 @@ + + + + com.xkcoding + demo-package + 1.0.0-SNAPSHOT + + + 4.0.0 + + demo-package-docker + 1.0.0-SNAPSHOT + jar + + demo-package-docker + Demo project for Spring Boot + + + 17 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.projectlombok + lombok + true + + + + + demo-package-docker + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/demo-docker/src/main/java/com/xkcoding/docker/SpringBootDemoDockerApplication.java b/demo-package/demo-package-docker/src/main/java/com/xkcoding/docker/DockerApplication.java similarity index 72% rename from demo-docker/src/main/java/com/xkcoding/docker/SpringBootDemoDockerApplication.java rename to demo-package/demo-package-docker/src/main/java/com/xkcoding/docker/DockerApplication.java index c1a4004..a06f3b8 100644 --- a/demo-docker/src/main/java/com/xkcoding/docker/SpringBootDemoDockerApplication.java +++ b/demo-package/demo-package-docker/src/main/java/com/xkcoding/docker/DockerApplication.java @@ -12,9 +12,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @date Created in 2018-11-29 14:59 */ @SpringBootApplication -public class SpringBootDemoDockerApplication { +public class DockerApplication { public static void main(String[] args) { - SpringApplication.run(SpringBootDemoDockerApplication.class, args); + SpringApplication.run(DockerApplication.class, args); } } diff --git a/demo-docker/src/main/java/com/xkcoding/docker/controller/HelloController.java b/demo-package/demo-package-docker/src/main/java/com/xkcoding/docker/controller/HelloController.java similarity index 77% rename from demo-docker/src/main/java/com/xkcoding/docker/controller/HelloController.java rename to demo-package/demo-package-docker/src/main/java/com/xkcoding/docker/controller/HelloController.java index a8b0d39..de6c38f 100644 --- a/demo-docker/src/main/java/com/xkcoding/docker/controller/HelloController.java +++ b/demo-package/demo-package-docker/src/main/java/com/xkcoding/docker/controller/HelloController.java @@ -1,5 +1,6 @@ package com.xkcoding.docker.controller; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -12,11 +13,13 @@ import org.springframework.web.bind.annotation.RestController; * @author yangkai.shen * @date Created in 2018-11-29 14:58 */ +@Slf4j @RestController @RequestMapping public class HelloController { - @GetMapping + @GetMapping("/hello") public String hello() { + log.info("[HelloController#hello], receive a request..."); return "Hello,From Docker!"; } } diff --git a/demo-docker/src/main/resources/application.yml b/demo-package/demo-package-docker/src/main/resources/application.yml similarity index 100% rename from demo-docker/src/main/resources/application.yml rename to demo-package/demo-package-docker/src/main/resources/application.yml diff --git a/demo-package/demo-package-docker/src/test/java/com/xkcoding/docker/DockerApplicationTests.java b/demo-package/demo-package-docker/src/test/java/com/xkcoding/docker/DockerApplicationTests.java new file mode 100644 index 0000000..97c66b1 --- /dev/null +++ b/demo-package/demo-package-docker/src/test/java/com/xkcoding/docker/DockerApplicationTests.java @@ -0,0 +1,13 @@ +package com.xkcoding.docker; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DockerApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/demo-package/pom.xml b/demo-package/pom.xml index f761bcb..d63ca2a 100644 --- a/demo-package/pom.xml +++ b/demo-package/pom.xml @@ -18,4 +18,8 @@ 17 + + demo-package-docker + + diff --git a/pom.xml b/pom.xml index 18fa06e..76edc3d 100644 --- a/pom.xml +++ b/pom.xml @@ -68,7 +68,6 @@ -