docker-compose运行的应用如何实现服务镜像替换?
Docker Compose 运行态替换服务镜像的实操说明
直接说结论:完全不用重启整个应用栈,也不是必须改完配置才能换镜像,两种适配不同需求的操作路径都能完成替换,全程可以做到不中断其他正在运行的服务:
临时测试用的镜像替换(不改动compose配置文件)
- 适用情况:临时换个镜像测功能,不想动正式的配置文件
- 操作步骤:
- 只停目标服务就行:比如要换服务a的镜像,执行
docker-compose stop a,旁边跑着的服务b全程不受影响,照常运行 - 把已经停掉的a服务旧容器删掉:
docker-compose rm -f a - 把你准备好的目标版本镜像,打上和compose配置里一致的标签:比如原配置里a服务绑定的镜像名是
a,就执行docker tag <你要换的目标镜像ID/完整名称> a - 单服务拉起新容器:
docker-compose up -d a,compose会自动认出来本地的a镜像已经换成新的了,直接起新容器就算换完
- 只停目标服务就行:比如要换服务a的镜像,执行
- 提醒:这种换法是临时的,后面如果跑全量
docker-compose up、或者宿主机重启之后,compose还是会按照原来的配置匹配镜像,临时换的版本不会被存下来。
长期使用的版本替换
- 适用情况:确认新版本没问题,要正式把原来的镜像换成新的
- 操作步骤:
- 先改docker-compose.yml里对应服务的image字段,把原来的镜像名改成带目标版本的完整引用,比如把
image: a改成image: a:2.3.0 - 执行单服务更新命令,不用重启整个应用:
docker-compose up -d --no-deps a - 这个命令跑起来之后,compose会自动拉你指定的新版本镜像,停掉旧的a服务容器,起新版本的a容器,整个过程服务b既不会被停,也不会被重建,全程正常对外提供服务。
- 先改docker-compose.yml里对应服务的image字段,把原来的镜像名改成带目标版本的完整引用,比如把
- 避坑提醒:很多人以为改完compose就得把所有服务重启一遍,其实只要加了
--no-deps参数,compose就只操作你指定的那个服务,不会碰其他没改动的实例。
内容的提问来源于stack exchange,提问作者reynoldsbj
相关产品推荐
相关产品推荐

