如何将Spring Boot应用打包成Docker镜像文件并且推送到阿里云仓库
关于Docker
前言
Docker 已经成为新一代的云计算技术,而且可以看到他们的发展态势非常迅猛。Docker作为一门杀手级应用,它的特点有:
- Docker 容易上手。
- Docker 解决了运维中的环境问题以及服务调度的痛点。
- Docker 的生态圈中有大公司在后面助力,比如 Google。
- Docker 产出了工业界标准 OCI。
- Docker 的社区和生态圈已经出现像 Java 和 Linux 那样的态势。
在实际的应用场景中,我们会把自己的Spring Boot应用程序使用Docker部署到类似于阿里云这种云原生平台上。今天,就让我们来学习一下如何将Spring Boot应用打包成Docker镜像文件。
什么是Docker镜像
- 镜像是静态的只读模板
- 镜像中包含构建 Docker 容器?的指令
- 镜像是分层的
- 通过 Dockerfile 来创建镜像
Dockerfile的一些常用指令
这里需要注意的是,RUN时是运行安装时会执行的命令,也就是用于指定 docker build 过程中要运行的命令。CMD 和 ENTRYPOINT 会在docker run 时运行。
-
在Dockerfile中,只能有一个ENTRYPOINT指令,如果有多个ENTRYPOINT指令则以最后一个为准。 -
在Dockerfile中,只能有一个CMD指令,如果有多个CMD指令则以最后一个为准。 -
在Dockerfile中,ENTRYPOINT指令或CMD指令,至少必有其一。
通过Maven构建 Docker镜像
准备?作
1.提供一个 Dockerfile
FROM java:8
MAINTAINER fwt "HunterQiu"
EXPOSE 80
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放在项目的根目录,如下:
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>
执行构建
- mvn package
- mvn dockerfile:build
[root@hunteraliyun shop]
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]
看到build成功的信息:
[INFO] Successfully built 44002908890c
[INFO] Successfully tagged myshop/justice-league-shopping:0.0.3-SNAPSHOT
[INFO]
[INFO] Detected build of image with id 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]
REPOSITORY TAG IMAGE ID CREATED SIZE
myshop/justice-league-shopping 0.0.3-SNAPSHOT 44002908890c 3 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去改镜像名称, 如果名字不符合格式规范,推送会报错。
|