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

时间:2015-02-26 03:43:29

标签: docker containers docker-registry

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

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

7 个答案:

答案 0 :(得分:79)

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

  1. 将容器导出到tarball

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

  3. 将其导回

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

答案 1 :(得分:41)

您无法将正在运行的docker容器从一个主机移动到另一个主机。

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

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

答案 2 :(得分:17)

由于Docker显然是在peek of inflated expectations写作的时候,因此最终对我有用,经过多次令人困惑的手册和令人困惑的教程,是:

  1. 将泊坞窗图像保存到存档中:
    docker save image_name > image_name.tar
  2. 在另一台机器上复制
  3. 在另一台docker机器上,以下列方式运行docker load:
    cat image_name.tar | docker load
  4. 导出和导入,如另一个答案所建议的那样,不会导出容器运行所需的端口和变量。你可能会得到像“没有指定命令”之类的东西......当你试图在另一台机器上加载它时。

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

答案 3 :(得分:16)

来自Docker文档:

  

if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false 不会导出相关卷的内容   与容器。如果卷安装在现有卷上   容器中的目录if (offsetTop != null && this.affixed == 'top') return scrollTop <= offsetTop ? 'top' : false 将导出内容   底层目录,而不是卷的内容。参考   到Backup, restore, or migrate data volumes   在用户指南中有关导出卷中数据的示例。

其他外部工具: 要移动容器及其关联的数据卷,您可以使用Flocker https://clusterhq.com/flocker/introduction/

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

1.commit /将容器保存到新图像:

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


ps:“我们的容器CONTAINER_NAME的挂载卷位于'/ 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格式找到我们的卷。
到现在为止,我们有容器的图像“ IMAGE_NAME.tar”及其卷“ volume_backup.tar”。

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

答案 6 :(得分:0)

码头出口| gzip > .tar.gz

#新主机 gunzip < /mnt/usb/.tar.gz |码头工人进口 -

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