如何将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的一些常用指令

Dokerfile的一些常用指令
这里需要注意的是,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"
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放在项目的根目录,如下:
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>

执行构建

  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 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]# docker images
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去改镜像名称, 如果名字不符合格式规范,推送会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值