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"]
上面命令的相关解释:
- 从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
# 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 .
这个命令就是使用Docker
的build
命令来构建镜像,并给镜像起了一个名字jerome.xin/docker-demo
其TAG
为latest
在当前文件夹下。
我们使用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即可。无需每次都创建新的镜像,创建新的容器。