「Spring Boot」 Docker打包映象
阿新 • • 發佈:2018-12-26
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。
Docker version 18.06.1-ce, build e68fc7a
新建SpringBoot應用
完整pom.xlm
<?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>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging >jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version >2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<docker.image.prefix>cyinfo-demo</docker.image.prefix>
</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>
<finalName>docker-demo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>
修改啟動檔案
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
@SpringBootApplication
@Controller
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping("/user/find")
@ResponseBody
public Object findUser (){
Map<String, String> map = new HashMap<>();
map.put("name", "aprcode.com");
return map;
}
}
新增DockerFile檔案
在專案根目錄新增DockerFile
檔案
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
引數詳解
FROM
FROM <image> [AS <name>]
或
FROM <image>[:<tag>] [AS <name>]
或
FROM <image>[@<digest>] [AS <name>]
FROM為後續指令設定基礎映象,因此,有效的Dockerfile必須以FROM指令開頭,映象可以是任何有效影象 - 通過從Public Repositories提取映象來啟動它尤其容易。
ARG
是Dockerfile
中唯一可以在FROM
之前的指令。請參閱瞭解ARG和FROM如何互動。FROM
可以在單個Dockerfile
中多次出現以建立多映象,或者使用一個構建階段作為另一個構建階段的依賴項。只需在每個新的FROM
指令之前記下提交輸出的最後一個的映象ID。每個FROM指令清除先前指令建立的任何狀態。- tag或digest是可選的。如果省略其中任何一個,構建器將預設使用latest。如果構建器與tag值不匹配,則構建器將返回錯誤。
RUN
將在當前image之上的新層中執行任何命令,並提交結果。生成的已提交image將用於Dockerfile中的下一步。
EXPOSE
EXPOSE
指令通知Docker
容器在執行時偵聽指定的網路埠。EXPOSE
不使主機的容器的埠可訪問。為此,必須使用-p標誌釋出一系列埠,或者使用-P標誌釋出所有暴露的埠。您可以公開一個埠號,並用另一個埠號在外部發布。
VOLUME
VOLUME
指令建立具有指定名稱的掛載點,並將其標記為從本機主機或其他容器保留外部掛載的卷。該值可以是JSON陣列VOLUME ["/var/log/"]
或具有多個引數的純字串,例如VOLUME /var/log
或VOLUME /var/log /var/db
。有關通過Docker
客戶端的更多資訊/示例和安裝說明,請參閱通過卷文件共享目錄。
ENTRYPOINT
ENTRYPOINT
是CMD指令
開始打包
$ mvn install dockerfile:build
...
[INFO] Successfully built 1699cc725e47
[INFO] Successfully tagged cyinfo-demo/demo:latest
[INFO]
[INFO] Detected build of image with id 1699cc725e47
[INFO] Building jar: /Users/li/SoftResourceSpace/Space/IDEA/demo/target/docker-demo-docker-info.jar
[INFO] Successfully built cyinfo-demo/demo:latest
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13.866 s
[INFO] Finished at: 2018-11-12T19:36:25+08:00
[INFO] ------------------------------------------------------------------------
...
構建成功,期間如果有什麼異常可以提交issue
$ docker images # 檢視映象
REPOSITORY TAG IMAGE ID CREATED SIZE
cyinfo-demo/demo latest 1699cc725e47 2 minutes ago 119MB
$ docker run -d --name cyinfo -p 8081:8080 1699cc725e47 # 執行映象自定義名稱 cyinfo
歡迎關注我的公眾號,跟我留言。