docker构建运行springboot
程序员文章站
2022-03-07 18:04:49
...
1.环境准备
docker安装
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-edge
yum install -y docker-ce
springboot测试项目
[[email protected] demo]# tree
.
├── Dockerfile
├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ └── DemoApplication.java
│ └── resources
│ └── application.properties
└── test
└── java
└── com
└── example
└── demo
└── DemoApplicationTests.java
2.Dockerfile文件编写
FROM maven:3.5.2-jdk-8-alpine AS MAVEN_BUILD
MAINTAINER Brian Hannaway
COPY pom.xml /build/
COPY src /build/src
WORKDIR /build/
RUN mvn package
FROM openjdk:8-jre-alpine
WORKDIR /app
COPY --from=MAVEN_BUILD /build/target/demo-0.0.1-SNAPSHOT.jar /app
ENTRYPOINT ["java","-jar","demo-0.0.1-SNAPSHOT.jar"]
说明:
- FROM maven:3.5.2-jdk-8-alpine AS
MAVEN_BUILD告知Docker采用Maven编译器。maven:3.5.2-jdk-8-alpine构建第一步采用的基础镜像,Docker将首先在本地查找镜像,本地不存在后,将从DockerHub拉取。Maven会在最后阶段被剔除掉(后续COPY命令介绍)考虑下载快速和镜像大小控制的原因,选择Alpine版的Maven镜像。
MAINTAINERBrianHannaway非必选项,但是为映像作者提供一个接触点可提高可维护性。(本实验应用验证的点) COPY
pom.xml /build/在镜像中创建一个build目录, 并拷入pom.xml文件。 COPY src
/build/src/拷入src目录到镜像中build目录。 WORKDIR
/build/设置build为工作目录。后续任何命令都在此目录中运行。 RUN mvn
package执行mvn包来运行编译和打包应用,生成成可执行的JAR文件。在第一次构建镜像时,Maven将从公共Maven库拉取所有需要的依赖项,并将它们缓存在镜像的本地。后续的构建将使用这个缓存版的镜像层,这意味着依赖项将在本地引用,而不必再次从外部拉取。至此,已经完成了镜像定义,只需等其构建成一个可执行的JAR文件。这是多阶段构建的第一部分。下一阶段将获取JAR并运行它。
FROM
openjdk:8-jre-alpine告知Docker多阶段构建的下一步采用openjdk:8-jre-alpine的基础镜像。再次使用Java
8
JRE的Alpine版本,这一步的选择其实比前面的Maven版本选择更为重要,因为存在于最终版的镜像只是openjdk:8-jre-alpine,因此如果要尽可能控制最终镜像大小的话,选择轻量级JRE镜像就非常重要。
WORKDIR /app告知Docker在镜像内创建另一个/app工作目录,后续任何命令都在此目录中运行。 COPY
–from=MAVEN_BUILD/build/target/docker-boot-intro-0.1.0.jar /app/告知Docker从MAVEN_BUILD阶段的/build/target目录复制demo-0.0.1-SNAPSHOT.jar到/app目录。
如前文所述,多阶段构建的优势就是允许用户将特定的内容从一个构建阶段复制到另一个构建阶段,并丢弃其他所有的内容。如果需要保留从MAVENBUILD阶段开始的所有内容,那最终镜像会包含Maven(包括Maven本地库)工具,以及目标目录中生成的所有类文件。通过从MAVENBUILD阶段选择必须要的内容,那最终得到的镜像会小很多。
ENTRYPOINT[“java”,"-jar",“demo-0.0.1-SNAPSHOT.jar”]告知Docker在容器运行本镜像时,运行哪些命令。本部分用冒号进行多命令的隔离。本案例中,需要把执行JAR文件复制到/app目录运行。
3.打包镜像:
docker image build -t docker-boot-intro .
[[email protected] demo]# docker image build -t docker-boot-intro .
Sending build context to Docker daemon 92.67kB
Step 1/10 : FROM maven:3.5.2-jdk-8-alpine AS MAVEN_BUILD
---> 293423a981a7
Step 2/10 : MAINTAINER Brian Hannaway
---> Using cache
---> 5aa801794677
Step 3/10 : COPY pom.xml /build/
---> Using cache
---> b043af444e4c
Step 4/10 : COPY src /build/src
---> Using cache
---> 8f9d50f58ae0
Step 5/10 : WORKDIR /build/
---> Using cache
---> 03b7ed996876
Step 6/10 : RUN mvn package
---> Using cache
---> d8a8d4ef80dd
Step 7/10 : FROM openjdk:8-jre-alpine
---> f7a292bbb70c
Step 8/10 : WORKDIR /app
---> Using cache
---> def8379537a8
Step 9/10 : COPY --from=MAVEN_BUILD /build/target/demo-0.0.1-SNAPSHOT.jar /app
---> Using cache
---> 6b25c91e4a4c
Step 10/10 : ENTRYPOINT ["java","-jar","demo-0.0.1-SNAPSHOT.jar"]
---> Using cache
---> 08bc5d46b91a
Successfully built 08bc5d46b91a
Successfully tagged docker-boot-intro:latest
进入到含有Dockerfile的目录中执行该命令,我不是第一次打包,所有很多信息不全,想mvn下载,镜像下载之类的
查看镜像列表:
[[email protected] demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-boot-intro latest 08bc5d46b91a 53 minutes ago 92.9MB
openjdk 8-jre-alpine f7a292bbb70c 7 months ago 84.9MB
maven 3.5.2-jdk-8-alpine 293423a981a7 2 years ago 116MB
备注:该打包方式起到了镜像瘦身的作用
4.运行镜像
[[email protected] demo]# docker run -it docker-boot-intro
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.2.RELEASE)
2019-12-20 03:33:39.251 INFO 1 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication v0.0.1-SNAPSHOT on 079d50770b01 with PID 1 (/app/demo-0.0.1-SNAPSHOT.jar started by root in /app)
2019-12-20 03:33:39.254 INFO 1 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to default profiles: default
2019-12-20 03:33:39.737 INFO 1 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 0.825 seconds (JVM running for 1.267)