1、說明:
docker容器化部署是非常流行的,Java應用如果要運行在docker環境,就要制作包含該應用的docker鏡像,可以手動使用dockerfile和docker-compose制作鏡像,也可以使用插件docker-maven-plugin和jib-maven-plugin制作鏡像;本文只講這兩種插件的使用以及需要注意的一些細節;以springboot項目為例,詳細介紹下這兩種用法!
2、jib-maven-plugin實現方式
2.1 搭建springboot項目
搭建過程在此不過多演示,如果想自己嘗試,或者查看我的源碼,可以去我的倉庫下載:springboot-docker
2.2 編寫pom.xml配置
<properties>
<java.version>1.8</java.version>
<!--通過registry搭建的私有鏡像倉庫地址-->
<registryUrl>192.168.100.64:5000</registryUrl>
</properties>
<!--使用jib插件-->
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.3.0</version>
<configuration>
<!--from節點用來設置鏡像的基礎鏡像,相當於Docerkfile中的FROM關鍵字-->
<from>
<!--使用私有倉庫鏡像,tag是8-->
<image>${registryUrl}/java:8</image>
<!-- 也可以使用docker hub提供的,有時下載不下來 -->
<!-- <image>docker.io/library/java:8</image>-->
</from>
<to>
<!--鏡像名稱和tag,其中使用了mvn內置變量${project.version},表示當前工程的version-->
<image>${registryUrl}/dxiaodang/jib:${project.version}</image>
<!--或者也可以使用tags標簽單獨指定version -->
<!--<tags>
<tag>${project.version}</tag>
</tags>-->
</to>
<!--私服是http不是https,默認jib不推送到非https的私服,私服添加,公服不添加-->
<allowInsecureRegistries>true</allowInsecureRegistries>
<!--容器相關的屬性-->
<container>
<!--jvm內存參數-->
<jvmFlags>
<jvmFlag>-Xms4g</jvmFlag>
<jvmFlag>-Xmx4g</jvmFlag>
<jvmFlag>-Duser.timezone=Asia/Shanghai</jvmFlag>
</jvmFlags>
<!--暴露的端口-->
<ports>
<port>8080</port>
</ports>
<!--設置鏡像的創建時間為系統時間-->
<useCurrentTimestamp>true</useCurrentTimestamp>
</container>
</configuration>
</plugin>
✌️ 注意點(本文的精髓)✌️
- from節點設置基礎鏡像,獲取的方式有三種:
- 使用openjdk官方鏡像
- 使用自己的私有倉庫的鏡像,並將base鏡像放入到私有倉庫;私有倉庫搭建請參考:docker搭建私有鏡像倉庫
- 使用docker hub提供的
- 鏡像打包方式分為三種:
- build:鏡像推送到遠程倉庫;可以推送到docker hub上,也可以推送到自己的私有倉庫;
- 如果鏡像要推送到自己的私有倉庫,鏡像名稱必須滿足私有倉庫的要求:registry_url:port/ImageName:tag
- 設置本地docker服務支持http:修改docker配置文件:/etc/docker/daemon.json,在json中增加內容"insecure-registries": ["192.168.100.64:5000"]
- dockerBuild:鏡像存入當前鏡像倉庫,
- buildTar:鏡像生成tar文件,保存在項目的target目錄下,在任何docker環境執行 docker load < jib-image.tar即可導入到本地鏡像倉庫
- dockerBuild和buildTar打包的前提是本地需要安裝docker,看了好多博客都沒有提到這點,導致打包一直報錯
- 將jib打包與mvn構建的生命周期綁定
<!--將插件綁定在某個phase執行-->
<executions>
<execution>
<id>build-image</id>
<!--將插件綁定在package這個phase上。也就是說,用戶只需執行mvn package ,就會自動執行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
- 鏡像生成時間:<useCurrentTimestamp>標簽,可以設置鏡像的創建時間,但是2.3.0版本的插件是沒有這個參數的,要不然就報錯了,親測
2.3 驗證測試
2.3.1 個人私有倉庫是否存在?

2.3.2 私有倉庫pull鏡像

2.3.3 啟動

2.3.3 測試:curl localhost:8098

2、docker-maven-plugin實現方式
2.1 搭建springboot項目
搭建過程在此不過多演示,如果想自己嘗試,或者查看我的源碼,可以去我的倉庫下載:springboot-docker
2.2 編寫pom.xml配置
<!--docker-maven-plugin插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--將插件綁定在某個phase執行-->
<executions>
<execution>
<id>build-image</id>
<!--將插件綁定在package這個phase上。也就是說,用戶只需執行mvn package ,就會自動執行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的鏡像名-->
<imageName>dangbo/${project.name}</imageName>
<!--指定tag標簽-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 指定 Dockerfile 路徑 ${project.basedir}:項目根路徑下-->
<dockerDirectory>${project.basedir}</dockerDirectory>
<!--指定遠程 docker api地址-->
<dockerHost>http://192.168.100.64:2375</dockerHost>
<!-- 這里是復制 jar 包到 docker 容器指定目錄配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--jar 包所在的路徑 此處配置的 即對應 target 目錄-->
<directory>${project.build.directory}</directory>
<!-- 需要包含的 jar包 ,這里對應的是 Dockerfile中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!-- 以下兩行是為了docker push到DockerHub使用的。 -->
<!--<serverId>docker-hub</serverId>-->
<!--<registryUrl>https://index.docker.io/v1</registryUrl>-->
</configuration>
</plugin>
2.3 編寫Dockerfile文件
# 項目所依賴的鏡像
FROM java:8
# 將maven構建好的jar添加到鏡像中
ADD target/*.jar app.jar
# 暴露的端口號,用於標記信息,和容器內程序保持一致,使運維人員知道容器都要暴露哪些端口
EXPOSE 31945
# 鏡像所執行的命令
ENTRYPOINT ["java","-jar","/app.jar"]
✌️ 注意點✌️
- docker需要開啟2375端口,提供外部訪問docker:修改docker配置文件並重啟
- 配置文件:
/lib/systemd/system/docker.service
- 重啟命令:
systemctl restart docker
- 命令:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
2.4 打包鏡像
由於將插件綁定在mvn package上,直接執行命令即可:mvn clean package -Dmaven.test.skip=true
2.5 驗證測試
2.5.1 查看鏡像是否存在

2.5.2 啟動
2.5.3 測試接口

本次分享就到此結束,如果有不對的地方,請大家評論區留言,謝謝!!!