一. 准備工作
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