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 @@
-