前置條件
容器化spring boot應用所需環境:
- jdk 1.8 +
- maven 3.0 +
我們的需求是:使用maven打包,將spring boot應用制作成docker鏡像并上傳到docker hub。在其他機器上,可以直接docker pull并運行容器。
創建spring boot應用
spring boot 包結構為:
1
2
3
4
5
|
└── src └── main └── java └── me └── ithakar |
創建spring boot Application主類,src/main/java/me/ithakar/Application.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package me.ithakar; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class Application { @RequestMapping ( "/" ) public String home() { return "docker app running" ; } public static void main(String[] args) { SpringApplication.run(Application. class , args); } } |
pom.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<? xml version = "1.0" encoding = "UTF-8" ?> < project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > < modelVersion >4.0.0</ modelVersion > < groupId >me.ithakar</ groupId > < artifactId >docker-app</ artifactId > < version >0.1.0</ version > < parent > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-parent</ artifactId > < version >1.5.3.RELEASE</ version > </ parent > < properties > < java.version >1.8</ java.version > </ properties > < dependencies > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-web</ artifactId > </ dependency > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-test</ artifactId > < scope >test</ scope > </ dependency > </ dependencies > < build > < plugins > < plugin > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-maven-plugin</ artifactId > </ plugin > </ plugins > </ build > </ project > |
打包并啟動應用
1
|
mvn package && java -jar target/docker-app-0.1.0.jar |
訪問 http://localhost:8080/ ,獲得響應:
1
|
docker app running |
則spring boot應用啟動成功
創建Dockerfile文件
Dockerfile是一個文本文件,類似shell腳本,其內包含了一條條的指令。每一條指令的內容,就是描述對應的鏡像層應當如何構建。
Dockerfile位置:src/main/docker/Dockerfile
1
2
3
4
5
6
|
FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD docker-app-0.1.0.jar app.jar RUN sh -c 'touch /app.jar' ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ] |
- FROM 命令指定基礎鏡像,以一個鏡像為基礎,在其上進行定制。在這里我們的基礎鏡像是frolvlad/alpine-oraclejdk8:slim。
- VOLUME 定義匿名卷。對于可能需要操作數據庫類需要保存動態數據的應用,其數據文件應該保存在主句的卷,而不是容器的儲存層。在這里我們是將其掛載在了/tmp這個位置,從而保證了容器的無狀態化。
- ADD 命令是較高級的復制命令,將jar包復制到/app.jar
- ENTRYPOINT 容器運行后默認執行的命令
添加maven docker插件
docker maven插件是為了方便java開發者,由spotify公司開發的一款maven插件。添加以下代碼至pom.xml文件中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
< properties > < docker.image.prefix >ithaka</ docker.image.prefix > </ properties > < build > < plugins > < plugin > < groupId >com.spotify</ groupId > < artifactId >docker-maven-plugin</ artifactId > < version >0.4.11</ version > < configuration > < imageName >${docker.image.prefix}/${project.artifactId}:${project.version}</ imageName > < dockerDirectory >src/main/docker</ dockerDirectory > < pushImage >true</ pushImage > < resources > < resource > < targetPath >/</ targetPath > < directory >${project.build.directory}</ directory > < include >${project.build.finalName}.jar</ include > </ resource > </ resources > </ configuration > </ plugin > </ plugins > </ build > |
注意,docker.image.prefix中的ithaka為我的docker hub 賬戶,使用時將其換成自己的
使用maven命令打包應用、構建docker鏡像并上傳鏡像到docker hub:
1
|
mvn package docker:build -DpushImage |
此時我們將得到一個報錯:
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:0.4.11:build (default-cli) on project docker-app: Exception caught: denied: requested access to the resource is denied
這是因為我們在maven中push時,并沒有包含docker的用戶信息,所以權限校驗失敗。
解決方法為,在maven全局setting.xml配置中,添加docker hub server信息
1
2
3
4
5
6
7
8
|
< server > < id >docker-hub</ id > < username >ithaka</ username > < password >密碼</ password > < configuration > < email >郵箱</ email > </ configuration > </ server > |
在pom.xml中的docker-maven-plugi插件中,指定server
1
2
3
4
5
6
7
|
< plugin > < groupId >com.spotify</ groupId > < artifactId >docker-maven-plugin</ artifactId > < configuration > < serverId >docker-hub</ serverId > </ configuration > </ plugin > |
再繼續執行
1
|
mvn package docker:build -DpushImage |
出現
The push refers to a repository [docker.io/ithaka/docker-app]
8c02854cd300: Pushed
a03c3b5dbe04: Pushed
8018d52798bb: Pushed
1e6468b956ae: Pushed
3fb66f713c9f: Pushed0.0.1: digest: sha256:63456345745755577c19103dcf4838894e34d45a68a1ec23b2f69d6f059 size: 1375
即為上傳docker hub成功。
啟動docker容器
在另外一臺機器上,執行命令
1
|
docker run -p 8080:8080 -t ithaka /docker-app |
訪問http://ip:8080/ ,獲得響應:
1
|
docker app running |
docker應用啟動成功
參考文檔:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://segmentfault.com/a/1190000009618531