使用 docker 部署 springboot 工程 详细全流程 踩坑记录

718 阅读2分钟

一般部署springboot的方式需要在云服务器上安装java,并在开发的机器上打好jar包上传到云服务器上运行,非常麻烦。

通过docker部署springboot工程就能完成在全程在云服务器上打包到运行,不需要其他操作。

但是由于云服务器无法访问外网,在下载maven及其依赖时,踩了不少坑,在此记录。

准备工作

通过idea的spring初始化工具,会在根目录初始化.mvn文件夹

/.mvn文件夹下有maven-wrapper.jarmaven-wrapper.properties两个文件

用于指定maven的版本,并在本地没有maven时自动根据maven-wrapper.properties中的distributionUrl下载对应版本的maven。

该文件原本为

distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar

将distributionUrl改为国内下载地址,此处我改为华为云镜像的下载地址,根据云服务提供商选择镜像站地址即可。

distributionUrl=https://mirrors.huaweicloud.com/repository/apache/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar

做到这步就能够正常下载maven,之后还需要在pom.xml文件中指定maven源,以正常下载依赖

pom.xml文件中添加,此处添加的是华为云镜像地址

<repositories>
    <repository>
        <id>central</id>
        <url>https://mirrors.huaweicloud.com/repository/maven/</url>
    </repository>
</repositories>

<pluginRepositories>
    <pluginRepository>
        <id>central</id>
        <url>https://mirrors.huaweicloud.com/repository/maven/</url>
    </pluginRepository>
</pluginRepositories>

然而,即使添加了华为云镜像

仍不可避免的有少量依赖项需要到 repo.maven.apache.org 网址下下载

所以建议通过测试ip的网站 ping.chinaz.com/repo.maven.…

寻找延迟最低的ip,测试并替换云服务器中的host 如下

151.101.0.215 repo.maven.apache.org

Dockerfile

之后就可以开始写dockerfile了

多阶段构建,减少最终的image体积

将构建分为两阶段,第一阶段下载maven及依赖,将项目打包为jar包

第二阶段,拷贝jar包,并执行。

# 指定镜像为特定的java8版本
FROM eclipse-temurin:8u362-b09-jdk as builder

WORKDIR /usr/app

COPY ./.mvn/ ./.mvn
COPY mvnw pom.xml ./
# 踩坑 需要为./mvnw文件添加执行权限
RUN chmod +x ./mvnw
# 下载依赖
RUN ./mvnw dependency:go-offline
COPY ./src ./src
# 打包
RUN ./mvnw clean install
 
FROM eclipse-temurin:8u362-b09-jdk
WORKDIR /usr/app
# 复制jar包
COPY --from=builder /usr/app/target/*.jar /usr/app/*.jar
ENTRYPOINT ["java", "-jar", "/usr/app/*.jar" ]

此处我只拷贝了/src /.mvn /pom.xml /mvnw

启动

之后通过docker命令或docker-compose启动springboot工程即可

docker 先构建image,打标签,以下为各参数解释

docker build -t [docker id/repo name:version] [location]

例如

docker build -t moyin/springboot .

之后直接运行即可,以下为各参数解释 -d 在后台执行 -p 指定端口映射

docker run -d -p [local port]:[container port] [image id]

例如

docker run -d -p 6001:6001  moyin/springboot

该命令会返回容器id,根据该容器id可以查看springboot的运行日志

docker logs [container id]