如何将Spring Boot应用打包成Docker镜像文件并且推送到阿里云仓库

2022年6月3日10:57:23

关于Docker

前言

Docker 已经成为新一代的云计算技术,而且可以看到他们的发展态势非常迅猛。Docker作为一门杀手级应用,它的特点有:

  • Docker 容易上手。
  • Docker 解决了运维中的环境问题以及服务调度的痛点。
  • Docker 的生态圈中有大公司在后面助力,比如 Google。
  • Docker 产出了工业界标准 OCI。
  • Docker 的社区和生态圈已经出现像 Java 和 Linux 那样的态势。

在实际的应用场景中,我们会把自己的Spring Boot应用程序使用Docker部署到类似于阿里云这种云原生平台上。今天,就让我们来学习一下如何将Spring Boot应用打包成Docker镜像文件。

什么是Docker镜像

  • 镜像是静态的只读模板
  • 镜像中包含构建 Docker 容器器的指令
  • 镜像是分层的
  • 通过 Dockerfile 来创建镜像

Dockerfile的一些常用指令

如何将Spring Boot应用打包成Docker镜像文件并且推送到阿里云仓库
这里需要注意的是,RUN时是运行安装时会执行的命令,也就是用于指定 docker build 过程中要运行的命令。CMD 和 ENTRYPOINT 会在docker run 时运行。

  1. 在Dockerfile中,只能有一个ENTRYPOINT指令,如果有多个ENTRYPOINT指令则以最后一个为准。

  2. 在Dockerfile中,只能有一个CMD指令,如果有多个CMD指令则以最后一个为准。

  3. 在Dockerfile中,ENTRYPOINT指令或CMD指令,至少必有其一。

通过Maven构建 Docker镜像

准备⼯作

1.提供一个 Dockerfile

FROM java:8
MAINTAINER fwt"HunterQiu"
EXPOSE80# 设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime&&echo'Asia/Shanghai'>/etc/timezone
ARG JAR_FILE
ADD target/${JAR_FILE} /workspace/myshop.jar
WORKDIR /workspace
ENTRYPOINT["java","-jar","myshop.jar"]

之前在查看日志发现阿里云ECM服务器和自己打包的Docker容器两者之间的时间相差了八个小时!
宿主机采用了CST时区,CST应该是指(China Shanghai Time,东八区时间)
容器采用了UTC时区,UTC应该是指(Coordinated Universal Time,标准时间)
所以在Docker Build的阶段就把时区改正过来。

Dockerfile放在项目的根目录,如下:
如何将Spring Boot应用打包成Docker镜像文件并且推送到阿里云仓库

2.配置 dockerfile-maven-plugin 插件

<plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>${dockerfile-maven-version}</version><executions><execution><id>default</id><goals><goal>build</goal><goal>push</goal></goals></execution></executions><configuration><repository>${docker.image.prefix}/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>${project.build.finalName}.jar</JAR_FILE></buildArgs></configuration></plugin>

执行构建

  1. mvn package
  2. mvn dockerfile:build
[root@hunteraliyun shop]# ll
total 44-rw-r--r-- 1 root root   265 Jul 15 00:52 Dockerfile
drwxr-xr-x 2 root root  4096 Jul 12 01:27 logs-rw-r--r-- 1 root root 10070 Jun 30 17:44 mvnw-rw-r--r-- 1 root root  6608 Jun 30 17:44 mvnw.cmd-rw-r--r-- 1 root root  6515 Jul 15 00:52 pom.xml
drwxr-xr-x 4 root root  4096 Jun 30 17:44 src
drwxr-xr-x 9 root root  4096 Jul 12 01:27 target[root@hunteraliyun shop]# mvn clean package -Dmaven.test.skip=true

看到build成功的信息:

[INFO] Successfully built 44002908890c[INFO] Successfully tagged myshop/justice-league-shopping:0.0.3-SNAPSHOT[INFO][INFO] Detected build of image withid 44002908890c[INFO] Building jar: /home/hunter/projects/shop/target/justice-league-shopping-0.0.3-SNAPSHOT-docker-info.jar[INFO] Successfully built myshop/justice-league-shopping:0.0.3-SNAPSHOT[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time:26.243 s[INFO] Finished at:2021-07-15T01:16:54+08:00[INFO] ------------------------------------------------------------------------

检查结果
检查docker镜像是否已经创建:

[root@hunteraliyun shop]# docker images
REPOSITORY                                                    TAG              IMAGE ID       CREATED         SIZE
myshop/justice-league-shopping0.0.3-SNAPSHOT   44002908890c3 minutes ago   692MB

将镜像推送到阿里云Registry

$ docker login --username=hunter registry.cn-shenzhen.aliyuncs.com
$ docker tag[ImageId] registry.cn-shenzhen.aliyuncs.com/hunter_qiu/docker-factory:[镜像版本号]
$ docker push registry.cn-shenzhen.aliyuncs.com/hunter_qiu/docker-factory:[镜像版本号]

镜像被推送到阿里云的私有docker仓库,镜像名字会有要求,镜像名字应为[服务器域名]/[命名空间]/[仓库名称]:[镜像版本号]。因此需要用tag去改镜像名称, 如果名字不符合格式规范,推送会报错。

  • 作者:HunterQiuQiu
  • 原文链接:https://blog.csdn.net/Hunter_Sense/article/details/118739982
    更新时间:2022年6月3日10:57:23 ,共 3276 字。