方式一:使用Dockerfile方式
1. 创建一个SpringBoot Web工程
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "SpringBoot With Docker";
}
}
2. 使用Maven 打包
3. 编写Dockerfile文件
# 基础镜像使用java
FROM java:8
MAINTAINER monday monday@163.com
VOLUME /tmp
ADD springboot-helloworld-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
4. 制作镜像
执行Dockerfile中的配置,将springboot-helloworld-0.0.1-SNAPSHOT.jar制作成镜像
Dockerfile所在的目录 . 表示当前目录
docker build -t springboothelloworld .
5. 启动容器
docker run -itd --name springboothelloworld -p 8080:8080 springboothelloworld
二:使用docker-maven-plugin
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.12</version>
<configuration>
<!-- 注意imageName一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 -->
<imageName>${project.artifactId}:${project.version}</imageName>
<baseImage>java</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
- imageName:用于指定镜像名称,$ {project.artifactId}是镜像名称,${project.version}是标签名称;
- resources.resource.directory:用于指定需要复制的文件,${project.build.directory}表示target目录;
- resources.resource.include:用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar
linux上需要安装jdk和maven,还需要安装Docker环境。
# 制作镜像,相当于docker build
mvn clean package docker:build
docker images
docker run -p 9090:8080 springboot-helloworld
如何构建镜像既可以在插件中配置,也可通过Dockerfile文件配置,通过dockerDirectory指定Dockerfile文件位置。
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${project.artifactId}:${project.version}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD springboot-helloworld-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
- FROM: 表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载
- VOLUME: VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
- ADD ,拷贝文件并且重命名
- ENTRYPOINT ,为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT