假设我已经取出了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的正确方式是什么?
当前回答
我想补充的是,如果你想自动完成这个过程(下载、停止和重新启动一个新容器,设置与@Yaroslav所描述的相同),你可以使用WatchTower。一个程序,自动更新你的容器时,他们被改变https://github.com/v2tec/watchtower
其他回答
这也是我为自己的照片所做的努力。我有一个服务器环境,从中创建Docker映像。当我更新服务器时,我希望所有基于Docker映像运行容器的用户都能够升级到最新的服务器。
理想情况下,我更喜欢生成一个新版本的Docker映像,并让所有基于该映像以前版本的容器自动更新到“到位”的新映像。但这种机制似乎并不存在。
因此,到目前为止,我能想到的下一个最佳设计是提供一种让容器更新自身的方法——类似于桌面应用程序检查更新并升级自身的方式。在我的例子中,这可能意味着编写一个脚本,其中包含从一个知名标记提取的Git。
图像/容器实际上并没有改变,但是容器的“内部”发生了变化。您可以想象对apt-get、yum或任何适合您环境的东西执行相同的操作。与此同时,我将更新注册表中的myserver:最新映像,以便任何新的容器都将基于最新映像。
我很想知道是否有任何现有技术可以解决这个问题。
您需要重新构建所有映像并重新启动所有容器,或者以某种方式更新软件并重新启动数据库。没有升级的路径,只能由你自己设计。
如果你不想使用Docker Compose,我可以推荐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
考虑以下答案:
数据库名称为app_schema 容器名称为app_db root用户密码为“root123”
在容器中存储应用程序数据时如何更新MySQL
这被认为是一种糟糕的做法,因为如果丢失了容器,就会丢失数据。虽然这是一个不好的做法,但这里有一个可行的方法:
1)做一个数据库转储为SQL:
docker exec app_db sh -c 'exec mysqldump app_schema -uroot -proot123' > database_dump.sql
2)更新图像:
docker pull mysql:5.6
3)更新容器:
docker rm -f app_db
docker run --name app_db --restart unless-stopped \
-e MYSQL_ROOT_PASSWORD=root123 \
-d mysql:5.6
4)恢复数据库转储:
docker exec app_db sh -c 'exec mysql -uroot -proot123' < database_dump.sql
如何使用外部卷更新MySQL容器
使用外部卷是一种更好的管理数据的方法,它使更新MySQL变得更容易。释放容器不会丢失任何数据。您可以使用Docker -compose来方便地管理单个主机上的多容器Docker应用程序:
1)创建docker-compose。Yml文件,以便管理您的应用程序:
version: '2'
services:
app_db:
image: mysql:5.6
restart: unless-stopped
volumes_from: app_db_data
app_db_data:
volumes: /my/data/dir:/var/lib/mysql
2)更新MySQL(从与docker-compose相同的文件夹。yml文件):
docker-compose pull
docker-compose up -d
注意:上面的最后一个命令将更新MySQL映像,重新创建并使用新映像启动容器。