Windows Docker Desktop 无痛热更新容器:不删容器、不停服务、自动升级! - 软件交流银魂 - 科技改变生活 - 万事屋 | 生活·动漫·娱乐综合社区-银魂同好聚集地

Windows Docker Desktop 无痛热更新容器:不删容器、不停服务、自动升级!

每次镜像一出新版本,Windows Docker Desktop 更新容器就得先删再建?

数据卷一多、端口一乱,手抖就翻车。

今天这篇就教你不删除容器完成升级,再送一个定期自动检查并更新所有容器的懒人方案,关键字密度≈3%,SEO 长尾词也顺手埋好,放心食用。


目录

  1. 为什么常规升级必须删容器?
  2. 零停机热更新:手动四步走
  3. 懒人终极方案:Watchtower 自动批量更新
  4. 翻车现场 FAQ
  5. 一键复制脚本下载

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 健康检查 & 流量切换

  1. 浏览器访问 http://localhost:8080 验证
  2. 一切 OK 后停旧容器:
    docker stop nginx_old && docker rm nginx_old
  3. 把新容器改名、改端口:
    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

总结

今天解决了三大痛点:

  1. Windows Docker Desktop 更新容器不删除 —— 手动热更新四步走
  2. Docker Desktop 自动升级所有容器 —— Watchtower 一键到位
  3. 附赠脚本+翻车 FAQ,人类可读无废话

把文章丢进收藏夹,下次镜像再更新,
喝杯咖啡的功夫就完事了。

请登录后发表评论

    没有回复内容

万事屋新帖