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

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

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

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


当前回答

考虑以下答案:

数据库名称为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映像,重新创建并使用新映像启动容器。

其他回答

下面是在构建自定义Dockerfile时使用docker-compose的样子。

首先构建自定义Dockerfile,然后附加下一个版本号以进行区分。示例:docker build -t imagename:版本。这将在本地存储您的新版本。 运行docker-compose down 编辑docker-compose。Yml文件以反映在步骤1中设置的新映像名称。 运行docker-compose up -d。它将在本地查找图像并使用升级后的图像。

编辑- - - - - -

我上面的步骤比实际需要的更冗长。我已经通过包含构建优化了我的工作流程:。参数到我的docker-compose文件。现在的步骤是这样的:

验证我的Dockerfile是我想要的样子。 在docker-compose文件中设置映像名称的版本号。 如果我的映像还没有构建:运行docker-compose build 运行docker-compose up -d

我当时没有意识到,但是docker-compose足够智能,只需用一个命令就可以将我的容器更新为新的映像,而不必先将其关闭。

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

摘自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

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

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

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

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

考虑以下答案:

数据库名称为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映像,重新创建并使用新映像启动容器。