以 Docker方式发布SpringBoot 应用
一、为什么要用 Docker方式来发布
想用 Docker 来部署应用其实已经满长时间了,苦于没有时间认真研究,一直忙于 代码的编写,二来也没有什么需要多次重复部署的需求。当然第二点更直接。所以都没认真看过文档。
进来有个上线的系统,需要同时部署多份,才发现,确实有些麻烦,如果维护则更加麻烦。数据库安装、java 环境参数、应用程序,都需要考虑,头绪太多了。所以 Docker 化部署再次提及日程。
经过一段研究已经小有成效,记录下来以备忘记的时候重新恢复记忆使用。Ubuntu 14.04 LTS 环境测试通过。
二、环境准备
-
已经可以上线跑的一个 SpringBoot 应用,比如它有一下的目录结构,简单起见,我用通配符代表很多文件。假设应用默认服务于 9200 端口。
/root/app1/app.jar /root/app1/T/*.* /root/app1/res/*.* /root/app1/application.yml
-
确保本地应用已经可以正常运行。
-
安装 docker,不赘述,各个操作系统方法不一致。不在此文讨论。
三、概念准备
1.Docker 相关概念
- Docker镜像。我们理解 Docker 镜像可以拿大家比较熟悉的 GHOST 镜像来想比较一下。你安装一个 windows 可以选择用 ghost 来加速安装,这样很多软件,驱动,一次性就安装好了。Docker 镜像也是这样的,有人事先安装配置好一定的环境,你下载好镜像,运行起来就可以获得这个环境的功能;镜像有很重要的几个属性,Repository、Tag、ImageId,分别可以理解为镜像名称、版本、全局不重复编号
- Docker 容器。Docker镜像运行起来以后,docker 会将它加载到一个容器,容器可以理解为一个通用的盒子,装入不同的镜像,就可以提供不同的功能。容器就一个黑盒子,你可以为它指定运行的镜像,开放的端口等等。
2.Dockerfile
-
FROM 指令,可以理解为底包,就是我们要 build 我们自己的镜像的时候,是以哪个镜像为基础的。这个比较好理解就是,如果我们做的是一个 springboot 应用的发布,那么一定是以 java 为底包来扩展的
-
ADD 指令,作用是在建立镜像的时候需要将本地的文件加入到镜像内的指令。它把以/结尾的名称看做目录,而把没有的部分看做文件。所以如果你想把本地的/T/文件在创建时候打包到镜像的 root目录里面去,那么你需要写。特别要省略/,文件就正常写就 OK 了。
ADD /T/ /root/T/
-
WORKDIR 指令,指定镜像内执行命令的默认工作路径,这个非常重要,镜像启动后一定会需要你在某个特定的位置去执行命令,如果不指定这个工作目录路径,很容易造成指令找不到配置或静态文件等问题。
-
ENTRYPOINT 指令,Docker启动后执行的那个守护进程的命令。这个命令执行后,需要是一个可以 hold 住 docker 的一个程序,让这个容器始终处于活跃状态,一般一个服务就能达到这种效果,所以这里我们把 jar 包运行起来的命令当做入口命令
四、实操
1.编写 Dockerfile
这里我们假定,将我们的程序部署在 docker 镜像的 root 目录中去,docker 启动后执行我们的 app.jar 包
FROM java:8
MAINTAINER pcode@mtttt.cn
ADD app.jar /root/app.jar
ADD ./res/ /root/res/
ADD ./lib/ /root/lib/
ADD ./T/ /root/T/
WORKDIR /root/
ENTRYPOINT ["java","-jar","app.jar"]
2.Build镜像
讲了很多,实际上真的要去做了,内容并不多。将上面的内容编写进一个 Dockerfile,存放在于 app.jar 一个目录内
docker build -f Dockerfile .
默认创建的 docker镜像没有 tag,可以手动运行 docker tag 名来来指定 tag 比如 docker tag imageid 镜像名:标签 这样就搞定了。
docker images
就会发现我们打包好的镜像已经在了。
3.运行镜像
假定我们的程序跑在 9020 端口,那么接下来就是最后一步了。
docker run -d -p 8080:9020 imageid
我们把镜像中的 9020 端口映射到 host server 的 8080 端口上,这样就可以直接访问 server 的 8080 端口来使用服务了;
五、导出导入容器
docker export 290b8d571b59e137d62be1 > update.tar
注意要根据实际情况替换镜像的 id
docker import - update < update.tar
六、导入导出镜像
save
命令
docker save [options] images [images...]
示例
docker save -o nginx.tar nginx:latest
或
docker save > nginx.tar nginx:latest
其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)
load
命令
docker load [options]
示例
docker load -i nginx.tar
网友评论