如何在不同主机之间移动 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 > image_name.tar
在另一台机器上复制
在另一台 docker 机器上,按以下方式运行 docker load:cat image_name.tar | docker load
导出和导入,正如另一个答案中所建议的那样,不会导出端口和变量,这可能是您的容器运行所必需的。当您尝试将其加载到另一台机器上时,您可能会遇到 “未指定命令” 等内容。
因此,save 和 export 之间的区别在于 save 命令将整个图像与历史记录和元数据一起保存,而 export 命令仅导出文件结构(没有历史记录或元数据)。
不用说,如果你已经在你正在导入的 docker hyper-visor 上使用了这些端口,那么其他一些 docker 容器最终会发生冲突,你将不得不重新配置暴露的端口。
注意:为了使用 docker 移动数据,您可能在某处拥有持久性存储,它也应该与容器一起移动。
【讨论】:
非常有帮助。 “未指定命令”消息让我抓狂。 “未指定命令”消息也让我发疯。我使用 docker commitdocker save
和docker load
之前,需要先将容器提交到镜像sudo docker commit <container_id> 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 start
或 docker 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 容器?的主要内容,如果未能解决你的问题,请参考以下文章