Appearance
记录一次 Docker 部署目标服务器脚本
背景:
上篇记录了一个项目中的 Docker 服务部署流程,但是实际使用中肯定不够方便,需要记住服务器密码、构建、部署等,流程,还是挺繁杂。
于是写了一个部署脚本,方便团队内部使用以及集成 CI/CD 等。
主要流程:
- 配置 SSH 密钥认证
- 自动管理 Docker 镜像版本号
- 构建 Docker 镜像
- Git tag
- 打包上传到目标服务器
- 目标服务器加载 Docker 镜像
- 部署 Docker 镜像
SSH 密钥认证
使用 ssh 密钥认证方式可以自动认证登录目标服务器,避免手动输入登录密码,也可避免密码的滥用。
- 生成
ssh
密钥对:
bash
ssh-keygen -t rsa
如果本机已有 rsa
密钥,继续下一步 (下面命令进行查看)
bash
cd ~/.ssh
# 查看目录下文件
ls
- 将公钥上传到目标服务器
i:指定公钥文件
bash
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
- 上传成功后,就可以不需要使用密码登录目标服务器
bash
ssh user@host
treeder/bump
主要用于在项目构建和发布流程中管理版本号,可以自动递增版本号。
- 主要的版本号(major)
- 次要的版本号(minor)
- 修订版本号(patch)
bash
# 使用 treeder/bump 增加修订版本号
docker run --rm -v "$PWD":/app treeder/bump patch
# 读取新的版本号
version=$(cat VERSION)
echo "New version: $version"
# 接下来,你可以在构建、发布等过程中使用新的版本号
# 例如,更新 Docker 镜像的版本标签、发布新版本等
在上述例子中,treeder/bump patch
表示增加修订版本号。你还可以使用 minor
或 major
代替 patch
,分别表示增加次要版本号和主要版本号
Git Tag
对构建的 Docker 项目进行打标签,可以更好地管理和维护代码库的版本历史,提高代码库的可读性和可维护性,同时为版本发布提供了便捷的方式
如下,对当前的源码版本创建 v1.0.0
标签:
bash
# 创建轻量标签(Lightweight Tag)
git tag v1.0.0
# 创建附注标签(Annotated Tag),可以添加注释
git tag -a v1.0.0 -m "Release version 1.0.0"
# 推送所有标签到远程仓库
git push --tags
完整脚本
脚本中其他使用方法在上篇进行了说明
Click me to view the code
bash
#!/bin/bash
# 调试模式
set -ex
# 远程服务器登录信息
remote_host=$1
remote_port=${2:-2333}
# 检查参数个数
if [ "$#" -le 0 ]; then
echo Error: 请输入账户以及密码参数
exit 1
fi
# 远程打包的目录
REMOTE_DIR=images/
# 镜像名称
PREFIX=docker.iflydocs.com
IMAGE=clash-of-llm
# 使用 treeder/bump 自增版本号
docker run --rm -v "$PWD":/app treeder/bump patch
version=`cat VERSION`
# 构建镜像
docker build -t $PREFIX/$IMAGE:latest -t $PREFIX/$IMAGE:$version .
# 推送镜像到 git 仓库
git tag -a "v$version" -m "docker image version $version"
git push --tags
# 推送镜像到 docker 仓库
# TODO
# 打包镜像并上传到服务器
docker save -o ./$IMAGE-$version.tar $PREFIX/$IMAGE:$version
scp ./$IMAGE-$version.tar $remote_host:/root/$REMOTE_DIR
# 删除压缩文件
rm ./$IMAGE-$version.tar
# 使用 ssh 连接到远程服务器
ssh "$remote_host" << EOF
# 加载镜像压缩文件
docker load -i $REMOTE_DIR/$IMAGE-$version.tar
# tag
docker tag $PREFIX/$IMAGE:$version $PREFIX/$IMAGE:latest
# 停止并删除 clash-of-llm
docker stop $IMAGE && docker rm $IMAGE
# 重启 clash-of-llm
docker run --name $IMAGE -p $remote_port:3000 -d -v /root/logs:/usr/src/app/logs --restart always $PREFIX/$IMAGE
# 删除镜像压缩文件
rm $REMOTE_DIR/$IMAGE-$version.tar
EOF
使用:
bash
# 默认端口号 2333
sh deploy.sh user@host
# 指定端口号
sh deploy.sh user@host port
# e.g.
sh deploy.sh [email protected] 8000