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

41ik7eoe  于 2023-04-11  发布在  Docker
关注(0)|答案(7)|浏览(145)

我无法找到将运行Docker的容器从一个主机移动到另一个主机的方法。
有没有什么方法可以像我们为图像做的那样将容器推送到存储库?目前,我没有使用数据卷来存储与在容器内运行的应用程序相关的数据。因此,一些数据驻留在容器中,我希望在重新设计设置之前将其持久化。

z6psavjg

z6psavjg1#

或者,如果您不希望推送到存储库:
1.将容器导出到tarball

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

1.将tarball移动到新机器
1.导入回来

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

也可以按如下方式移动容器:
1.在源主机上停止容器。

docker stop x

如果使用-v启动容器,则必须将挂载的文件和目录复制到新主机。
1.提交更改

docker commit -p x x

1.将容器保存到图像

docker save -o x x

1.将x文件复制到新的目标主机。
1.连接到目标主机。
1.加载新图像

docker load -i x

1.运行新映像

docker run

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

6ioyuze2

6ioyuze22#

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

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

t40tm48m

t40tm48m3#

在经历了大量令人困惑的手册和令人困惑的教程之后,由于Docker显然是在我写peak of inflated expectations的时候,最终对我起作用的是:
1.将docker镜像保存到archive:
docker save image_name > image_name.tar
1.在另一台机器上复制
1.在另一台docker机器上,按以下方式运行docker load:
cat image_name.tar | docker load
导出和导入,如在另一个答案中所建议的那样,不会导出端口和变量,这可能是您的容器运行所必需的。当您尝试在另一台机器上加载它时,您可能会得到类似**“未指定命令”**等内容。
因此,保存和导出之间的区别在于,保存命令保存整个图像以及历史和元数据,而导出命令仅导出文件结构(没有历史或元数据)。
不用说的是,如果你已经在你正在做导入的docker hypervisor上使用了这些端口,那么其他的docker容器,你将最终陷入冲突,你将不得不重新配置暴露的端口。
注意:为了使用docker移动数据,您可能在某个地方拥有持久存储,它也应该与容器一起移动。

lstz6jyr

lstz6jyr4#

使用此脚本: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
q8l4jmvw

q8l4jmvw5#

Docker文档:
docker export不会导出与容器关联的卷的内容。如果卷装载在容器中现有目录的顶部,则docker export将导出 * 底层 * 目录的内容,而不是卷的内容。有关导出卷中数据的示例,请参阅用户指南中的备份、还原或迁移数据卷。

093gszye

093gszye6#

我尝试了很多解决方案,这是一个为我工作:
1.将容器提交/保存到新镜像:
1.++提交容器:

  • docker stop

docker commit CONTAINER_NAME

docker保存--output IMAGE_NAME. tar IMAGE_NAME:TAG*

ps:“Our container CONTAINER_NAME has a mounted volume at '/var/home'”(您必须检查您的容器以指定其卷路径:# docker inspect CONTAINER_NAME)
1.++保存其音量:我们将使用一个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格式的。
到目前为止,我们有conatainer的映像'IMAGE_NAME.tar'和它的卷'volume_backup.tar'。
现在,您可以在新主机上重新创建相同的旧容器。

4szc88ey

4szc88ey7#

docker导出|gzip〉.tar.gz

new host gunzip〈/mnt/usb/. tar. gz|docker import -

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

相关问题