基于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>
<!-- <!–使用maven setting认证–>-->
<!-- <useMavenSettingsForAuth>true</useMavenSettingsForAuth>-->
<!-- <!–子用户名@企业别名 或 子用户名@主账号UID–>-->
<!-- <username>镜像仓库用户名</username>-->
<!-- <!–在容器镜像服务控制台"设置Registry登陆密码"–>-->
<!-- <password>镜像仓库密码</password>-->
<!-- <!–上传的仓库路径 registry.cn-hangzhou.aliyuncs.com/namespace/repositoryname–>-->
<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
构建成功,显示如下: