假设我已经取出了mysql:5.6.21的官方映像。

我通过创建几个docker容器部署了这个映像。

这些容器已经运行了一段时间,直到MySQL 5.6.22发布。mysql:5.6的官方形象随着新版本的发布而更新,但我的容器仍然运行5.6.21。

我如何传播映像中的更改(即升级MySQL发行版)到所有现有的容器?Docker的正确方式是什么?


当前回答

如果你不想使用Docker Compose,我可以推荐portainer。它有一个重建函数,可以让您在提取最新图像的同时重新创建容器。

其他回答

我在这里尝试了很多方法,但最终还是成功了。 如果你在容器上打开了自动删除,你就不能停止和编辑容器,或者一个服务正在运行,甚至不能立即停止, 你必须:

PULL最新图片——> docker PULL[图片:latest] 验证是否提取了正确的图像,您可以在Portainer Images部分中看到未使用的标记

使用Portainer或CLI更新服务,并确保您使用的是映像的最新版本,Portainer将为您提供相同的选项。

这不仅会更新容器的最新映像,而且还会保持服务运行。

我想补充的是,如果你想自动完成这个过程(下载、停止和重新启动一个新容器,设置与@Yaroslav所描述的相同),你可以使用WatchTower。一个程序,自动更新你的容器时,他们被改变https://github.com/v2tec/watchtower

确保您将所有持久数据(配置、日志或应用程序数据)都用于卷,这些数据存储在与容器内进程状态相关的容器上。更新Dockerfile并使用您想要的更改重新构建映像,并重新启动容器,将卷挂载到相应的位置。

这也是我为自己的照片所做的努力。我有一个服务器环境,从中创建Docker映像。当我更新服务器时,我希望所有基于Docker映像运行容器的用户都能够升级到最新的服务器。

理想情况下,我更喜欢生成一个新版本的Docker映像,并让所有基于该映像以前版本的容器自动更新到“到位”的新映像。但这种机制似乎并不存在。

因此,到目前为止,我能想到的下一个最佳设计是提供一种让容器更新自身的方法——类似于桌面应用程序检查更新并升级自身的方式。在我的例子中,这可能意味着编写一个脚本,其中包含从一个知名标记提取的Git。

图像/容器实际上并没有改变,但是容器的“内部”发生了变化。您可以想象对apt-get、yum或任何适合您环境的东西执行相同的操作。与此同时,我将更新注册表中的myserver:最新映像,以便任何新的容器都将基于最新映像。

我很想知道是否有任何现有技术可以解决这个问题。

只是为了提供一个更一般的(不是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特有的问题,必须根据发布说明和测试进行检查……