為什麼要用插件 主要還是自動化的考慮,如果額外使用Dockerfile進行鏡像生成,可能會需要自己手動指定jar/war位置,並且打包和生成鏡像間不同步,帶來很多瑣碎的工作。 插件選擇 使用比較多的是spotify的插件:https://github.com/spotify/docker maven ...
為什麼要用插件
主要還是自動化的考慮,如果額外使用Dockerfile進行鏡像生成,可能會需要自己手動指定jar/war位置,並且打包和生成鏡像間不同步,帶來很多瑣碎的工作。
插件選擇
使用比較多的是spotify的插件:https://github.com/spotify/docker-maven-plugin
和 https://github.com/spotify/dockerfile-maven。
但這裡我選擇另一款插件:https://github.com/fabric8io/docker-maven-plugin。
因為他文檔比較詳細,在使用上也比較方便。
文檔地址:https://dmp.fabric8.io/
示例
這裡使用一個spring boot項目,只有一個最簡單的HelloController
,如下:
@RestController
public class HelloController {
@GetMapping("/")
public String hello() {
return "hello";
}
}
pom.xml
改動如下:
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.23.0</version>
<configuration>
<dockerHost>tcp://192.168.99.100:2376</dockerHost>
<certPath>C:\Users\fairjm\.docker\machine\machines\default</certPath>
<images>
<image>
<name>${project.name}:${project.version}</name>
<build>
<from>openjdk:8-jre</from>
<args>
<JAR_FILE>${project.name}-${project.version}.jar</JAR_FILE>
</args>
<assembly>
<descriptorRef>artifact</descriptorRef>
</assembly>
<entryPoint>["java"]</entryPoint>
<cmd>["-jar","maven/${project.name}-${project.version}.jar"]</cmd>
</build>
<run>
<ports>
<port>8888:8080</port>
</ports>
</run>
</image>
</images>
</configuration>
</plugin>
這裡使用了在xml里寫操作而不是使用Dockerfile的方式,個人感覺這種方式更加簡單一點,不需要額外再維護一份文件,和Dockerfile相比使用的語法(註意entrypoint和cmd)也類似。
接下來介紹一下configuration配置。
dockerHost
和certPath
是連接docker使用,畢竟插件本身不包含docker和對應功能只是調用docker提供的API。
這兩個值在docker toolbox上可以通過docker-machine env
獲得。
$ docker-machine env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\fairjm\.docker\machine\machines\default"
export DOCKER_MACHINE_NAME="default"
export COMPOSE_CONVERT_WINDOWS_PATHS="true"
# Run this command to configure your shell:
# eval $("D:\Docker Toolbox\docker-machine.exe" env)
image的build指定了構建相關的設置:
- name指定image名,這裡使用了項目名,tag使用項目版本;
- from指定基於的image,和Dockerfile的FROM一致;
- args和ARG一致(在這個例子中沒有實際意義);
- assembly用來定義哪些文件進入鏡像中,使用了插件已經定義好的行為,spring-boot生成的是fat jar不需要拷貝依賴所以選擇了artifact。這個的配置比較豐富,可以查看文檔獲取更多的信息。
- entryPoint和cmd也對應同樣的Dockerfile命令。
接著通過mvn clean package docker:build
執行打包和build
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ docker-test ---
[INFO] Building jar: D:\sts_workspace\docker-test\target\docker-test-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.5.9.RELEASE:repackage (default) @ docker-test ---
[INFO]
[INFO] --- docker-maven-plugin:0.23.0:build (default-cli) @ docker-test ---
[INFO] Copying files to D:\sts_workspace\docker-test\target\docker\docker-test\0.0.1-SNAPSHOT\build\maven
[INFO] Building tar: D:\sts_workspace\docker-test\target\docker\docker-test\0.0.1-SNAPSHOT\tmp\docker-build.tar
[INFO] DOCKER> [docker-test:0.0.1-SNAPSHOT]: Created docker-build.tar in 1 second
[INFO] DOCKER> [docker-test:0.0.1-SNAPSHOT]: Built image sha256:303c3
[INFO] DOCKER> [docker-test:0.0.1-SNAPSHOT]: Removed old image sha256:ea8a7
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
完成打包,在對應連接的docker上也會出現這個鏡像:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-test 0.0.1-SNAPSHOT 303c39c7d253 13 seconds ago 552MB
run指定了運行參數 這裡將host的8888和容器的8080綁定,可以使用mvn docker:start
啟動,訪問8888埠即可連接到伺服器。
與其配對的是mvn docker:stop
,可以停止並移除啟動的容器。
更多
本文簡要說明瞭使用fabric8
的docker maven插件進行構建運行相關的操作,該插件還有其他的功能可以通過上面的文檔獲取幫助。
源碼下載
https://github.com/fairjm/spring-boot-docker