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

Posted

技术标签:

【中文标题】如何在不同主机之间移动 Docker 容器?【英文标题】:How to move Docker containers between different hosts? 【发布时间】:2015-04-28 08:04:06 【问题描述】:

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

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

【问题讨论】:

看看flocker github.com/ClusterHQ/flocker 请注意,您可能希望使用保存/加载而不是导出/导入,因为保存会保留元数据和历史记录。 这应该是对@aholt 答案的评论吗? docker save 用于保存图像,而不是容器。 docs.docker.com/engine/reference/commandline/save 【参考方案1】:

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

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

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

【讨论】:

@larsks 第一步不是停止容器,然后进行提交吗? @valentt 两者都可以,提交正在运行和停止的容器 这个答案并没有真正解释你需要使用的命令,这让像我这样的菜鸟很难 docker-checkpoint 可以让您在主机之间移动“正在运行”的容器,如果它们都支持 CRIU。 1.停止容器docker stop x; 2. 提交你的更改docker commit -p x x; 3. 将容器保存到镜像docker save -o x x; 4.将x文件移动到新主机并在新主机中加载新图像dokcer load -i x(如果您使用-v选项启动容器,您也必须将这些文件移动到新主机); 5. 用docker run (-v is required to mount these files if needed)运行这个镜像【参考方案2】:

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

    将容器导出到压缩包

    docker export <CONTAINER ID> > /home/export.tar
    

    将 tarball 移至新机器

    重新导入

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

【讨论】:

也不保留存储在卷中的数据。 这应该如何工作?导入后我得到新图像,然后呢?只需执行一个新的运行命令? 这实际上是一个非常糟糕的建议,尤其是对于运行数据库的容器。我尝试了这个建议,但没有奏效。可以先停止容器吗? 这个建议只是为了替代。它可能适用于您的情况,但可能不会。对我来说,当时我正在设置数据库复制 docker 容器,并且对于导出/导入,并不关心保留数据,因为我定期将数据库数据备份到不同的 tarball。为此,这非常有效。【参考方案3】:

来自 Docker 文档:

docker export 不导出相关卷的内容 与容器。如果卷安装在现有卷的顶部 容器中的目录,docker export 将导出内容 基础目录,而不是卷的内容。参考 到Backup, restore, or migrate data volumes 在用户指南中获取有关在卷中导出数据的示例。

【讨论】:

cluster hq shutdown... 和 BTW 迁移容器,容器应该在 ZFS/任何受支持的存储 lun 上运行【参考方案4】:

在阅读了大量令人困惑的手册和令人困惑的教程之后,最终对我有用的是,因为 Docker 显然是在我撰写本文时peek of inflated expectations,是:

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

导出和导入,正如另一个答案中所建议的那样,不会导出端口和变量,这可能是您的容器运行所必需的。当您尝试将其加载到另一台机器上时,您可能会遇到 “未指定命令” 等内容。

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

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

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

【讨论】:

非常有帮助。 “未指定命令”消息让我抓狂。 “未指定命令”消息也让我发疯。我使用 docker commit stackstorm-local:2.9,和 docker pull stackstorm-local:2.9 from another host. 这里也是,你刚刚节省了我的容器和时间! 需要注意的是,在做docker savedocker load之前,需要先将容器提交到镜像sudo docker commit &lt;container_id&gt; image_name【参考方案5】:

使用这个脚本: 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

【讨论】:

在 AWS Linux (Centos) 上对我不起作用。在 endi 中,我采用了使用 docker inspect 查找卷目录的低技术方法,然后手动将其复制过来。 @JasonPlutext 也许与 SELinux 有关?您是否启用了 SELinux? 得到这个:tar:从成员名称中删除前导 `/' @hjahan 这是典型的 tar 消息。不是错误,甚至不是警告。 这很好用,但是我建议将 $CONTAINER 重命名为示例的不同名称。这是因为 $CONTAINER 名称可能与实际的 CONTAINER 图像名称不同。另外作为旁注,如果使用 docker-compose,则不需要使用 docker startdocker create。您可以将docker-compose up 与原始系统中的相同配置一起使用,然后按照说明继续操作。【参考方案6】:

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

1.commit/save 容器到新镜像:

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

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

    ++ 保存它的卷:我们将使用一个 ubuntu 映像来做这件事。# mkdir 备份 # 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”。

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

【讨论】:

【参考方案7】:

码头出口 | gzip > .tar.gz

#新主机 gunzip

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

【讨论】:

以上是关于如何在不同主机之间移动 Docker 容器?的主要内容,如果未能解决你的问题,请参考以下文章

在 CoreOS 主机之间移动 docker 数据卷容器

如何通过“主机名”在 Docker 容器之间进行通信

如何使不同主机上的docker容器互相通信

如何实现docker跨主机之间容器通信问题(方法二)

如何在docker和宿主机之间复制文件

如何在docker和宿主机之间复制文件