当项目用到服务器较多时,我们不可能挨个上传文件去部署,如果没有CI/CD的需求时,可以用docker+harbor+ansible实现一键部署多台服务器。
首先用一台服务器安装docker+ansible+harbor:
安装docker:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
启动docker:
systemctl start docker
然后创建一个Dockerfile, 用来build jar的镜像
FROM java:8
VOLUME /xhr/logs
ADD ruoyi-modules-system-2.1.0.jar /ruoyi-modules-system-2.1.0.jar
ADD ruoyi-modules-order-2.1.0.jar /ruoyi-modules-order-2.1.0.jar
ADD ruoyi-modules-mq-2.1.0.jar /ruoyi-modules-mq-2.1.0.jar
ADD ruoyi-modules-goods-2.1.0.jar /ruoyi-modules-goods-2.1.0.jar
ADD ruoyi-modules-active-2.1.0.jar /ruoyi-modules-active-2.1.0.jar
ADD ruoyi-gateway-2.1.0.jar /ruoyi-gateway-2.1.0.jar
ADD ruoyi-auth-2.1.0.jar /ruoyi-auth-2.1.0.jar
ADD config /config
COPY startup.sh /usr/bin/startup.sh
COPY fonts /usr/share/fonts
EXPOSE 9201
EXPOSE 9208
EXPOSE 9206
EXPOSE 9200
EXPOSE 8080
EXPOSE 9205
RUN chmod +x /usr/bin/startup.sh
#RUN bash -c 'touch /busjar.jar'
RUN rm -rf /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#ENTRYPOINT [ "sh", "-c", "ls /opt -FR | grep /$ | sed 's:^:`pwd`/:'" ]
#ENTRYPOINT [ "sh", "-c", "cat /opt/settings/server.properties" ]
CMD nohup sh -c "startup.sh && java -jar -Xms128M -Xmx256M -XX:PermSize=256M -XX:MaxPermSize=256M /ruoyi-gateway-2.1.0.jar > /xhr/logs/ruoyi-gateway/ruoyi-gateway.log 2>&1 --spring.profiles.active=prod"
其中:
FROM java:8 是使用公有仓库中的java:8镜像
ADD 把项目的jar加入到镜像中
COPY 把一些需要的配置和字体文件拷贝到镜像里
VOLUME将 /xhr/logs挂载到镜像,这样可以把日志文件直接输出到宿主机
EXPOSE 指镜像会暴露的端口,这里是各个服务对应的访问端口
最后的CMD,是指镜像运行时执行的cmd命令,这里使用了一个脚本startup.sh来运行所有的jar,后面指定了spring.profiles.active=prod来指定使用生产环境的配置文件。
startup.sh内容如下:
#!/bin/bash
#程序包名称
JARNAME="
ruoyi-auth
ruoyi-modules-system
ruoyi-modules-goods
ruoyi-modules-active
ruoyi-modules-order
ruoyi-modules-mq
ruoyi-modules-job
"
#可直接运行的程序
NOCONFNAME="
ruoyi-auth
"
#运行时需加载配置文件
CONFNAME="
ruoyi-modules-system
ruoyi-modules-goods
ruoyi-modules-active
ruoyi-modules-order
ruoyi-modules-mq
ruoyi-modules-job
"
##########################kill并重启########################
for h in ${JARNAME[@]};
do
pid=`ps -ef | grep ${h} | grep -v grep |awk '{print $2}'`
echo $pid
if [ $pid ]; then
echo 程序$pid 准备关闭
kill -9 $pid
fi
done
#2-2.1.重启进程-不带配置文件
for j in ${NOCONFNAME[@]};
do
nohup java -jar -Xms128M -Xmx256M -XX:PermSize=256M -XX:MaxPermSize=256M /${j}-2.1.0.jar > /xhr/logs/${j}/${j}.log 2>&1 --spring.profiles.active=prod&
echo "${j}启动完毕"
done
#2-2.2.重启进程-带配置文件
for k in ${CONFNAME[@]};
do
nohup java -jar -Xms128M -Xmx256M -XX:PermSize=256M -XX:MaxPermSize=256M /${k}-2.1.0.jar --logging.config=/config/${k}/logback.xml > /xhr/logs/${k}/${k}.log 2>&1 --spring.profiles.active=prod&
echo "${k}启动完毕"
done
这个Dockerfile所在的目录,应有下面这些内容:
然后用下面的命令来启动这个镜像到容器:
docker run -d -p 8080:8080 -p 9200-9208:9200-9208 -v /xhr/logs:/xhr/logs --privileged=true --name busjar --network host --restart=always busjar
这里有几点要注意:
就算Dockerfile里指定了EXPOSE,我们在启动的时候还是要使用-p来实际映射镜像到宿主机,不然不会工作。VOLUME也是同理,启动时还是需要用-v来挂载。
因为我们使用的是nacos注册服务,所以这里需要用--network host让镜像使用主机的ip,不然nacos的服务间会无法正常访问。
这样就在本机启动了项目,完成了初步的docker准备,接下来我们安装harbor,来保管我们的镜像文件。