容器化确保了jar包在不同环境(开发、测试、生产)以及不同系统(只要能运行docker)中运行时的一致性,减少了“在我机器上可以运行”的问题。每个容器都是相互隔离的,运行其中的jar包不会影响宿主机和其他容器,提高了系统的安全性。
1.创建Dockerfile
#引入jdk1.8环境
FROM openjdk:8
#创建人
MAINTAINER xuge
#定义工作目录,此后操作默认都在工作目录下进行
WORKDIR /data/service/api
RUN mkdir /data/service/api/hot_deploy
RUN mkdir /data/service/api/logs
RUN mkdir /data/service/api/neuron-logs
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo ‘Asia/Shanghai’ >/etc/timezone
#将宿主机文件上传至工作目录
#myjar为jar包名称
COPY ./myjar.jar .
COPY ./run.sh .
#声明该容器提供的服务需要用到的端口
EXPOSE 8080
#docker run时的初始化操作
ENTRYPOINT ["sh","run.sh","myjar.jar","restart"]
2.创建镜像
在Dockerfile文件的目录下执行
#myimage为镜像名称
docker build -t myimage .
3.上传镜像到远程仓库
# 登录远程仓库
docker login -u myusername -p mypassword ip:5000
# 给镜像打标签
docker tag myimage:latest ip:5000/myrepository/myimage:[镜像版本号]
# 推送镜像
docker push ip:5000/myrepository/myimage:[镜像版本号]
#替换 `myusername`, `mypassword`, `myregistry.com`, `myrepository`, 和 `myimage` 为你自己的用户名、密码、仓库地址、仓库名和镜像名。
4.首次启动镜像
#1.在目标服务器提前创建好工作目录
mkdir /data/service/api/{hot_deploy,logs,neuron-logs} -p
#2.向工作目录提前上传启动脚本等文件
/data/service/api/run.sh
/data/service/api/hot_deploy/arthas-boot.jar
#3.从镜像仓库拉取镜像后启动
docker pull ip:5000/myimage:[镜像版本号]
docker run --restart=always -p 8080:8080 -p 5009:5009 --name mycontainer -v /data/service/api/run.sh:/data/service/api/run.sh -v /data/service/api/hot_deploy:/data/service/api/hot_deploy -v /data/service/api/logs:/data/service/api/logs -v /data/service/api/neuron-logs:/data/service/api/neuron-logs -d ip:5000/myimage:[镜像版本号]
#4.等待容器启动成功即可
docker ps
#5.如果启动异常可使用命令查看日志
#mycontainer为容器名称
docker logs -f mycontainer
#6.运行容器时确保宿主机/data/service/api已上传run.sh脚本文件,否则会导致容器工作目录内容被清空,初始化命令无法执行
5.更新服务(两种方式)
1.更新镜像
#1.jenkins打包镜像上传到仓库后,目标服务器拉取镜像更新
docker pull ip:5000/myimage:[镜像版本号]
docker stop mycontainer
docker rm mycontainer
docker run --restart=always -p 8080:8080 -p 5009:5009 --name mycontainer -v /data/service/api/run.sh:/data/service/api/run.sh -v /data/service/api/hot_deploy:/data/service/api/hot_deploy -v /data/service/api/logs:/data/service/api/logs -v /data/service/api/neuron-logs:/data/service/api/neuron-logs -d ip:5000/myimage:[镜像版本号]
2.更新jar包
#1.jenkins打包jar包后直接上传到阿里云oss或者目标服务器工作目录
docker cp myjar.jar xxx:/data/service/api/myjar.jar
#2.重启容器
docker restart mycontainer
镜像构建上传的步骤可在jenkins配置,完成自动化构建上传更新的步骤,减少工作量