一、安装windows版的Docker Desktop
项目是在windows 10 上开发的 , maven打包自然也是在 windows 上进行的 ,所以 安装 windows版的docker还是很有必要的...
已安装的跳过...
1、启用Hyper-V
打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图:
点击确定后,启用完毕会提示重启系统,我们可以稍后再重启。
2、安装Docker
docker hub 上下载的比较慢 , 这里提供 百度网盘下载 地址
傻瓜式安装就好 ,安装成功后 单击Close and log out,重启一次电脑。
3、启动Docker
在桌面找到Docker for Windows快捷方式,双击启动即可!启动成功后托盘处会有一个小鲸鱼的图标。
打开命令行输入命令:docker -v可以查看当前docker版本号,如图:
复制镜像加速地址,打开docker 设置菜单 settings
在General菜单,打开2375选项,如图所示:
避免C盘系统盘过度占用,更改镜像存放目录,如图所示:
二、打包镜像
首先在你需要打包的项目的根目录新建 Dockerfile 文件
Dockerfile 文件内容如下:
#需要依赖 jdk:8 这个镜像(如果是首次打包,它会自动下载这个镜像)
FROM openjdk:8-jdk-alpine
#维护者、作者的信息
MAINTAINER administrator
#对Spring Boot应用程序为Tomcat创建的默认工作目录进行挂载(就是所有的jar默认放在/tmp下面)
VOLUME /tmp
#构建一个变量,变量名为:JAR_FILE
ARG JAR_FILE
#一个添加命令,把文件添加到镜像中,这里是将 ${JAR_FILE} 添加到 /app/app.jar
#如果 /app 这个文件夹不存在它会自行创建这个文件夹
ADD ${JAR_FILE} /app/app.jar
#指定服务运行的端口,也是之后 -p 要映射的端口
EXPOSE 8073
#启动时的默认命令(就是定义 启动容器时要执行什么命令)
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]
更多的关于构建 Dockerfile 文件的命令 可以参考官网的介绍:Dockerfile reference
pom.xml增加docker插件
修改SpirngBoot项目的pom.xml文件,增加docker集成插件,如下图所示:
在你的 pom.xml 中新增 dockerfile 插件
com.spotify
dockerfile-maven-plugin
1.4.12
1224/${project.artifactId}
${project.version}
target/${project.build.finalName}.jar
之后在项目的根目录下执行打包命令:mvn clean package dockerfile:build
Dockerfile 一定要放到项目的根路径!!(不然它找不到....)
如果是父子项目则放到子项目的根目录就行(就像上图那样....)
正常情况下会出现上面截图的 BUILD SUCCESS字样(也有不正常情况,自行百度异常信息.....)
然后输入 docker images 讲道理是会出现这两个镜像的
使用docker run命令运行这个容器..
使用docker logs命令查看这个容器的运行日志
docker logs imagesId:从到到尾打印这个日志(它也有一个 -f 指令,用于实时查看的)
docker attach imagesId:实时查看容器日志(类似于linux的 tail -f 命令)
三、配置Maven命令默认执行dockerfile命令
为了方便,我们可以将不同的dockerfile命令绑定到不同的maven phase
就是要实现 mvn clean package = mvn clean package dockerfile:build
绑定方式就是在pom.xml中添加相应的配置,如下所示
default
package
build
push
这里的 push 你也可以不写(如果你不需要推送的话...)
package也可以不写,不写就是默认的mvn clean deploy
此时你执行:
mvn clean package = mvn clean package dockerfile:build
mvn clean deploy = mvn clean deploy dockerfile:push
默认,构建Dockerfile的过程包含在mvn package阶段;
默认,为Dockerfile打标签的过程包含在mvn package阶段;
默认,发布Dockerfile的过程包含在mvn deploy阶段;
普及下mvn命令
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
当然了 你现在去推镜像 是没有用的,它会报错
还需要做进一步的配置...
四、推送镜像
1、向DockerHub 推送镜像
这里有两种方法,一个是在pom.xml中直接配置username和password来完成push到dockerhub或者private registry,或者在命令行执行时指定mvn goal -Ddockerfile.username=... -Ddockerfile.password=...
我挑选了最省事的...在你的pom.xml文件中只需要在标签里面添加一行true
useMavenSettingsForAuth=true表示访问远程构件库的认证信息在settings.xml中配置,就像这样
这个 1224073217/${project.artifactId} 就是你 docker push 后面的 dockerhub用户名/仓库
然后在你的maven配置文件 settings.xml 中添加你的 docker hub 用户名 和 密码
其中的标签 是本来就存在的 只需要在里面添加 标签就好
docker.io
你的docker hub 用户名
密码
docker hub 注册时的邮箱...
注意其中的 docker.io 不能变,如果你要上传 docker hub 必须指定为 docker.io!!!
它只会找id为 docker.io 的服务,找不到就是没有权限
出现以上错误时,可以参考下github的一个issues: Can't get push to work
然后在你的pom.xml文件中添加对 mvn clean deploy的依赖
org.apache.maven.plugins
maven-deploy-plugin
true
如果没有这个配置虽然可以上传成功,但是会报Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter这个错误
然后执行命令:mvn clean deploy(打包同时上传,如果不出意外的话.....)
会发现[INFO]日志中多出一段上传的信息
至此 docker hub 上传成功,可以对应的查看你的 docker hub 所属的库.
贴上本次上传 docker hub 的所有 pom.xml 中 配置
B
ackstageApplication
org.springframework.boot
spring-boot-maven-plugin
com.jiuge.BackstageApplication
com.spotify
dockerfile-maven-plugin
1.4.10
default
package
build
push
true
1224073217/${project.artifactId}
${project.version}
target/${project.build.finalName}.jar
org.apache.maven.plugins
maven-deploy-plugin
true
2、向阿里云容器镜像服务中推送镜像
首先请自行创建 阿里云镜像仓库 同时记下你的仓库公网地址
接着上面的配置项进行修改
在你的maven配置文件 settings.xml 中添加你的 阿里云的 用户名 和 密码
然后在你的 pom.xml 中的 configuration 里面指定使用阿里云的服务ID
一共就两行
registry.cn-shanghai.aliyuncs.com
registry.cn-shanghai.aliyuncs.com/daiyuanchuan/${project.artifactId}
注意:这里的serverId一定要是你的容器镜像仓库公网地址的域名(/后面的就不要了...)!!