制作 SOFABoot 应用的 Docker 镜像

在将应用工程打包成 Docker 镜像的方法上,SOFABoot 完全与 SpringBoot 一致。本篇将基于 SpringBoot 官方提供的文档介绍如何将一个 SOFABoot 的示例应用工程制作成 Docker 镜像。

前提条件

在运行示例工程之前请先安装 Docker 环境,具体操作请参见 Docker 官方文档

重要

在打包过程中,如果是 Mac OS,会出现连接问题,解决方案请参见 Docker 在 Mac 下的 2375 端口问题

操作步骤

本教程介绍如何使用 Dockerfile 将一个 SOFABoot 示例应用的 JAR 包打包成镜像。

编写 Dockerfile 文件

Docker 提供了 Dockerfile 格式的文件来构建应用镜像,创建一个 Spring Boot 应用的 Dockerfile:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
// 应用 JAR 包的名称必须遵循 artifactId-version 的格式
COPY sofaboot-docker-demo-web-1.0.0.jar /app.jar
ENV JAVA_OPTS=""

#商业版 SOFAStack 中间件需要输入四元组进行服务端注册鉴权,可以按照以下约定,在进行容器化发布时以环境变量方式注入。详情请参见服务网格的快速入门文档。
# COM_ALIPAY_ENV=shared
# ENV COM_ALIPAY_INSTANCEID=
# ENV COM_ANTCLOUD_ANTVIP_ENDPOINT=
# ENV COM_ANTCLOUD_MW_ACCESS=
# ENV COM_ANTCLOUD_MW_SECRET=

ENTRYPOINT ["sh","-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]

java:8 是指 Docker Hub上官方提供的 Java 镜像,版本号是 8,也就是 JDK 1.8。有了这个基础镜像后,Dockerfile 可以通过 FROM 指令直接获取它的状态——也就是在容器中,Java是已经安装的。接下来,通过自定义的命令来运行 Spring Boot 应用:

  • VOLUME /tmp创建 /tmp 目录并持久化到Docker数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用 /tmp 作为工作目录。

  • COPY sofaboot-docker-demo-web-1.0.0.jar /app.jar 将应用 JAR 包复制到/app.jar

  • ENTRYPOINT 表示容器运行后默认执行的命令。

配置 Maven 打包插件

在 app/web 模块的 pom 文件中添加 docker maven 的打包插件:

说明

仔细检查本地镜像打包配置,如发现存在 outputDirectory 和 classifier 配置,需注释掉或移除该配置。

<!--Docker maven plugin -->
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.13</version>
    <configuration>
        <imageName>${project.groupId}/${project.artifactId}:${project.version}</imageName>
        <!--Dockerfiler的文件目录位置-->
        <dockerDirectory>src/main/resources/docker</dockerDirectory>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

打包

  1. 在工程模块下执行 mvn clean install -DskipTests,安装模块。

  2. 切换到 Web 模块,打包镜像:

    - cd app/web
    - mvn package docker:build -Dmaven.test.skip

    打包日志如下所示:

    Step1/6: FROM openjdk:8-jdk-alpine
    
    --->3675b9f543c5
    Step2/6: VOLUME /tmp
    
    --->Using cache
    ---> c7a81ace946a
    Step3/6: COPY sofaboot-docker-demo-web-1.0.0.jar app.jar
    
    ---> f24e191bc980
    Step4/6: RUN sh -c 'touch /app.jar'
    
    --->Running in 777a918b3314
    Removing intermediate container 777a918b3314
    --->183a3067e911
    Step5/6: ENV JAVA_OPTS=""
    
    --->Running in 70c238ef5b5b
    Removing intermediate container 70c238ef5b5b
    ---> a155e72ed7fc
    Step6/6: ENTRYPOINT ["sh","-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
    
    --->Running in c53eaccaf58f
    Removing intermediate container c53eaccaf58f
    --->57bb9c53cfe6
    ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
    Successfully built 57bb9c53cfe6
    Successfully tagged com.alipay.sofa/sofaboot-docker-demo-web:1.0.0
  3. 通过 docker images 命令查看当前镜像文件:

    - docker images

    显示结果:

    REPOSITORY                                 TAG                 IMAGE ID            CREATED              SIZE
    com.alipay.sofa/sofaboot-docker-demo-web   1.0.057bb9c53cfe6About a minute ago   105MB