利用shell发布docker应用到服务器

Sam 25天前 ⋅ 82 阅读

 

 

利用shell把springboot应用发布到服务器,然后在服务器中打包成docker应用并启动服务。
1. 不需要通过docker注册中心发布
2. 不需要本地打包成docker应用
3. 服务器每次docker打包,会删除旧镜像,减少占用服务器磁盘资源

如果本地打包,会占用本地磁盘资源,又要发布到docker注册中心(注册中心自建或者依赖阿里云的注册中心也挺麻烦),服务器才拉取镜像启动应用,所以用这种方式发布,但是服务器打包可能影响少许性能。

这里的案例是springboot应用,可自行修改。

把下面三个文件放到项目的shell文件夹下。

项目路径/shell/config.sh  (全局配置)

项目路径/shell/start.sh  (本地执行)

项目路径/shell/restartApp.sh (start.sh会传输startApp.sh到远程服务器中,starts.sh会执行远程服务器的startApp.sh文件)

在项目路径/shell目录中,执行start.sh

--------------------------------------------------------------------------------------------------------------------------

config.sh

#!/bin/bash

ssh_user=登录ssh的用户名
ssh_ip=服务器IP
source_dir=/mnt/d/IdeaProjects/mblog
target_dir=/data/rsync/mblog
app_name=$(basename ${target_dir})
docker_port=2222
app_port=2222

# restartApp.sh中的docker启动方式也要改下(比如 网络、卷)

start.sh

#!/bin/bash

# 先用idea的maven package打包,再执行这个发布文件
echo "rsync命令原因,设置本机和服务器时区时间一致: timedatectl set-timezone Asia/Shanghai"
echo "ssh用户要有权限操作目录: chmod -R 777 ."
echo "ssh用户要有权限操作docker: usermod -aG docker ssh登录用户名 (要登录服务器root用户赋予权限)"
echo "项目先打包,有target/项目名-latest.jar文件,再执行"

source config.sh

# 增量同步项目代码到远程服务器
# 上传 shell文件夹、shell文件夹下所有文件、 target文件夹 、 target/${app_name}-latest.jar文件 、 Dockerfile文件 到服务器
rsync -avzr --progress --delete --include "shell" --include "shell/*" --include "target" --include "target/${app_name}-latest.jar" --include 'Dockerfile' --exclude '*' ${source_dir}/ ${ssh_user}@${ssh_ip}:${target_dir}

# 执行远程服务器shell脚本
ssh ${ssh_user}@${ssh_ip} "${target_dir}/shell/restartApp.sh ${target_dir}"

restartApp.sh

#!/bin/bash

echo "默认路径$(pwd)"

# 一定要获取通过参数传过来的目录
target_dir=$1

echo "切换路径到${target_dir}"

cd ${target_dir}

source ./shell/config.sh

# 构建docker镜像
docker stop $(basename ${app_name})

docker rm $(basename ${app_name})

docker rmi $(basename ${app_name})

# sudo docker build -t mblog:latest .
docker build -t $(basename ${app_name}):latest .

# docker run -it -d -p 2222:2222 --network=app-network --name mblog -v /data/blog/storage:/storage -v /data/blog/logs:/logs -e "ENV_VAR=value" mblog:latest
docker run -it -d -p ${docker_port}:${app_port} --network=app-network --name $(basename ${app_name}) -v /data/blog/storage:/storage -v /data/blog/logs:/logs -e "ENV_VAR=value" $(basename ${app_name}):latest

# 删除无用的文件(暂无)

shell中用到ssh ,执行过程中需要输入ssh密码,如果不想不输入ssh密码,需要配置服务器ssh的key到本地,或者把代码中的ssh命令改成sshpass命令 ,但是sshpass方式命令安全性降低了,不建议。

 

全部评论: 0

    我有话说: