124

我找不到将运行 docker 的容器从一个主机移动到另一个主机的方法。

有什么方法可以将容器推送到存储库,就像我们对图像所做的那样?目前,我没有使用数据卷来存储与容器内运行的应用程序相关的数据。所以一些数据驻留在容器中,我想在重新设计设置之前保留这些数据。

4

7 回答 7

113

或者,如果您不想推送到存储库:

  1. 将容器导出到 tarball

    docker export <CONTAINER ID> > /home/export.tar
    
  2. 将您的压缩包移动到新机器

  3. 导入回来

    cat /home/export.tar | docker import - some-name:latest
    
于 2015-02-26T20:07:19.350 回答
78

您不能将正在运行的 docker 容器从一台主机移动到另一台主机。

您可以使用 将容器中的更改提交到映像docker commit,将映像移动到新主机上,然后使用 启动新容器docker run。这将保留您的应用程序在容器内创建的所有数据。

注意:它不保留存储在卷内的数据;您需要手动将数据卷移动到新主机。

于 2015-02-26T03:50:58.913 回答
55

经过大量令人困惑的手册和令人困惑的教程之后,最终对我有用的东西

  1. 将 docker 映像保存到存档中:
    docker save image_name > image_name.tar
  2. 在另一台机器上复制
  3. 在另一台 docker 机器上,按以下方式运行 docker load:
    cat image_name.tar | docker load

如另一个答案中所建议的,导出和导入不会导出容器运行可能需要的端口和变量。你最终可能会得到诸如“未指定命令”之类的东西......当你尝试将它加载到另一台机器上时。

因此,save 和 export 之间的区别在于 save 命令将整个图像与历史和元数据一起保存,而 export 命令仅导出文件结构(没有历史或元数据)。

不用说,如果您已经在正在执行导入的 docker hyper-visor 上使用了这些端口,那么通过其他一些 docker 容器,您最终会发生冲突,并且您将不得不重新配置暴露的端口。

注意:为了使用 docker 移动数据,您可能在某处拥有持久存储,它也应该与容器一起移动。

于 2018-05-11T22:17:52.173 回答
21

使用此脚本: https ://github.com/ricardobranco777/docker-volumes.sh

确实保留了卷中的数据。

示例用法:

# Stop the container   
docker stop $CONTAINER

# Create a new image   
docker commit $CONTAINER $CONTAINER

# Save image
docker save -o $CONTAINER.tar $CONTAINER

# Save the volumes (use ".tar.gz" if you want compression)
docker-volumes.sh $CONTAINER save $CONTAINER-volumes.tar

# Copy image and volumes to another host
scp $CONTAINER.tar $CONTAINER-volumes.tar $USER@$HOST:

# On the other host:
docker load -i $CONTAINER.tar
docker create --name $CONTAINER [<PREVIOUS CONTAINER OPTIONS>] $CONTAINER

# Load the volumes
docker-volumes.sh $CONTAINER load $CONTAINER-volumes.tar

# Start container
docker start $CONTAINER
于 2018-10-30T15:52:40.950 回答
19

来自 Docker 文档:

docker export不导出与容器关联的卷的内容。如果卷安装在容器中现有目录的顶部,docker export将导出底层 目录的内容,而不是卷的内容。有关在卷中导出数据的示例,请参阅用户指南中的备份、恢复或迁移数据卷

于 2015-08-08T10:52:48.940 回答
2

我为此尝试了许多解决方案,这是对我有用的解决方案:

1.提交/保存容器到新图像:

  1. ++ 提交容器:
    # docker stop
    # docker commit CONTAINER_NAME
    # docker save --output IMAGE_NAME.tar IMAGE_NAME:TAG


ps:“我们的容器 CONTAINER_NAME 在 '/var/home' 有一个已安装的卷”(您必须检查您的容器以指定其卷路径:# docker inspect CONTAINER_NAME)

  1. ++ 保存它的体积:我们将使用一个 ubuntu 映像来做这件事。
    # mkdir backup
    # docker run --rm --volumes-from CONTAINER_NAME -v ${pwd}/backup:/backup ubuntu bash -c “cd /var/home && tar cvf /backup/volume_backup.tar 。”

现在,当您查看 ${pwd}/backup 时,您会发现我们的卷采用 tar 格式。
到目前为止,我们已经有了容器的映像“IMAGE_NAME.tar”和它的卷“volume_backup.tar”。

现在您可以在新主机上重新创建相同的旧容器。

于 2019-07-17T17:01:51.840 回答
-1

码头出口 | gzip > .tar.gz

#new 主机 gunzip < /mnt/usb/.tar.gz | 码头进口 -

docker run -i -p 80:80 /bin/bash

于 2021-03-22T01:03:22.880 回答