每次镜像一出新版本,Windows Docker Desktop 更新容器就得先删再建?
数据卷一多、端口一乱,手抖就翻车。
今天这篇就教你不删除容器完成升级,再送一个定期自动检查并更新所有容器的懒人方案,关键字密度≈3%,SEO 长尾词也顺手埋好,放心食用。
目录
1. 为什么常规升级必须删容器?(吐槽向)
Docker 镜像的只读层设计决定了:
“容器 = 镜像(只读)+ 读写层”。
镜像升级=底层 hash 全变,
原地升级?官方直接给你甩一句:
“删了跑新的吧!”
结果就是:
- 端口映射重新填
- 环境变量复制到手酸
- 数据卷还好,bind 挂载直接爆炸
于是,Windows Docker Desktop 更新容器不删除成了刚需。
2. 零停机热更新:手动四步走
核心思路:先建新容器,再秒切流量,
Nginx/Traefik 反向代理的同学秒懂。
2.1 备份当前容器参数 (别嫌啰嗦,翻车别哭)
docker inspect old_container > backup.json
重点字段:
Mounts
— 数据卷PortBindings
— 端口映射Env
— 环境变量
2.2 拉取最新镜像
docker pull nginx:latest
指定 tag 可防“latest 地狱”。
2.3 启动新容器,换名字换端口
docker run -d \
--name nginx_new \
-p 8080:80 \
-v C:\data\nginx:/usr/share/nginx/html \
nginx:latest
端口先别占 80,等会儿秒切。
2.4 健康检查 & 流量切换
- 浏览器访问
http://localhost:8080
验证 - 一切 OK 后停旧容器:
docker stop nginx_old && docker rm nginx_old
- 把新容器改名、改端口:
docker rename nginx_new nginx docker stop nginx && docker start nginx
此时 80 端口重新上线,用户无感知。
3. 懒人终极方案:Watchtower 自动批量更新
天天手动?不存在的。
Watchtower 专门干这事:
- 轮询镜像仓库
- 发现新版本 → 优雅关闭 → 启动新容器
- 支持邮件/Slack/钉钉通知
3.1 Windows Docker Desktop 一键启动 Watchtower
docker run -d \
--name watchtower \
-v \\.\pipe\docker_engine:\\.\pipe\docker_engine \
containrrr/watchtower \
--cleanup \
--include-stopped \
--schedule "0 0 4 * * *"
参数说明:
参数 | 含义 |
---|---|
--cleanup |
更新后自动删旧镜像,省磁盘 |
--include-stopped |
连已停止的容器也一起更新 |
--schedule |
CRON 表达式,示例为每天 4 点 |
3.2 排除不想自动更新的容器
docker run -l com.centurylinklabs.watchtower.enable=false myapp
打完标签就安全了。
3.3 钉钉/邮件通知配置(可选)
docker run -d \
--name watchtower \
-v \\.\pipe\docker_engine:\\.\pipe\docker_engine \
-e WATCHTOWER_NOTIFICATIONS=email \
-e WATCHTOWER_NOTIFICATION_EMAIL_TO=you@example.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@example.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=user \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=pass \
containrrr/watchtower
4. 翻车现场 FAQ
- 端口占用?
新老容器同时监听 80 必炸,先临时端口过渡。 - 数据卷权限?
Windows bind 挂载常见 0x80070005,
给目录加Everyone
读写权限先苟住。 - Watchtower 卡死?
Windows 下 pipe 没挂好,
确认-v \\.\pipe\docker_engine:\\.\pipe\docker_engine
。
5. 一键复制脚本下载
把下面内容保存为 update.ps1
,
右键“使用 PowerShell 运行”,
即可手动热更新指定容器:
# update.ps1
$container = "nginx"
$image = "nginx:latest"
$tempPort = 8080
$finalPort = 80
docker pull $image
docker stop ${container}_old 2>$null
docker rename $container ${container}_old 2>$null
docker run -d --name ${container}_new -p ${tempPort}:80 -v C:\data\nginx:/usr/share/nginx/html $image
# 健康检查略
docker stop ${container}_old && docker rm ${container}_old
docker run -d --name $container -p ${finalPort}:80 -v C:\data\nginx:/usr/share/nginx/html $image
docker rm ${container}_new 2>$null
总结
今天解决了三大痛点:
- Windows Docker Desktop 更新容器不删除 —— 手动热更新四步走
- Docker Desktop 自动升级所有容器 —— Watchtower 一键到位
- 附赠脚本+翻车 FAQ,人类可读无废话
把文章丢进收藏夹,下次镜像再更新,
喝杯咖啡的功夫就完事了。
没有回复内容