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

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

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

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


当前回答

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

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

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

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

其他回答

摘自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 Compose,我可以推荐portainer。它有一个重建函数,可以让您在提取最新图像的同时重新创建容器。

在评估答案和研究主题之后,我想总结一下。

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

您可以将数据存储在主机上(在作为卷挂载的目录中),也可以存储在特殊的仅数据容器中。阅读更多相关信息

关于卷(Docker docs) 小Docker碎片,松散连接(汤姆·奥弗曼) 如何处理Docker中的持久存储(例如数据库)(堆栈溢出问题)

升级应用程序(例如;容器中的yum/apt-get upgrade)被认为是反模式。应用程序容器被认为是不可变的,这将保证可再现的行为。一些官方的应用程序映像(特别是mysql:5.6)甚至没有被设计为自我更新(apt-get升级不起作用)。

我要感谢每个给出答案的人,这样我们才能看到不同的方法。

与上述答案相似

docker images | awk '{print $1}' | grep -v 'none' | grep -iv 'repo' | xargs -n1 docker pull

更新

这主要是查询容器不更新作为构建图像是要做的方法

我也遇到了同样的问题,所以我创建了docker-run,这是一个非常简单的命令行工具,在docker容器中运行,以更新其他运行容器中的包。

它使用docker-py与正在运行的docker容器通信,更新包或运行任意单个命令

例子:

Docker run——rm -v /var/run/ Docker .sock:/tmp/ Docker .sockSock itech/docker-run exec

默认情况下,这将在所有正在运行的容器中运行date命令并返回结果,但您可以发出任何命令,例如docker-run exec "uname -a"

更新包(目前只使用apt-get):

Docker run——rm -v /var/run/ Docker .sock:/tmp/ Docker .sockSock itech/docker-run更新

您可以创建和别名,并将其作为常规命令行使用 如。

别名docker-run='docker run——rm -v /var/run/docker.sock:/tmp/docker. sock:/tmp/docker. sock袜子itech / docker-run '