Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker version 18.06.1-ce, build e68fc7a
新建SpringBoot应用
参考《Spring Boot | 使用Spring Initializr快速创建》,新建demo
项目
完整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指令
更多指令可以参考DockerFile 中文
开始打包
$ 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
访问 http://localhost:8081/user/find
{“name”:“aprcode.com”}
欢迎关注我的公众号,跟我留言。
博客地址:https://blog.aprcode.com/Spring-Boot-docker/
教程源码Github地址:demo
教程源码Gitee地址:demo