假设我已经取出了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 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映像。当我更新服务器时,我希望所有基于Docker映像运行容器的用户都能够升级到最新的服务器。
理想情况下,我更喜欢生成一个新版本的Docker映像,并让所有基于该映像以前版本的容器自动更新到“到位”的新映像。但这种机制似乎并不存在。
因此,到目前为止,我能想到的下一个最佳设计是提供一种让容器更新自身的方法——类似于桌面应用程序检查更新并升级自身的方式。在我的例子中,这可能意味着编写一个脚本,其中包含从一个知名标记提取的Git。
图像/容器实际上并没有改变,但是容器的“内部”发生了变化。您可以想象对apt-get、yum或任何适合您环境的东西执行相同的操作。与此同时,我将更新注册表中的myserver:最新映像,以便任何新的容器都将基于最新映像。
我很想知道是否有任何现有技术可以解决这个问题。
与上述答案相似
docker images | awk '{print $1}' | grep -v 'none' | grep -iv 'repo' | xargs -n1 docker pull
摘自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
您需要重新构建所有映像并重新启动所有容器,或者以某种方式更新软件并重新启动数据库。没有升级的路径,只能由你自己设计。