1. 程式人生 > >「Spring Boot」 Docker打包映象

「Spring Boot」 Docker打包映象

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提取映象來啟動它尤其容易。

  • ARGDockerfile中唯一可以在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/logVOLUME /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

歡迎關注我的公眾號,跟我留言。