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

How to move Docker containers between different hosts?

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

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

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

您可以使用 docker commit, move the image onto a new host, and then start a new container with docker run 将容器中的更改提交到图像。这将保留您的应用程序在容器内创建的所有数据。

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

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

  1. 将容器导出到 tarball

    docker export <CONTAINER ID> > /home/export.tar
    
  2. 将您的 tarball 移至新机器

  3. 将其导入回来

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

来自 Docker 文档:

docker export does not export the contents of volumes associated with the container. If a volume is mounted on top of an existing directory in the container, docker export will export the contents of the underlying directory, not the contents of the volume. Refer to Backup, restore, or migrate data volumes in the user guide for examples on exporting data in a volume.

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

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

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

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

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

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

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

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

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

  1. ++ 提交容器:
    #docker停止
    # docker 提交 CONTAINER_NAME
    # docker save --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 运行 --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'.

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

docker 导出 | gzip > .tar.gz

#新主机 gunzip < /mnt/usb/.tar.gz | docker 导入 -

docker 运行 -i -p 80:80 /bin/bash