假设我已经取出了mysql:5.6.21的官方映像。
我通过创建几个docker容器部署了这个映像。
这些容器已经运行了一段时间,直到MySQL 5.6.22发布。mysql:5.6的官方形象随着新版本的发布而更新,但我的容器仍然运行5.6.21。
我如何传播映像中的更改(即升级MySQL发行版)到所有现有的容器?Docker的正确方式是什么?
假设我已经取出了mysql:5.6.21的官方映像。
我通过创建几个docker容器部署了这个映像。
这些容器已经运行了一段时间,直到MySQL 5.6.22发布。mysql:5.6的官方形象随着新版本的发布而更新,但我的容器仍然运行5.6.21。
我如何传播映像中的更改(即升级MySQL发行版)到所有现有的容器?Docker的正确方式是什么?
当前回答
摘自http://blog.stefanxo.com/2014/08/update-all-docker-images-at-once/
您可以使用以下命令管道更新所有现有的映像:
docker images | awk '/^REPOSITORY|\<none\>/ {next} {print $1}' | xargs -n 1 docker pull
其他回答
我不喜欢挂载卷作为到主机目录的链接,所以我提出了一个模式,用完全由docker管理的容器来升级docker容器。使用——volumes-from <container>创建一个新的docker容器,将为新容器提供更新后的镜像共享docker管理的卷的所有权。
docker pull mysql
docker create --volumes-from my_mysql_container [...] --name my_mysql_container_tmp mysql
通过不立即删除原始的my_mysql_container,如果升级后的容器没有正确的数据,或者没有通过健全测试,您可以恢复到已知的工作容器。
此时,我通常会运行容器的任何备份脚本,以便在出现问题时为自己提供一个安全网
docker stop my_mysql_container
docker start my_mysql_container_tmp
现在,您有机会确保希望在新容器中的数据已经存在,并运行完整性检查。
docker rm my_mysql_container
docker rename my_mysql_container_tmp my_mysql_container
只要有容器在使用docker卷,docker卷就会一直存在,所以您可以安全地删除原始容器。一旦删除了原来的容器,新的容器就可以采用原来的同名容器,使一切都像开始时一样漂亮。
使用此模式升级docker容器有两个主要优点。首先,它允许卷直接传输到升级的容器,从而消除了将卷挂载到主机目录的需要。其次,你永远不会处于一个没有工作docker容器的位置;因此,如果升级失败,您可以通过再次旋转原来的docker容器轻松恢复到以前的工作方式。
我在这里尝试了很多方法,但最终还是成功了。 如果你在容器上打开了自动删除,你就不能停止和编辑容器,或者一个服务正在运行,甚至不能立即停止, 你必须:
PULL最新图片——> docker PULL[图片:latest] 验证是否提取了正确的图像,您可以在Portainer Images部分中看到未使用的标记
使用Portainer或CLI更新服务,并确保您使用的是映像的最新版本,Portainer将为您提供相同的选项。
这不仅会更新容器的最新映像,而且还会保持服务运行。
只是为了提供一个更一般的(不是mysql特定的)答案…
简而言之
与服务映像注册中心同步(https://docs.docker.com/compose/compose-file/#image):
docker-compose pull
如果docker-compose文件或映像已更改,则重新创建容器:
docker-compose up -d
背景
容器映像管理是使用docker-compose的原因之一 (参见https://docs.docker.com/compose/reference/up/)
如果某个服务存在现有的容器,并且该服务的配置或映像在容器创建之后发生了更改,那么docker-compose up将通过停止并重新创建容器(保留已挂载的卷)来获取更改。为了防止Compose拾取更改,请使用——no- rebuild标志。
数据管理方面也由docker-compose通过挂载外部“卷”(参见https://docs.docker.com/compose/compose-file/#volumes)或数据容器来覆盖。
这就留下了潜在的向后兼容性和数据迁移问题,但这些都是“应用程序”问题,而不是Docker特有的问题,必须根据发布说明和测试进行检查……
您需要重新构建所有映像并重新启动所有容器,或者以某种方式更新软件并重新启动数据库。没有升级的路径,只能由你自己设计。
如果你不想使用Docker Compose,我可以推荐portainer。它有一个重建函数,可以让您在提取最新图像的同时重新创建容器。