假设我已经拉出了官方的mysql:5.6.21 image。
我已经通过创建几个docker容器部署了这个镜像。
这些容器已经运行了一段时间,直到MySQL 5.6.22发布。mysql:5.6的官方镜像随着新版本的更新而更新,但我的容器仍然运行5.6.21。
如何将镜像中的更改(即升级MySQL发行版)传播到我现有的所有容器?做这件事的合适的Docker方法是什么?
发布于 2014-11-10 04:33:24
在评估了答案并研究了主题之后,我想总结一下。
Docker升级容器的方式似乎如下所示:
应用程序容器不应存储应用程序数据。这样,你就可以随时通过执行下面这样的命令,用更新的版本替换应用程序容器:
docker pull mysql
docker stop my-mysql-container
docker rm my-mysql-container
docker run --name=my-mysql-container --restart=always \
-e MYSQL_ROOT_PASSWORD=mypwd -v /my/data/dir:/var/lib/mysql -d mysql您可以将数据存储在主机上(作为卷挂载的目录中),也可以存储在特殊的纯数据容器中。了解更多信息
升级应用程序(例如,使用yum/apt-get升级)被认为是反模式。应用程序容器被认为是不可变的,这将保证可重现的行为。一些官方应用程序镜像(特别是mysql:5.6)甚至不能自我更新(apt-get升级不起作用)。
我要感谢给出答案的每一个人,这样我们就可以看到所有不同的方法。
发布于 2015-11-05 11:56:19
我不喜欢挂载卷作为指向主机目录的链接,所以我想出了一个模式,用于使用完全由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容器,轻松地恢复到以前的工作方式。
发布于 2017-04-20 17:45:33
只是为了提供一个更通用的(不是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-recreate标志。
通过挂载的外部“卷”(参见https://docs.docker.com/compose/compose-file/#volumes)或数据容器,docker-compose也涵盖了数据管理方面。
这使得潜在的向后兼容性和数据迁移问题保持不变,但这些都是“应用”问题,而不是特定于Docker的问题,必须根据发行说明和测试进行检查……
https://stackoverflow.com/questions/26734402
复制相似问题