把SpringBoot项目打包成Docker镜像有两种方案:
全自动化:先打好docker镜像仓库,然后在项目的maven配置中配置好仓库的地址,在项目里配置好Dockerfile文件,这样可以直接在idea中打包好后自动上传到镜像仓库,然后去服务器上启动这个镜像就行了。
半自动化:半自动化又有两种方案,一种是Dockerfile文件放在项目里面,一种是放在项目外面。
放在项目里面:springboot pom.xml中配置maven插件支持,打包时会使用项目里面的dockerfile,如果没配置插件支持会报错找不到dockerfile文件
放在项目外面:springboot还是打包成普通的jar,然后把这个jar上传到服务器,同时在服务器创建一个Dockerfile文件,执行docker build命令,把这个jar构建成一个docker镜像,然后通过镜像执行。
一般来说用半自动化比全自动化用的多,本文用的算是半自动化方式的第二种,总体来说有一下几个步骤:
创建docoerfile:
(1)在项目里新建一个名为Dockerfile的文件
编写Dockerfile:
#基础镜像
FROM openjdk:8-jre
#发布到网上时只会把jar包和Dockerfile发布上去
# 把当前目录下的jar包拷贝进docker镜像里
COPY *.jar /ftdocker.jar
#CMD命令用于指定这个容器启动的时候要运行的命令(CMD一行只执行一个命令,可以写多个CMD)
#地址映射
CMD ["--server.port=8088"]
#对外暴露端口
EXPOSE 8088
# ENTRYPOINT命令用于指定这个容器启动的时候要运行的命令(可以追加命令)
#执行命令
ENTRYPOINT ["java", "-Xmx512m", "-jar", "/ftdocker.jar"]
在服务器里的你想存放项目的位置新建文件夹,用于存放Java项目
把打包好的jar包和Dockerfile文件上传到服务器里
使用Dockerfile打包出一个docker镜像
#选项及解释
-t的t是tag,表示生成的镜像的名称和版本号
.表示当前构建时上下文的路径为当前目录
docker build -t todocker:0.1 .
效果图:
如果指定(FROM java:8),Jenkins构建服务,Dockerfile报错:manifest for java:8-jre not found: manifest unknown: manifest unknown
1、问题描述
Jenkins构建服务,控制台报错:
manifest for java:8-jre not found: manifest unknown: manifest unknown
1、截图:
2、解决问题
这是由于Docker官方已经弃用java8镜像,想使用jdk1.8的话,可以使用openjdk。
解决办法是,将Dockerfile改为 FROM openjdk:8-jre
FROM openjdk:8-jre
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
ARG JAR_FILE
COPY ${JAR_FILE} /app.jar
ENTRYPOINT ["java", "-Xmx512m", "-Djava.security.egd=file:/dev/./urandom", "-Ddruid.mysql.usePingMethod=false", "-jar", "/app.jar"]
CMD ["--spring.profiles.active=prod"]
使用以下命令查看镜像是否构建成功
docker images
效果图:
使用以下命令利用我们新建的docker镜像来启动docker容器
#选项及解释
-d表示容器在后台运行
-P表示随机指定端口或者-p指定端口
--name="name"参数用于给容器取名字 ,用来区分容器
docker run -d -p 8012:8012 --name 容器名称 镜像名称:版本
效果图:
访问docker容器内的项目
(1)因为用-P参数随机指定了docker的端口来映射docker容器内的SpringBoot项目的8080端口,导致不知道docker随机指定的是哪个端口,所以使用以下命令查看随机指定的docker端口是什么(如果在启动docker容器时指定了端口可以不用进行这一步操作)
docker ps
效果图:
(2)使用curl命令来访问docker容器内的SpringBoot项目,出现404的字眼,证明SpringBoot项目启动成功
curl localhost:docker随机指定的端口
效果图
(3)使用curl命令调用SpringBoot项目的接口,发现能调用成功
curl localhost:docker随机指定的端口/接口路径
效果图:
其他问题:
这个错是某个容器已经存在了 可以用下面命令进行停止 并删除 最后启动
docker stop name/image_id
docker rm name/image_id
通过标签删除镜像
通过如下两个都可以删除镜像:
docker rmi [image]
或者:
docker image rm [image]
强制删除:
docker rmi -f image_id
参考链接:链接1,链接2