zoukankan      html  css  js  c++  java
  • 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即可。无需每次都创建新的镜像,创建新的容器。

  • 相关阅读:
    select + 回调 + 事件循环
    进程间通信
    多进程复习
    concurrent.futures 使用及解析
    多线程复习 Rlock ,Condition,Semaphore
    生成器读取大文件应用
    VS远程调试与附加调试
    Linux后台有个systemd-r进程,占用5355等端口
    linux中 shell编程 判断服务是否运行
    使用Keepalived实现linux高可用集群
  • 原文地址:https://www.cnblogs.com/panchanggui/p/14699552.html
Copyright © 2011-2022 走看看