Docker滚动标签无感升级+一键回滚的完整方案
作者:驾驭人生
文档说明
- 阅读对象:开发人员、运维人员
- 文档特点:无冗余专业术语,全流程傻瓜式分步操作,所有命令可直接复制运行,零思考成本;原生长命令全部配套极简封装短命令,一套文档覆盖研发+运维全流程
- 核心机制:master分支仅存放代码,禁止构建任何Docker镜像;所有镜像仅由Gitlab网页Tag触发构建,自动生成固定版本镜像+滚动latest镜像,同大版本小版本升级无需修改任何yml配置
- 脱敏后适配服务:biz-schedule-service 业务调度服务
- 脱敏后适配环境:Jenkins双并行流水线(.NET Windows编译 + Linux Docker构建)、通用Nexus私有镜像仓库、Docker Compose编排、Gitlab代码仓库
【文档开篇一句话核心总结·必看】
- ✅ 同大版本小版本迭代(2.3.0→2.3.1):接口完全兼容,无需修改docker-compose.yml任何配置,直接执行up/upall极简命令即可完成无感升级;
- ❌ 跨大版本迭代(2.x→3.x):架构、接口不兼容,流水线不会自动切换latest滚动标签,必须手动修改compose镜像标签后再执行升级;
- ⚠️ 版本回滚全场景红线:禁止使用docker compose pull拉取镜像,统一使用roll命令本地重置滚动标签,全程无需改动配置文件。
1. 方案整体规则(必看,5秒读懂核心逻辑)
1.1 版本升级边界规则
- 大版本升级(2.x → 3.x):接口/架构不兼容,必须手动修改docker-compose.yml镜像标签,沿用原有传统升级流程
- 小版本升级(2.3.0 → 2.3.1):Bug修复、兼容功能迭代,全程无需修改任何docker-compose.yml配置文件
- 版本回滚能力:流水线永久保留固定版本镜像,支持一键回滚,线上故障可快速兜底,版本全程可追溯
- 存量兼容:完全兼容现有通用服务器安装脚本,无需改动原有部署脚本与上线流程
1.2 双镜像标签分工(流水线自动生成,无需人工干预)
| 镜像标签类型 | 示例 | 核心作用 | 是否覆盖 |
|---|---|---|---|
| 固定精准版本标签 | 2.3.2 | 用于版本记录、故障回滚,永久保存在镜像仓库,不可删除 | 禁止覆盖 |
| 主版本滚动标签 | 2-latest | docker-compose.yml固定绑定该标签,每次发版自动指向当前2系列最新镜像 | 每次发版自动覆盖 |
1.3 三大分支使用红线(严禁违规操作)
- master分支:代码主干分支,禁止构建、禁止推送任何Docker镜像,仅用于合并最终稳定代码
- develop分支:测试环境专用分支,仅生成beta测试镜像,禁止部署至生产环境
- Git Tag:生产镜像唯一构建入口,固定格式:v主版本.次版本.补丁版本(例:v2.3.2),仅允许在Gitlab网页端创建,禁止本地命令行打Tag
2. 开发端:Gitlab网页打Tag发版步骤(无命令行,纯点击操作)
关键说明:本项目所有版本Tag均仅在Gitlab网页手动创建,无需本地Git命令、无需本地推送Tag,全程网页点击即可触发流水线
进入项目Gitlab主页,切换至【分支】页面,确认所有代码已合并至master主干分支
顶部导航点击【标签】,进入标签管理页,点击右上角【新建标签】
规范填写标签信息(严格遵守格式,禁止自定义):
- 标签名称:v2.3.2(必须小写v开头)
- 来源分支:选择master
- 发布说明:可选填写本次迭代更新内容
点击【创建标签】,系统自动触发Jenkins流水线,无需人工额外操作
流水线执行完成,自动生成2个生产镜像并推送至通用私有Nexus仓库:
- 固定版本镜像:
nexus\.docker\.com/public\-docker/biz\-schedule\-service:2\.3\.2 - 滚动最新镜像:
nexus\.docker\.com/public\-docker/biz\-schedule\-service:2\-latest
禁止操作清单:禁止直接推送master分支代码触发镜像构建;禁止私自修改Tag格式;禁止本地命令行打Tag推送;禁止人工修改Nexus仓库latest镜像标签
3. Jenkins流水线说明(已上线,无需修改)
3.1 流水线整体逻辑
流水线采用双并行流程,完全保留原有业务逻辑,仅调整Docker镜像构建触发规则,不影响原有Windows端IIS发布流程:
- Dotnet Windows流程:保留原有代码编译、压缩包上传、IIS发布,无任何变更
- Docker Linux流程:关闭master分支镜像构建,仅Tag触发时自动生成固定版本+滚动双镜像
3.2 完整Jenkinsfile配置(已脱敏,可直接复用)
pipeline {
agent any
stages {
stage('Parallel Stage') {
parallel {
stage('Dotnet Flow') {
agent {
label "windows"
}
stages {
stage('Build Push') {
when {
not {
buildingTag()
}
}
steps {
bat "dotnet clean"
bat "dotnet build -c Release"
}
}
stage('Build Tag') {
when {
buildingTag()
}
steps {
bat "dotnet clean"
bat "dotnet publish .\\host\\Biz.ScheduleService.HttpApi.Host\\Biz.ScheduleService.HttpApi.Host.csproj -p:PublishProfile=FolderProfile -o .\\host\\Biz.ScheduleService.HttpApi.Host\\Publish -c Release -p:Version=${env.TAG_NAME.substring(1)}"
bat "dotnet publish .\\host\\Biz.ScheduleService.DbMigrator\\Biz.ScheduleService.DbMigrator.csproj -p:PublishProfile=FolderProfile -o .\\host\\Biz.ScheduleService.DbMigrator\\Publish -c Release -p:Version=${env.TAG_NAME.substring(1)}"
}
}
stage('Archive Push') {
when {
branch 'master'
not { buildingTag() }
}
steps {
bat "xcopy .\\host\\Biz.ScheduleService.HttpApi.Host\\Publish\\* .\\bin\\Host\\ /E/Y"
bat "xcopy .\\host\\Biz.ScheduleService.DbMigrator\\Publish\\* .\\bin\\DbMigrator\\ /E/Y"
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: 'http',
nexusUrl: "${env.NEXUS_SERVER}",
groupId: 'raw',
version: "${env.BRANCH_NAME}",
repository: 'public-raw',
credentialsId: 'nexus-admin',
artifacts: [
[artifactId: 'Biz-Schedule-Service',file: "bin\\Package.zip",type: 'zip']
]
)
bat "rmdir /s /q bin"
}
}
}
}
stage('Docker Flow') {
agent {
label "linux"
}
stages {
stage('Build Beta Image') {
when { branch 'develop' }
steps {
script{
docker.build("${env.NEXUS_SERVER}/public-docker/biz-schedule-service:beta", "--build-arg http_proxy=${env.NAT_PROXY} --build-arg https_proxy=${env.NAT_PROXY} -f host/Biz.ScheduleService.HttpApi.Host/Dockerfile host/Biz.ScheduleService.HttpApi.Host")
docker.withRegistry("${env.NEXUS_SERVER}",'nexus-admin'){
docker.image("${env.NEXUS_SERVER}/public-docker/biz-schedule-service:beta").push()
}
}
}
}
stage('Master Skip Build') {
when { branch 'master' }
steps { echo "master分支禁止构建镜像,等待Tag触发发版" }
}
stage('Build Release Image') {
when { buildingTag() }
steps {
script{
env.FULL_VERSION = env.TAG_NAME.substring(1)
env.MAJOR_VERSION = env.FULL_VERSION.split("\\.")[0]
// 构建固定版本镜像
docker.build("${env.NEXUS_SERVER}/public-docker/biz-schedule-service:${env.FULL_VERSION}", "--build-arg http_proxy=${env.NAT_PROXY} --build-arg https_proxy=${env.NAT_PROXY} -f host/Biz.ScheduleService.HttpApi.Host/Dockerfile host/Biz.ScheduleService.HttpApi.Host")
// 绑定滚动latest标签
docker.image("${env.NEXUS_SERVER}/public-docker/biz-schedule-service:${env.FULL_VERSION}").tag("${env.NEXUS_SERVER}/public-docker/biz-schedule-service:${env.MAJOR_VERSION}-latest")
// 推送双标签至仓库
docker.withRegistry("${env.NEXUS_SERVER}",'nexus-admin'){
docker.image("${env.NEXUS_SERVER}/public-docker/biz-schedule-service:${env.FULL_VERSION}").push()
docker.image("${env.NEXUS_SERVER}/public-docker/biz-schedule-service:${env.MAJOR_VERSION}-latest").push()
}
}
}
}
}
}
}
}
}
}4. Docker Compose 固定配置(一次配置,永久无需修改)
4.1 生产环境配置(脱敏版)
version: '3.8'
services:
biz-schedule-service:
image: nexus.docker.com/public-docker/biz-schedule-service:2-latest
container_name: biz-schedule-service
restart: always
ports:
- 55021:80
hostname: biz-schedule-service
volumes:
- ./biz-schedule-service/Logs:/app/Logs
- ./biz-schedule-service/config/appsettings.json:/app/appsettings.json
environment:
- ASPNETCORE_URLS=http://localhost:80
- TZ=Asia/Shanghai
logging:
driver: json-file
options:
max-size: 10m
max-file: '3'
networks:
- public-net
- internal-net
healthcheck:
test: ["CMD", "curl", "-s", "http://localhost:80/Health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
networks:
public-net:
internal-net:4.2 测试环境配置(脱敏版)
version: '3.8'
services:
biz-schedule-service:
image: nexus.docker.com/public-docker/biz-schedule-service:beta
container_name: biz-schedule-service-test
restart: always
ports:
- 55021:80
hostname: biz-schedule-service-test
volumes:
- ./biz-schedule-service/Logs:/app/Logs
- ./biz-schedule-service/config/appsettings.json:/app/appsettings.json
environment:
- ASPNETCORE_URLS=http://localhost:80
- TZ=Asia/Shanghai
logging:
driver: json-file
options:
max-size: 10m
max-file: '3'
networks:
- public-net
- internal-net
healthcheck:
test: ["CMD", "curl", "-s", "http://localhost:80/Health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
networks:
public-net:
internal-net:5. 运维升级操作手册(原生长命令 + 配套极简封装命令 双版本)
5.1 前置准备(必看前置要求)
- 流水线Tag构建完成,Nexus私有仓库已更新2-latest最新镜像
- 硬性前置要求:运维执行所有docker compose相关命令前,必须人工手动cd进入docker-compose.yml同级目录,禁止在其他目录执行命令
- 提前部署后文docker极简快捷运维脚本,全程只用单单词短命令,无需敲冗长原生命令
5.2 单服务升级(仅升级调度服务,最小业务影响)
原生原始长命令(参考)
# 拉取最新滚动镜像 docker compose pull biz-schedule-service # 仅重启当前服务,不重启依赖服务,最小业务影响 docker compose up -d --no-deps biz-schedule-service
极简封装短命令(推荐日常使用)
# 极简核心命令(仅升级) up biz-schedule-service
5.3 多服务升级(两种场景)
场景1:全部服务统一升级
原生长命令
docker compose pull docker compose up -d
极简短命令
# 极简核心命令(仅升级) upall
场景2:指定多个服务精准升级(不影响其他服务)
极简脚本已支持多服务传参,用法和原生命令完全一致,生产建议分批升级,降低风险
原生长命令
docker compose pull 服务1 服务2 docker compose up -d --no-deps 服务1 服务2
极简短命令
up 服务名1 服务名2 # 批量精准升级多个服务,互不影响其他业务服务
5.4 升级结果校验(通用)
原生长命令
docker compose ps docker compose logs -f biz-schedule-service
极简短命令
# 极简排查命令 ps # 查看容器状态 log biz-schedule-service # 实时启动日志
6. 运维回滚操作手册(全文核心红线)
全文最重要红线(强制执行):docker compose pull 只能拉取当前标签指向的最新镜像,无法自动拉取历史旧版本,所有回滚操作禁止使用pull命令,必须本地重置镜像标签后重启服务
6.1 临时紧急回滚(不改yml配置,快速恢复业务)
场景1:单服务回滚(生产推荐,最小影响)
原生长命令(步骤繁琐)
# 1.拉取需要回滚的历史固定版本镜像 docker pull nexus.docker.com/public-docker/biz-schedule-service:2.3.1 # 2.本地覆盖滚动标签,切回旧版本 docker tag nexus.docker.com/public-docker/biz-schedule-service:2.3.1 nexus.docker.com/public-docker/biz-schedule-service:2-latest # 3.重启服务完成回滚 docker compose up -d --no-deps biz-schedule-service
极简短命令(一行直接回滚)
roll biz-schedule-service 2.3.1 # 一键回滚至指定历史固定版本,无需改yml
场景2/场景3:多服务/全服务回滚
极简脚本roll函数可按需扩展,生产环境禁止批量全量回滚,推荐单服务逐个回滚,精准控制故障影响范围
6.2 永久固定版本回滚(长期锁定旧版本,关闭自动滚动)
直接修改compose镜像标签为固定版本,彻底脱离滚动标签体系,后续不再跟随流水线自动升级:
image: nexus.docker.com/public-docker/biz-schedule-service:2.3.1
7. 大版本升级流程(2.x → 3.x 架构不兼容升级)
- 核心底层原理:流水线仅会对同一个主版本覆盖latest标签(2-latest永远只更新2系列镜像),不会生成跨主版本标签,从源头杜绝无序升级,因此大版本切换必须人工介入
- 开发在Gitlab打新版Tag:v3.0.0,流水线自动生成3.0.0固定镜像、3-latest滚动镜像
- 运维手动修改docker-compose.yml,将镜像标签从2-latest 修改为 3-latest
- 同步脚本修改:编辑运维快捷脚本,将roll函数内硬编码的2-latest改为3-latest,保证回滚命令正常使用
- 修改完成后,执行极简升级命令
upall完成全量大版本升级
8. 存量脚本兼容说明
现有通用服务器安装脚本无需任何代码修改,脚本初始化部署时直接写入2-latest滚动标签即可,完全适配本次滚动升级方案,原有服务器初始化、批量部署逻辑保持不变。
9. 常见问题FAQ(一线运维现场排错全覆盖)
问题1:执行up后镜像没有更新
原因:服务器本地缓存旧版2-latest镜像
解决:执行prune清理本地悬空镜像,再重新执行up升级
问题2:docker compose pull能否自动拉取旧版本?
答案:绝对不能,pull仅能拉取当前标签指向的最新镜像,回滚必须使用roll命令重置本地镜像标签
问题3:是否可以使用不带主版本的latest标签?
禁止:严禁直接使用:latest,会造成跨版本无序升级,破坏版本管控体系
问题4:能否手动修改Nexus仓库内latest镜像?
禁止:所有镜像标签变更统一由Jenkins流水线执行,人工修改会导致多环境版本不一致
问题5:能否删除仓库内历史固定版本镜像?
禁止:固定版本镜像为回滚兜底资源,永久保留,不可清理删除
问题6:大版本升级是否需要改两处配置?(重点答疑)
答案:必须修改两处:①docker-compose.yml内镜像latest标签 ②运维脚本roll函数内硬编码latest标签,两处同步修改后方可正常升级+回滚
问题7:ps命令报错exit status 14:no configuration file provided
根因:当前目录无docker-compose.yml文件
解决方案:人工手动cd切换至yml同级目录,无任何自动目录跳转工具,运维自主管控工作目录
10. 全流程总览
- 开发合并代码至master(master分支禁止构建镜像)
- Gitlab网页创建vX.Y.Z Tag → 自动触发Jenkins流水线
- 流水线生成固定版本镜像+同主版本滚动latest镜像(仅同大版本自动滚动,跨大版本不自动变更)
- 运维手动cd进入compose目录 → 执行up/upall极简命令完成同大版本小版本升级(无需改配置)
- 线上异常 → 执行roll极简命令一键回滚(禁止pull回滚)
- 跨大版本迭代 → 同步修改yml配置+运维脚本,再执行upall升级
11. 配套Docker极简运维脚本部署(傻瓜式分步操作)
前文所有升级、回滚、启停、日志短命令,均依赖该自定义bash脚本;部署后新开终端、服务器重启均可永久使用,无需记忆原生docker compose长命令。两种部署方式二选一即可,推荐方式一,操作最简单。
脚本前置统一说明
- 脚本仅终端加载别名/函数,无后台进程、无网络请求、无端口监听,无网络报错风险
- 所有命令必须填写完整服务名,不支持模糊匹配,生产环境操作更安全
- 所有命令完全兼容docker compose原生逻辑,不改动容器、镜像、网络底层规则
- 全程不配置任何自动切换目录脚本/别名,所有命令依赖运维人工cd切换工作目录
- 重装终端、重新登录会话、服务器重启,命令均可自动生效
方式一:直接追加写入系统bashrc(推荐首选,一步到位)
全局强制硬性规范(全文统一,强制执行):
- 脚本部署无目录限制,任意目录均可部署
- 使用所有docker compose快捷命令前,必须人工手动cd切换至docker-compose.yml所在目录
- 全程不配置任何自动切目录别名、不做多环境自动目录跳转,回归原生运维操作规范
步骤1:备份系统原生环境配置(必做,出错可一键回滚)
# 备份原有bash配置文件,备份文件和原文件同目录 cp ~/.bashrc ~/.bashrc.bak # 校验备份是否成功,出现.bak文件即为备份完成 ll ~/ | grep bashrc
步骤2:一键写入全套完整运维快捷命令(直接全选复制,一次性粘贴执行,无空白缺失)
cat >> ~/.bashrc <<EOF
# Docker Compose 完整全套运维快捷脚本(最终完整版,无任何删减)
# 适配2-latest滚动标签发版方案,包含:升级/回滚/启停/日志/容器进入/镜像清理/状态监控 全功能
# 规则:1.全命令单单词好记 2.必填完整服务名,无模糊匹配 3.无后台常驻、无网络报错
# 适用:日常全场景运维 + 本次版本升级/回滚专项需求
# ========== 基础别名 ==========
alias ll='ls -la --color=auto'
alias cgrep='grep --color=auto'
# ========== 全局实时监控 ==========
refresh() {
while true;do clear;docker compose ps;sleep 1;done
}
# ========== 一、版本升级(适配本次滚动标签) ==========
# 单服务小版本升级:拉取最新镜像+无依赖重启,不影响其他服务
up() {
docker compose pull $1
docker compose up -d --no-deps $1
}
# 全部服务统一升级
upall() {
docker compose pull
docker compose up -d
}
# ========== 二、版本回滚(本次方案专属,禁止pull回滚) ==========
# 一键回滚:拉取历史固定版本 → 本地覆盖滚动latest标签 → 无依赖重启服务
roll() {
svc=$1
old_tag=$2
base_img="nexus.docker.com/public-docker/${svc}"
docker pull ${base_img}:${old_tag}
docker tag ${base_img}:${old_tag} ${base_img}:2-latest
docker compose up -d --no-deps $svc
}
# ========== 三、服务启停/重启全套命令 ==========
restart() {
docker compose restart --no-deps $1
}
restartall() {
docker compose restart
}
stop() {
docker compose stop $1
}
start() {
docker compose start $1
}
# ========== 四、全套日志排查命令 ==========
log() {
docker compose logs -f --tail 200 $1
}
historylog() {
docker compose logs --tail 500 $1
}
glog() {
docker compose logs --tail 1000 $1 | grep $2
}
# ========== 五、容器状态核查全套命令 ==========
ps() {
docker compose ps
}
img() {
docker compose images
}
port() {
docker compose port $1
}
stat() {
docker compose stats --no-stream $(docker compose ps --quiet $1)
}
uptimec() {
docker compose ps --format "table {{.Names}}\t{{.Status}}\t{{.CreatedAt}}" $1
}
# ========== 六、容器运维全套操作 ==========
into() {
docker compose exec -it $1 bash
}
build() {
docker compose up -d --no-deps --build $1
}
rmsvc() {
docker compose rm -f $1
}
prune() {
docker image prune -f
}
cleanall() {
docker compose down
}
EOF
步骤3:加载配置,让所有短命令立即生效
# 重载bash配置文件,无需断开终端重连 source ~/.bashrc
步骤4:验证脚本部署成功
# 执行容器状态查询短命令,正常输出容器列表即部署完成 ps
方式二:独立外部脚本挂载(干净隔离版,不污染原生bashrc)
将所有快捷命令单独放在独立sh文件,和系统原生配置完全隔离,后续维护、删除更方便,分步完整命令如下
步骤1:统一存放运维脚本目录,规范管理文件
# 创建专属脚本目录,后续所有运维脚本统一存放 mkdir -p /opt/docker-cmd/ # 进入目录 cd /opt/docker-cmd/
步骤2:新建独立命令脚本,粘贴【纯净版无外层包裹脚本】
关键区分提醒:方式一脚本带cat>>EOF外层包裹;方式二独立sh文件禁止粘贴外层EOF代码,仅复制下方纯净脚本,避免脚本执行报错
# ========== 基础别名 ==========
alias ll='ls -la --color=auto'
alias cgrep='grep --color=auto'
# ========== 全局实时监控 ==========
refresh() {
while true;do clear;docker compose ps;sleep 1;done
}
# ========== 一、版本升级 ==========
up() {
docker compose pull $1
docker compose up -d --no-deps $1
}
upall() {
docker compose pull
docker compose up -d
}
# ========== 二、版本回滚 ==========
roll() {
local svc=$1
local old_tag=$2
base_img="nexus.docker.com/public-docker/${svc}"
docker pull ${base_img}:${old_tag}
docker tag ${base_img}:${old_tag} ${base_img}:2-latest
docker compose up -d --no-deps $1
}
# ========== 三、服务启停重启 ==========
restart() {
docker compose restart --no-deps $1
}
restartall() {
docker compose restart
}
stop() {
docker compose stop $1
}
start() {
docker compose start $1
}
# ========== 四、日志排查 ==========
log() {
docker compose logs -f --tail 200 $1
}
historylog() {
docker compose logs --tail 500 $1
}
glog() {
docker compose logs --tail 1000 $1 | grep $2
}
# ========== 五、容器状态核查 ==========
ps() {
docker compose ps
}
img() {
docker compose images
}
port() {
docker compose port $1
}
stat() {
docker compose stats --no-stream $(docker compose ps --quiet $1)
}
uptimec() {
docker compose ps --no-trunc --format "table {{.Names}}\t{{.Status}}\t{{.CreatedAt}}" $1
}
# ========== 六、容器运维 ==========
into() {
docker compose exec -it $1 bash
}
build() {
docker compose up -d --no-deps --build $1
}
rmsvc() {
docker compose rm -f $1
}
prune() {
docker image prune -f
}
cleanall() {
docker compose down
}
# 创建独立脚本文件 vim docker-short-cmd.sh
VIM编辑器标准操作 + 现场三大报错一站式解决方案
Vim标准写入步骤(杜绝粘贴乱码)
- 执行
vim docker\-short\-cmd\.sh打开文件,默认命令模式 - 必须按下小写i,进入INSERT编辑模式(左下角显示INSERT)
- 全选粘贴上方纯净版脚本代码,严禁复制带EOF外层包裹代码
- 粘贴完成,按ESC退回命令模式
- 输入
:wq保存退出
报错1:E45: 'readonly' option is set 只读报错
- 报错原因:文件权限不足、系统标记只读
- 临时应急保存:命令模式输入 :wq\! 强制保存退出
- 永久修复权限:chmod 644 docker\-short\-cmd\.sh
报错2:exit status 14 无配置文件报错(现场实测报错)
🔴 硬性规范,不可绕过:不做任何自动目录跳转脚本/别名
- 根因:当前执行目录无docker-compose.yml
- 标准解决:运维人工手动cd切换至yml同级目录,自主管控工作目录
报错3:新开终端快捷命令失效
- 根因:仅临时source未写入开机自启配置
- 解决:按照文档步骤写入bashrc,终端重启自动加载命令
步骤3:添加脚本执行权限
chmod +x /opt/docker-cmd/docker-short-cmd.sh
步骤4:设置终端开机自动加载脚本
# 将脚本引用写入bashrc,每次登录终端自动加载 echo "source /opt/docker-cmd/docker-short-cmd.sh" >> ~/.bashrc
步骤5:立即生效+验证可用性
# 重载配置 source ~/.bashrc # 验证命令 ps
步骤6:脚本异常一键回滚(应急兜底)
# 还原备份的原生bash配置,一秒恢复服务器初始状态 cp ~/.bashrc.bak ~/.bashrc && source ~/.bashrc
补充1:脚本维护与大版本适配说明
1. 脚本日常修改维护方式
- 方式一(bashrc内嵌):直接编辑
vim \~/\.bashrc,修改底部脚本后执行source \~/\.bashrc重载 - 方式二(独立sh脚本):直接编辑
vim /opt/docker\-cmd/docker\-short\-cmd\.sh,重载配置即可,不污染系统原生配置
2. roll回滚脚本大版本适配(重点)
当前roll函数硬编码2-latest,仅适配2.x系列版本;后续升级至3.x及以上大版本时,必须同步修改脚本内标签:将2\-latest 全局替换为 3\-latest,重载脚本后回滚功能方可正常使用
补充2:脚本完整卸载步骤(无残留清理)
方式一:卸载bashrc内嵌版脚本
# 还原备份配置,一键彻底卸载 cp ~/.bashrc.bak ~/.bashrc && source ~/.bashrc
方式二:卸载独立外部脚本版(完整清理)
# 1. 删除自动加载配置行 sed -i '/docker-short-cmd.sh/d' ~/.bashrc # 2. 删除脚本整个目录 rm -rf /opt/docker-cmd/ # 3. 重载环境,命令彻底失效 source ~/.bashrc
补充3:生产环境安全红线
- 快捷脚本仅限root管理员使用,禁止普通业务用户加载,防止误回滚、误删容器
- 服务器重启、终端重连,快捷命令自动生效,无需重复部署
- 镜像缓存异常优先执行prune清理悬空镜像,再执行升级操作
- 禁止私自修改脚本内部函数,所有脚本变更统一登记备案
12. 极简命令速查表(值班直接复制,无需翻阅全文)
## ⚠️全局前置强制步骤(所有命令执行前必做) ## 人工手动cd进入docker-compose.yml所在目录,无任何自动目录跳转 cd /data/compose-project/ ## 一、核心高频命令(升级+回滚,生产90%场景使用) up biz-schedule-service # 单服务小版本无感升级,无需改yml upall # 全局所有服务统一升级 roll biz-schedule-service 2.3.1 # 一键回滚,严禁pull回滚 ## ⚠️大版本升级硬性要求(2.x→3.x) # 1. 修改docker-compose.yml:2-latest → 3-latest # 2. 修改运维脚本roll函数:2-latest → 3-latest # 3. 执行upall完成全量升级 ## 二、日常运维全套命令 # 服务启停重启 restart 服务名 # 无依赖单服务重启 restartall # 全部服务重启 stop 服务名 # 停止指定服务 start 服务名 # 启动指定服务 # 日志排查 log 服务名 # 实时滚动日志 historylog 服务名 # 查看近500行历史日志 glog 服务名 关键词 # 日志关键词过滤 # 容器状态监控 ps # 查看容器运行状态 img # 查看本地镜像列表 port 服务名 # 查看端口映射 stat 服务名 # 查看容器CPU/内存占用 uptimec 服务名 # 查看容器运行时长 # 容器深度运维 into 服务名 # 进入容器终端 build 服务名 # 本地重建容器 rmsvc 服务名 # 强制删除容器(保留数据卷) prune # 清理悬空镜像 cleanall # 销毁全部容器+网络 refresh # 全屏实时监控容器状态
以上就是Docker滚动标签无感升级+一键回滚的完整方案的详细内容,更多关于Docker滚动标签无感升级与一键回滚的资料请关注脚本之家其它相关文章!
