Docker 部署jar包

Docker这门技术也是开发中我们值得掌握的一门技术。接下我们就来探究一下, 怎么使用Docker容器化的技术来构建并运行,Spring Boot项目的可执行Jar包。

演示环境

  • CentOS 7
  • Docker 1.13.1
  • Spring Boot 2.1.1.RELEASE

准备一个Spring Boot项目

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

package xin.jerome.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 Jerome, This is docker image !";
    }
}

 

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

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

制作Docker镜像

首先我们将准备的xxx.jar拷贝到我们的CentOS 7机器上,拷贝的方法就不做描述了,大家各显神通吧。这里我是将我生成docker-demo-0.0.1.jar拷贝到了/usr/local/apps文件夹下/

编写Dockerfile

在该目录下创建Dockerfile 文件,使用vi Dockerfile对文件进行编辑。

FROM java:8
VOLUME /tmp
ADD docker-demo-0.0.1.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

上面命令的相关解释:

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

    # maintainer  作者是bingo

    # demo-0.0.1-SNAPSHOT.jar 就是你上传的jar包,替换为jar包的名称

    # demo.jar  是你将该jar包重新命名为什么名称,在容器中运行

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

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

构建Docker镜像

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

 docker build -t jerome.xin/docker-demo:latest .

这个命令就是使用Dockerbuild命令来构建镜像,并给镜像起了一个名字jerome.xin/docker-demoTAGlatest在当前文件夹下。

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

[root@localhost testdocker]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
jerome.xin/docker-demo   latest              ab3426243fac        56 minutes ago      119 MB
docker.io/openjdk        8-jdk-alpine        97bc1352afde        5 weeks ago         103 MB

我们发现镜像列表里面有我们生成的镜像jerome.xin/docker-demo

运行镜像

通过上面的步骤我们就已经完成了镜像的创建,接下来我们只需要使用

docker run -d --restart=always --name jerome.xin/docker-demo -v /usr/local/apps/docker-demo/logs:/home/docker-demo/logs -p 7500:7500 jerome.xin/docker-demo  命令来运行我们的项目。

这个表示docker容器在停止或服务器开机之后会自动重新启动 --restart=always

-v /usr/local/apps/docker-demo/logs:/home/docker-demo/logs:将镜像内/home/docker-demo/logs目录的日志挂载到宿主机/usr/local/apps/docker-demo/logs目录下

-p 7500:7500:端口映射,默认启动的是7500

docker logs --tail  300 -f  demo  查看启动日志 

 

 

拓展一:编写一个通用的运行jar包的镜像(这里只给思路,不给具体示例)
> Dockerfile如:

FROM justrydeng/jdk8
MAINTAINER dengshuai<13548417409@163.com>
RUN mkdir /jarAppDir/
CMD ["nohup","java","-jar","/jarAppDir/app.jar","&"]

 

> 生成镜像 docker build -t justrydeng/common-run-jar . -f jarDockerfile
   注: -f 可以指定Dockerfile文件的文件名。

> 在后面使用时,我们可以使用同一个镜像来制作对应不同端口(不同服务)的容器
   docker run -p 宿主机端口:要映射的容器端口 --name 容器名 -d justrydeng/common-run-jar

> 在更新jar包时,需要在把xxx.jar包复制进容器时,统一重命名为app.jar
  docker cp 宿主机jar包 容器名(或容器ID):/jarAppDir/app.jar

说明:此方式的优势在于:每次如果要更新jar包,只需要先将容器stop,然后直接替换容器里面的jar包,最后再将该容
         器start即可。无需每次都创建新的镜像,创建新的容器。

 

posted @ 2021-04-25 11:09  panchanggui  阅读(1685)  评论(0编辑  收藏  举报