Docker部署SpringBoot项目

Scroll Down

Docker部署SpringBoot项目


1. 前期准备

1.1 配置远程连接Docker

开放2375端口,可能会导致服务器被攻击

$ cp /lib/systemd/system/docker.service /lib/systemd/system/docker.service_backup 备份文件

$ vim /lib/systemd/system/docker.service 修改docker配置文件

$ ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 修改该段配置

$ systemctl daemon-reload 重新加载配置文件

$ systemctl restart docker 重启docker

1.2 IDEA连接Docker

安装Docker插件,显示是successful则远程连接Docker成功

2. docker打包

2.1 采用docker-maven插件打包

官网参考地址

2.1.1 pom.xml配置

若不添加spring-boot-maven-plugin,可能导致运行找不到主类main

<!--            maven打包-->
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.2.0.RELEASE</version>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

<!--            docker打包-->            
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.2.0</version>
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <dockerHost>http://192.168.80.130:2375</dockerHost> <!--docker地址-->
        <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <!--镜像名只能是小写,此处为dockerdemo/dockerdemo-->
        <!--                    <imageTags>-->
        <!--                        <imageTag>${project.version}</imageTag>-->
        <!--                    </imageTags>-->
        <!--                    <forceTags>true</forceTags>-->
        <dockerDirectory>src/main/docker</dockerDirectory> <!--Dockerfile的位置-->
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

2.1.2 配置Dockerfile文件

#基础镜像,运行环境
#FROM openjdk:8-jdk-alpine 打包docker镜像出现无法初始化servlet

FROM java:8

#一个特别指定的目录,用于存储数据,该命令的作用是在/var/lib/docker创建一个名为tmp的目录,在开启redis服务时,需要特别指定redis的数据存储在哪个文件夹,此时这个命令就十分有用
VOLUME /tmp
#拷贝文件并且重命名
ADD dockerdemo-0.0.1-SNAPSHOT.jar app.jar
#并不是真正的发布端口,这个只是容器部署人员与建立image的人员之间的交流,即建立image的人员告诉容器布署人员容器应该映射哪个端口给外界
EXPOSE 8000
#容器启动时运行的命令,相当于我们在命令行中输入java -jar xxxx.jar,为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT
#ENTRYPOINT ["java","-jar","/app.jar"]
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

2.2.3 docker插件打包镜像

windows执行如下命令:

mvn clean package

mvn clean install

Linux执行如下命令:

mvn clean insatll docker:build

查看docker镜像,新增dockerdemo/dockerdemo镜像说明构建成功

$ docker images

2.2.4 运行docker镜像

$ docker run --name quartz --restart=always \
  -d -p 8000:8000 quartz/quartz

运行成功显示如下:


2.2.5 使用IDEA运行docker镜像




2.2 采用dockerfile-maven插件打包

官网参考地址

2.2.1 pom.xml配置

<properties>
    <dockerfile-maven-plugin.version>1.3.4</dockerfile-maven-plugin.version>
    <docker.image.prefix>${project.groupId}</docker.image.prefix>
</properties>
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>${dockerfile-maven-plugin.version}</version>
    <!--执行mvn clean install默认docker打包-->
    <!--                <executions>-->
    <!--                    <execution>-->
    <!--                        <id>default</id>-->
    <!--                        <goals>-->
    <!--                            <goal>build</goal>-->
    <!--                            <goal>push</goal>-->
    <!--                        </goals>-->
    <!--                    </execution>-->
    <!--                </executions>-->
    <configuration>
        <!--                    &lt;!&ndash;使用maven setting认证&ndash;&gt;-->
        <!--                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>-->
        <!--                    &lt;!&ndash;子用户名@企业别名 或 子用户名@主账号UID&ndash;&gt;-->
        <!--                    <username>镜像仓库用户名</username>-->
        <!--                    &lt;!&ndash;在容器镜像服务控制台"设置Registry登陆密码"&ndash;&gt;-->
        <!--                    <password>镜像仓库密码</password>-->
        <!--                    &lt;!&ndash;上传的仓库路径 registry.cn-hangzhou.aliyuncs.com/namespace/repositoryname&ndash;&gt;-->
        <repository>${docker.image.prefix}/${project.artifactId}</repository>
        <!-- 上下文路径配置,此处设置为项目根路径 用来读取Dockerfile-->
        <contextDirectory>${project.basedir}</contextDirectory>
        <!-- 标记 -->
        <tag>${project.version}</tag>
        <!--作为Dockerfile文件参数传入-->
        <buildArgs>
            <ARTIFACT>target/${project.build.finalName}.${project.packaging}</ARTIFACT>
        </buildArgs>
    </configuration>
</plugin>

2.2.2 配置Dockerfile文件

# 基础镜像,运行环境打包,(注:docker镜像出现无法初始化servlet,使用FROM java:8)
FROM openjdk:8-jre-alpine

# 维护者
MAINTAINER Mr.Kong@by 1031652818@qq.com

#一个特别指定的目录,用于存储数据,该命令的作用是在/var/lib/docker创建一个名为tmp的目录,在开启redis服务时,需要特别指定redis的数据存储在哪个文件夹,此时这个命令就十分有用
VOLUME /tmp

#拷贝文件并且重命名
ARG ARTIFACT
ADD ${ARTIFACT} app.jar

#并不是真正的发布端口,这个只是容器部署人员与建立image的人员之间的交流,即建立image的人员告诉容器布署人员容器应该映射哪个端口给外界
EXPOSE 8000

#容器启动时运行的命令,相当于我们在命令行中输入java -jar xxxx.jar,为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT
#ENTRYPOINT ["java","-jar","/app.jar"]
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

2.2.3 dockerfile插件打包镜像

注: 出现 COPY failed: stat /var/lib/docker/tmp/docker-builder...: no such file or directory) 或者 ADD failed: stat /var/lib/docker/tmp/docker-builder...: no such file or directory)问题时,请检查pom.xml中的配置,Dockerfile文件位置和上下文位置是否正确。

mvn clean install dockerfile:build

2.2.4 构建dockerfile自动打包脚本

2.2.4.1 build.sh脚本

#!/bin/bash

echo "use grep -E specific project,enter name regex to args"
sp=".*";
if [ -z $1 ];
then
  echo "do all"
else
  sp=$1;
  echo "arg1----->$sp"
fi

#projectsDir=/data/project/misc/projects/;
#ls -F $projectsDir| grep '/$'|grep tx|grep -E $sp 
#for updatedir in $(ls -F $projectsDir| grep '/$'|grep tx|grep -E $sp) ;do cd $projectsDir;echo "updatedir--->"$updatedir;pwd;cd $updatedir; pwd;git pull;mvn clean install;if [ -z `echo $updatedir|grep common` ] ;then pwd ;webdir=`ls -d ./*|grep web`;echo $webdir;cd $webdir;mvn dockerfile:build; fi;done

workDir=/data/fastdfs;

echo "----->cd "$workDir;

cd $workDir;

git pull;

cp $workDir/src/main/docker/Dockerfile . ;

mvn clean install dockerfile:build;

echo "----->dockerfile:build success";

rm -rf Dockerfile;

2.2.5 构建docker-compose自动化部署容器

2.2.4.1 fastdfs.sh脚本

docker-compose -f fastdfs.yml stop

docker-compose -f fastdfs.yml rm --force

./build.sh fastdfs

docker-compose -f fastdfs.yml up -d

2.2.4.1 fastdfs.yml配置文件

version: '2'
services:
      web:
        image: com.fastdfs/springboot-fastdfs:0.0.1-SNAPSHOT
        hostname: fastdfs
        container_name: fastdfs
        ports:
            - 8000:8000

2.2.6 自动化构建

$ chomd +x build.sh  && chmod +x fastdfs.sh

$ ./fastdfs.sh

构建成功,显示如下:

Docker部署项目参考开源地址