jar包构建成镜像运行在docker容器中

演示环境

CentOS 7.2

Docker 1.13.1

Spring Boot 2.1.1.RELEASE

准备一个Spring Boot项目

构建一个 Spring Boot项目的方式有很多,也不是我们讨论的重点,这里就不多做描述了。我们在项目中准备一个简单的HelloController,其中有一个sayHello()方法映射到我们访问项目的跟路径,访问时返回:Hello Jerome, This is docker image !。

package top.nikk.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("")
    public String sayHello() {
        return "Hello Felix, This is docker image !";
    }
}

复制代码

对项目打包,生成可执行jar

我们到项目的根目录,运行mvn clean package对项目进行打包,运行之后会在target目录下生成一个xxx.jar的可执行jar文件。

编写Dockerfile

# Docker image for springboot file run
# VERSION 1.0.0
# Author: Felix
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER Felix<Felix5200@163.com>
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp 
# 将jar包添加到容器中并更名为app.jar
ADD felix-admin.jar app.jar 
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
复制代码

上面命令的相关解释:

从docker仓库获取openjdk作为我们项目的容器
VOLUME指向了一个/tmp的目录,由于Spring Boot使用内置的Tomcat容器,Tomcat默认使用/tmp作为工作目录。效果就是在主机的/usr/local/apps目录下创建了一个临时文件,并连接到容器的/tmp。
项目的docker-demo-0.0.1.jar作为app.jar添加到容器。
ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向/dev/urandom 作为 Entropy Source
from java:8 拉取一个jdk为1.8的docker image

  1. maintainer 作者是Felix

  2. felix-admin.jar 就是你上传的jar包,修改名称为app.jar包

  3. app.jar 是你将该jar包重新命名的名称,在容器中运行

  4. expose 该容器暴露的端口是多少,就是jar在容器中以多少端口运行

  5. entrypoint 容器启动之后执行的命令,java -jar demo.jar 即启动jar

构建Docker镜像

我们进入到/usr/local/apps目录下,执行Docker的命令来构建镜像

docker build -t top.nikk/docker-demo:1.0.0 .
复制代码

注意此处最后有一个 . 的命令

参数说明:

-t :指定要创建的目标镜像名

.  :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
复制代码

这个命令就是使用Docker的build命令来构建镜像,并给镜像起了一个名字top.nikk/docker-demo其TAG为1.0.0在当前文件夹下。

我们使用docker images来查看所有的镜像。

之后执行

docker run -id -p 8080:8080 --name demo  top.nikk/docker-demo:1.0.0
复制代码