一. 准备工作
idea 安装docker插件
进入到Idea-Preferences-Plugin-搜索docker 点击Install 下载安装成功后 重启Idea。
idea配置docker
进入到Idea-Preferences-Build...Docker 配置docker
Engine API URL填写docker的IP:2375即可(mac需要修改)
***配置docker地址的时候需要注意,远端地址与本地地址都可以配置,但是后面创建docker镜像时笔者遇到了很多问题,试了很多次才成功
笔者下面介绍自己成功的两个案例。
***总结来看就是本地docker用dockerfile-maven-plugin容易成功
远端docker用docker-maven-plugin容易成功,其他的总是出各种错,由于能力,时间有限只成功了这两种。
本地mac安装配置docker
请点击以下链接下载 Stable 或 Edge 版本的 Docker for Mac。
如同 macOS 其它软件一样,安装也非常简单,双击下载的 .dmg 文件,然后将鲸鱼图标拖拽到 Application 文件夹即可。
配置镜像加速
设置docker外部访问
外部访问docker需要链接2375端口,由于mac本2375端口没法直接链接,所以需要运行一个容器来开通外部访问
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:1234:1234 bobrik/socat TCP-LISTEN:1234,fork UNIX-CONNECT:/var/run/docker.sock
然后执行
export DOCKER_HOST=tcp://localhost:1234
远端安装配置docker
配置Docker,开启远程访问(例:aliyun服务器)
(注:仅供学习参考,实际生产环境万万不可,会产生很大的安全风险),默认端口是2375,也可以修改为其他端口
1、修改/lib/systemd/system/docker.service文件
在ExecStart
后面追加 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
2、重新加载配置文件,重启docker,使得刚才的配置生效
#重新加载配置文件 systemctl daemon-reload #重启docker服务 systemctl restart docker
这样就完成了准备工作,这些准备工作基本不会出什么错误
二. 本地mac创建镜像
pom文件配置
dockerfile-maven-plugin
将 SpringBoot 项目打包成 Docker 镜像,其主要通过 Maven plugin 插件来进行构建。
接下来就看一下plugin插件的配置和操作
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <configuration> <repository>com.uu.${project.artifactId}</repository> <tag>${project.version}</tag> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin>
因为我是自己测试,为了可以手动控制就没有在install阶段就创建镜像,所以plugin配置稍微简单一些,如果像实现自动,可以添加下面的配置
<executions> <execution> <id>default</id>
<phase>install</phase> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution>
</executions>
参数说明:
- repository:指定Docker镜像的repository名字,要展示在docker images 中的。
- tag:指定Docker镜像的tag,不指定tag默认为latest
- buildArgs:指定一个或多个变量,传递给Dockerfile,在Dockerfile中通过ARG指令进行引用。
- JAR_FILE 指定 jar 文件名。
- goal:绑定dockerfile的build与push到maven阶段
- phase: 设置要绑定的阶段,例如package,install
点击图上的操作就可以自己手动来控制了,测试的时候更方便
Dockerfile
#设置镜像基础,jdk8 FROM java:8 #设置镜像对外暴露端口 EXPOSE 8080 #ARG:引用plugin中配置的 JAR_FILE 文件 ARG JAR_FILE #将当前 target 目录下的 jar 放置在根目录下,命名为 app.jar,推荐使用绝对路径。 ADD target/${JAR_FILE} /app.jar #执行启动命令 ENTRYPOINT ["java", "-jar","/app.jar"]
参数说明:
- FROM:基于java:8镜像构建
- EXPOSE:监听8080端口
- ARG:引用plugin中配置的 JAR_FILE 文件
- ADD:将当前 target 目录下的 jar 放置在根目录下,命名为 app.jar,推荐使用绝对路径。
- ENTRYPOINT:执行命令 java -jar /app.jar
Dockerfile文件一定要放在和pom.xml文件一起的最外层目录
自己遇到的一些坑
Failed to execute goal com.spotify:dockerfile-maven-plugin:1.4.13:build (default) on project docker_admin: Missing Dockerfile in context directory:
Dockerfile文件放错位置了会报着个错误
配置参数里有个标签
<dockerfile>/src/main/java/docker</dockerfile>
我把标签对应上自己放文件的位置,还是报
Failed to execute goal com.spotify:dockerfile-maven-plugin:1.4.13:build (default) on project docker_admin: Missing Dockerfile at /src/main/java/docker
我发现了一个问题,是不是应该写全路径呀,一直弄不明白,工资又泡汤了(*@︿@*﹀
<dockerfile>/Users/jingxc/service/sts-project/uu_boot_admin/src/main/java/docker</dockerfile>
改成这样子试试(*@ο@*) 哇~ 然而又出现新的问题了
Execution default of goal com.spotify:dockerfile-maven-plugin:1.4.13:build failed: Could not acquire image ID or digest following build -> [Help 1]
太悲催了,这个问题智能问度娘了,什么都有,最多的就是修改.dockerignore 文件内容:可是我没有配置这个文件呀,这可咋么办呢。。。。。。
还有人说重新装一遍docker。。。。。
哎,在探索的路上越走越远了,时间紧迫就不去深钻了,头发都没几根了
最后还是放在最外面吧
不过,我测试的时候遇见了文件放的位置没问题,pom.xml配置也没问题,就是报
Execution default of goal com.spotify:dockerfile-maven-plugin:1.4.13:build failed: Could not acquire image ID or digest following build -> [Help 1]
不知道怎么回事,项目clean,刷新依赖都不行,应该是Dockerfile出现问题了,但是我查了好多遍都没问题,就几行代码都快一个一个字看了,最后实在无奈
我只能把Dockerfile文件删除了,清空项目刷新一下,又重新复制进去,就好了,就很神奇。
docker部署
通过命令行:docker run -di --name admin -p 8080:8080 com.uu.docker_admin
当然本地有图形化界面,可以直接启动
启动成功,新手村已经攻略,哈哈
三. 远端aliyun创建镜像
新手村已经攻略完成,准备去异界大陆,装备就先不换了,只需要修改一下,idea插件地址
进入到Idea-Preferences-Build...Docker 配置docker
嗯?什么鬼好像有点水土不服,为什么我配置上远端的地址还是在我本地生成了镜像,一定是有什么结界,我先把自身的修为散去试试,关掉本地的docker服务试试
Caused by: com.spotify.docker.client.exceptions.DockerException: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.IOException: Connection refused
链接被拒绝,看样子还是没有用到远端的docker,哎北鼻无奈,只能学习强化技能了
pom文件配置
利用docker-maven-plugin配置远端的上传地址
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <!--镜像名称--> <imageName>com.uu.${project.artifactId}</imageName> <!--指定dockerfile路径--> <!--<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>--> <!--指定标签--> <imageTags> <imageTag>latest</imageTag> </imageTags> <!--远程仓库地址--> <!--<registryUrl>123.123.123.123:5000</registryUrl>--> <!--<pushImage>true</pushImage>--> <!--基础镜像jdk1.8--> <baseImage>java:8</baseImage> <!--制作者提供本人信息--> <maintainer>18@163.com</maintainer> <!--切换到ROOT目录--> <workdir>/ROOT</workdir> <cmd>["java","-version"]</cmd> <entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint> <!--指定远程docker地址--> <dockerHost>http://123.123.123.123:2375</dockerHost> <!--这里是复制jar包到docker容器指定目录配置--> <resources> <resource> <targetPath>/ROOT</targetPath> <!--指定需要复制的根目录,${project.build.directory}表示target目录--> <directory>${project.build.directory}</directory> <!--用于指定需要复制的文件,${project.build.finalName}.jar表示打包后的jar包文件--> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
打包上传成功
如果想实现自动化打包,那么加上下面的配置就可以
<executions> <execution> <id>default</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions>
这里也有坑
配置文件里有配置
<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
用这个配置一下,就用刚才写好的Dockerfile,又出现问题了。。。。。
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project docker_test: Exception caught: ADD failed: stat /var/lib/docker/tmp/docker-builder061031577/target: no such file or directory -> [Help 1]
出现这个问题有好多原因:
- 没有执行maven-package,未创建jar包
- jar包名称不对
- jar包地址不对
- Dockerfile文件与jar不在同一目录下
- 不过上面说的都是基于项目文件和docker环境在同一台服务器上的原因,比如自动化部署的时候,但是现在我的Dockerfile在本地,想部署到远端
/var/lib/docker/tmp/docker-builder061031577/target这个路径就太不对了,刚开始的时候一直以为是配置的问题,参考了一些资料后来最终改成上面的配置
参考链接
https://www.cnblogs.com/niceyoo/p/13796792.html