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

Din*_*ddy 82 containers docker docker-registry

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

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

aho*_*olt 86

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

1)将容器导出到tarball

docker export <CONTAINER ID> > /home/export.tar
Run Code Online (Sandbox Code Playgroud)

2)将tarball移动到新机器上

3)将其导入

cat /home/export.tar | docker import - some-name:latest
Run Code Online (Sandbox Code Playgroud)

  • 也不保留存储在卷内的数据. (7认同)
  • 这应该如何运作?导入后我得到了新图像,然后呢?只需执行一个新的运行命令? (2认同)
  • 这实际上是一个非常糟糕的建议,特别是对于运行数据库的容器.我尝试了这个建议但它没有用.它可能首先停止容器吗? (2认同)
  • 该建议仅是真正的替代选择。它可能适合您的情况,但可能不起作用。对我来说,当时我正在设置数据库复制docker容器,而对于导出/导入,我并不关心保留数据,因为我定期将数据库数据的备份运行到另一个tarball中。为此,这很完美。 (2认同)

lar*_*sks 43

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

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

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

  • 1.停止容器`docker stop x`;2. 提交你的更改`docker commit -pxx`;3. 将容器保存到镜像`docker save -oxx`;4. 将 x 文件移动到新主机,并在新主机中加载新映像“dokcer load -ix”(如果您使用“-v”选项启动容器,您也必须将这些文件移动到新主机);5. 使用“docker run”运行此映像(如果需要,需要使用 -v 来挂载这些文件) (7认同)
  • 这个答案并没有真正准确地解释你需要使用的命令,这对于像我这样的菜鸟来说很难 (4认同)

Ale*_*vić 20

经过多次令人困惑的手册和令人困惑的教程,最终对我有用的是,因为Docker显然是在我写作时看到了夸大的期望,是:

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

如另一个答案中所建议的,导出和导入不会导出容器运行所需的端口和变量.你最终可能会遇到"没有指定命令"等等...当你试图在另一台机器上加载它时.

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

  • 需要注意的是,在执行`docker save`和`docker load`之前,应该将容器提交到镜像`sudo docker commit &lt;container_id&gt; image_name` (2认同)

小智 17

从Docker文档:

docker export不导出与容器关联的卷的内容.如果卷安装在容器中现有目录的顶部,docker export则将导出基础 目录的内容,而不是卷的内容. 有关导出数据的示例,请参阅用户指南中的备份,还原或迁移数据卷.

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


Ric*_*nco 11

使用这个脚本: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
Run Code Online (Sandbox Code Playgroud)

  • 在 AWS Linux (Centos) 上对我来说不起作用。在最后,我采用了低技术方法,使用 docker 检查来查找卷目录,然后手动将其复制过来。 (2认同)