方式一:使用Dockerfile方式

1. 创建一个SpringBoot Web工程

@RestController
public class HelloController {
    
    @RequestMapping("/hello")
    public String hello() {
        return "SpringBoot With Docker";
    }
}

2. 使用Maven 打包

使用Docker 启动SpringBoot_docker

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	 .

使用Docker 启动SpringBoot_docker_02

5. 启动容器

docker run -itd --name springboothelloworld -p 8080:8080 springboothelloworld

使用Docker 启动SpringBoot_java_03

使用Docker 启动SpringBoot_docker_04

二:使用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 启动SpringBoot_java_05

docker run -p 9090:8080 springboot-helloworld

使用Docker 启动SpringBoot_docker_06

使用Docker 启动SpringBoot_docker_07

如何构建镜像既可以在插件中配置,也可通过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>

使用Docker 启动SpringBoot_jar_08

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