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

我不能找到一种方法来移动码头运行容器从一个主机到另一个主机。

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

190084 次浏览

不能将正在运行的 Docker 容器从一个主机移动到另一个主机。

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

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

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

  1. 将容器导出到 tarball

    docker export <CONTAINER ID> > /home/export.tar
    
  2. Move your tarball to new machine

  3. Import it back

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

来自 Docker 文档:

docker export不导出相关卷的内容 如果卷安装在现有的 目录中,docker export将导出内容 目录,而不是卷的内容。请参阅 到 < a href = “ https://docs.docker.com/engine/Tutorials/dockervolutions/# 幽灵数据库备份、恢复或迁移数据”rel = “ nofollow noReferrer”> 备份、恢复或迁移数据 数量 在用户指南中找到导出卷中数据的示例。

在经历了大量令人困惑的手册和教程之后,我终于明白了一件事,那就是:

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

导出和导入,如另一个答案中所建议的,不导出容器运行可能需要的端口和变量。你可能会得到像 “未指定命令”这样的东西。.当您试图将其加载到另一台机器上时。

因此,保存和导出的区别在于,保存命令保存了具有历史和元数据的整个图像,而导出命令只导出文件结构(没有历史和元数据)。

不用说,如果你已经有了那些端口采取了你正在进行导入,由其他码头容器,你将最终在冲突,你将不得不重新配置暴露的端口。

注意: 为了使用 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

我尝试了许多解决方案,这是一个为我工作: < br/> < br/>

1. 提交/保存容器到新映像:

  1. + + 提交容器:
    # 码头停靠
    # docker commit CONTAINER _ NAME
    # docker save-output IMAGE _ NAME.tar IMAGE _ NAME: TAG
    < br/> < br/>

Ps: “我们的容器 CONTAINER _ NAME 在’/var/home’有一个安装的卷”(您必须检查容器以指定其卷路径: # docker check CONTAINER _ NAME) < br/> < br/>

  1. + + 保存它的音量: 我们将使用一个 ubuntu 映像来做这件事。
    # mkdir 后援
    # docker run —— rm —— files-from CONTAINER _ NAME-v ${ pwd }/back.ubuntu # docker run —— rm —— files-from CONTAINER _ NAME-v ${ pwd }/back.ubuntu Bash-c“ cd/var/home & & tar cvf/backup/voluk _ backup.tar”< br/> < br/>

现在,当您查看 ${ pwd }/back 时,您会发现我们的卷是 tar 格式的。
到目前为止,我们已经得到了容器的映像“ IMAGE _ NAME.tar”和它的卷“ voluI _ backup.tar”。 < br/>

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

Docker export | gzip > . tar.gz

# 新主人 Gunzip

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