我们知道docker可将应用程序和基础设施层隔离,可更快地打包、测试以及部署应用程序。本文主要介绍SpringBoot项目如何构建docker镜像以及推送到私服或者docker hub服务器上。

本文介绍的方式是使用docker-maven-plugin的方式构建SpringBoot的docker镜像以及推送到私服或docker hub服务器上。

Docker环境配置

本地环境配置

docker-maven-plugin 插件默认连接本地 Docker 地址为:localhost:2375,如果我们本地开发环境有docker环境并准备使用本地开发环境的docker,只需要先设置下本地开发环境的环境变量。

DOCKER_HOST=tcp://<host>:2375

服务器环境配置

如果使用CentOS服务器上的docker环境 (CentOS上安装docker环境),则需要在服务器上修改 docker 配置,开启允许远程访问 docker 的功能,开启方式很简单,修改 /usr/lib/systemd/system/docker.service 文件,ExecStart中加入如下内容:

-H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock

 

 修改好配置后,使用如下命令重启docker生效:

systemctl daemon-reload    
systemctl restart docker 

IDEA测试docker连接

IDEA 中我们可以测试服务器上的docker环境是否连接成功,打开 File->Settings->Build,Execution,Deployment->Docker ,然后配置一下 Docker 的远程连接地址:

配置一下 Docker 的地址,配置完成后,提示 Connection successful 信息,表示 Docker 已经连接上了。

SpringBoot项目引入docker-maven-plugin插件

pom.xml配置

项目中引入docker-maven-plugin插件,在pom.xml引入插件并做相应的配置:

<project>
    <!-- other setting-->
    <build>
        <plugins>
            <plugin>
                <!-- https://mvnrepository.com/artifact/com.spotify/docker-maven-plugin -->
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>
                <executions>
                    <!-- 当mvn执行install操作的时候,执行docker的build和push -->
                    <execution>
                        <id>buildAndPush</id>
                        <phase>install</phase>
                        <goals>
                            <goal>build</goal>
                            <goal>push</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- 连接到 带docker环境的linux服务器 编译image -->
                    <dockerHost>http://192.168.**.***:2375</dockerHost>

                    <!-- push到 docker hub 开始 -->
                    <!-- serverId 这个是配置在maven的setting.xml中私服的登录账户信息-->
                    <serverId>docker-hub</serverId>
                    <retryPushCount>1</retryPushCount>
                    <retryPushTimeout>2000</retryPushTimeout>
                    <registryUrl>https://index.docker.io/v1/</registryUrl>
                    <!-- 格式:私有仓库/镜像名称:版本号, 如果要执行push操作, 那么镜像名称必须为私有仓库为前缀,不然无效。-->
                    <imageName>flyduck128/${project.artifactId}</imageName>
                    <!-- push到 docker hub 结束 -->

                    <!-- 指定tag版本 -->
                    <imageTags>
                        <imageTag>v1.0</imageTag>
                    </imageTags>
                    <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
                    <!-- optionally overwrite tags every time image is built with docker:build -->
                    <forceTags>true</forceTags>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.zip</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Docker命令可以绑定到maven各阶段命令中。该示例配置中我们在execution上将docker的build和push命令绑定在了maven的install阶段命令中。当springboot项目执行maven的install命令阶段,会执行docker的build和push命令。

如果需要推送到docker hub或者私服,还需要在本地的maven目录的setting.xml中配置相应的server:

    <server>
      <id>docker-hub</id>
      <username>flyduck128</username>
      <password>***</password>
      <configuration>
        <email>***@qq.com</email>
      </configuration>
    </server>

如果我们不需要推送到docker hub或者私服,可以不配置docker的push命令以及相应的推送配置:

                    <!-- push到 docker hub 开始 -->
                    <!-- serverId 这个是配置在maven的setting.xml中私服的登录账户信息-->
                    <serverId>docker-hub</serverId>
                    <retryPushCount>1</retryPushCount>
                    <retryPushTimeout>2000</retryPushTimeout>
                    <registryUrl>https://index.docker.io/v1/</registryUrl>
                    <!-- 格式:私有仓库/镜像名称:版本号, 如果要执行push操作, 那么镜像名称必须为私有仓库为前缀,不然无效。-->
                    <imageName>flyduck128/${project.artifactId}</imageName>
                    <!-- push到 docker hub 结束 -->

Dockerfile文件配置

Dockerfile文件放入项目的/src/main/docker目录,在上面的pom.xml中dockerDirectory节点中保持一致。Dockerfile文件配置如下:

FROM openjdk:8
MAINTAINER flyduck 'flyduck@flyduck.com'
ENV APP_HOME=/usr/local/app
ENV PROJECT_HOME=${APP_HOME}/springboot-docker-1.0-SNAPSHOT
COPY springboot-docker-1.0-SNAPSHOT.zip springboot-docker.zip
RUN mkdir -p ${APP_HOME} && mv springboot-docker.zip ${APP_HOME}
RUN cd ${APP_HOME} && unzip springboot-docker.zip && rm -rf springboot-docker.zip
RUN chmod 777 ${PROJECT_HOME}/bin/dockerrun.sh
EXPOSE 7003
ENTRYPOINT sh ${PROJECT_HOME}/bin/dockerrun.sh

Dockerfile镜像制作逻辑如下:

  1. 项目的运行依赖 Java 环境,所以镜像基于 openjdk:8镜像来构建。
  2. 容器中创建/user/local/app目录,将打包的zip文件拷贝到容器中,并移动到/user/local/app目录,然后解压zip文件到/user/local/app目录。
  3. 将程序的端口通过EXPOSE暴露出来。
  4. 最后就是配置一下启动命令,由于我们springboot项目使用的zip打包发布的方式,所以启动的方式和默认springboot项目有些区别。这里我们单独将启动配置放入dockerrun.sh文件,然后通过运行dockerrun.sh文件的方式启动程序。

dockerrun.sh运行程序配置如下:

# app home
APP_HOME=/usr/local/app/springboot-docker-1.0-SNAPSHOT
# java jar
PROJECT_NAME=${APP_HOME}/springboot-docker-1.0-SNAPSHOT.jar

#spring init load application properties or yml
CONF_FILE=${APP_HOME}/config/application.yml

# java opts.
JAVA_OPTS="-Xms64m -Xmx64m -Xmn64m"

#pid file
PID_CONF=${APP_HOME}/pid/process.pid

java ${JAVA_OPTS} -Djava.ext.dirs=${APP_HOME}/lib:$JAVA_HOME/jre/lib/ext -Dspring.config.location=${CONF_FILE} -jar ${PROJECT_NAME}

构建镜像以及推送到服务器

在IDEA中直接点击install,会先打包springboot项目,然后在dockerHost配置的服务器上构建镜像,最后推送到registerUrl配置的docker私服或者hub docker上。

 项目install完成后,登录linux服务器,可以看到镜像已经构建成功:

登录docker hub网站,可以看到镜像已经推送到docker hub上: 

 

总结

本文主要介绍如何在IDEA中将SpringBoot项目构建docker镜像并推送到私服或者docker hub上,本文通过使用docker-maven-plugin插件的方式,连接docker环境的linux服务器构建docker镜像,并推送到docker hub上。如果需要推送到私服上,只需要将pom.xml中推送的配置修改私服的配置即可。示例代码已经上传至Gitee上,感兴趣的小伙伴可以直接获取查看。

参考

CentOS上安装docker环境

Maven 插件之 docker-maven-plugin 的使用

Github上docker-maven-plugin源码地址

docker与Spring boot的集成:docker-maven-plugin使用
Maven 插件之 docker-maven-plugin 的使用
docker-maven-plugin的github地址

使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上 - 码农教程

详细docker-maven-plugin使用方法_服务器_网站技巧 - 编程客栈

私服docker registry server安装

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐