如何在不同主机之间移动Docker容器?

问题描述 投票:0回答:8

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

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

docker containers docker-registry
8个回答
123
投票

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

  1. 将容器导出到压缩包

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

  3. 导入回来

    cat /home/export.tar | docker import - some-name:latest
    

您还可以按如下方式移动容器:

  1. 停止源主机上的容器。

    docker stop x
    

    如果您使用

    -v
    启动容器,则必须将挂载的文件和目录复制到新主机。

  2. 提交您的更改

    docker commit -p x x
    
  3. 将容器保存到图像

    docker save -o x x
    
  4. 将 x 文件复制到新的目标主机。

  5. 连接到目标主机。

  6. 加载新图像

    docker load -i x
    
  7. 运行新镜像

    docker run 
    

    请注意,

    -v
    可能需要引用目标主机上已挂载的文件和目录,以镜像源主机。


93
投票

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

您可以使用

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

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


65
投票

在大量令人困惑的手册和令人困惑的教程之后,最终对我有用的是:

将 docker 镜像保存到存档中:
  1. docker save image_name > image_name.tar
    在另一台机器上复制
  2. 在另一台 docker 机器上,按以下方式运行 docker load:
  3. cat image_name.tar | docker load
    
    
  4. 导出和导入,如另一个答案中所建议的那样,不会导出端口和变量,这可能是您的容器运行所必需的。你可能会得到像
“没有指定命令”

等的东西......当你尝试将它加载到另一台机器上时。 因此,保存和导出之间的区别在于保存命令保存整个图像以及历史和元数据,而导出命令仅导出文件结构(没有历史或元数据)。

不用说,如果你已经在你正在导入的 docker hyper-visor 上使用了这些端口,那么你将最终陷入冲突,你将不得不重新配置暴露的端口。

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


31
投票
https://github.com/ricardobranco777/docker-volumes.sh

does

保存卷中的数据。 用法示例:

# 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



20
投票

docker export

不导出相关卷的内容 与容器。如果一个卷安装在一个现有的 容器中的目录,

docker export
将导出内容
underlying
目录,而不是卷的内容。参考 备份、恢复或迁移数据 体积 在用户指南中获取有关在卷中导出数据的示例。


3
投票



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


++ 提交容器:
  1. #码头停止
    # docker commit CONTAINER_NAME # docker save --output IMAGE_NAME.tar IMAGE_NAME:TAG



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



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


  2. 现在当你查看 ${pwd}/backup 时,你会发现我们的卷是 tar 格式的。
到现在为止,我们已经有了容器的图像“IMAGE_NAME.tar”及其卷“volume_backup.tar”。



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


0
投票
这个扩展

或者你可以看到

这个链接

并描述它是如何在幕后工作的?然后自己做。


-1
投票

#新主人 压缩包

docker run -i -p 80:80 /bin/bash< /mnt/usb/.tar.gz | docker import -

© www.soinside.com 2019 - 2024. All rights reserved.