当前位置: 首页 > 科技观察

如何将Docker容器复制-传输到另一台主机?

时间:2023-03-20 15:34:33 科技观察

【.com速译】因为Docker容器是一个小软件盒子,你可以从一台电脑复制传输到另一台电脑。然而,这并不经常被讨论,可能是因为大型企业构建自己的存储库,可以定制自己的图像,并在他们认为合适的时候将它们分发到服务器上。但如果您只是偶尔需要移动一个或多个容器,则没有必要搞得这么复杂。您可能正在本地计算机上使用Docker实例,并决定将其移动到功能更强大的服务器上。或者您可能只想在多台机器上部署自定义容器,“复制粘贴”容器。其他时候,您可能对您的云计算供应商不满意并想换到另一个供应商。无论如何,都有一个简单的过程,详见下文。从源主机保存容器镜像不需要先停止容器,但强烈建议这样做。您将拍摄Docker实例中数据的快照。如果执行此操作时实例正在运行,则最终出现在快照中的某些文件可能不完整。假设有人上传了一个500MB的文件。上传250MB后,您发出dockercommit命令。然后继续上传,但是当您在另一台主机上恢复该Docker映像时,500MB中只有250MB可用。因此,如果可以,请先停止实例。dockerstopNAME_OF_INSTANCEDocker容器是从普通的初始化映像构建的。随着时间的推移,您将自己的更改添加到此基础映像。在容器内运行的进程也可以保存自己的数据或进行其他更改。要保留所有这些,您可以将此新状态提交给新图像。请注意,如果实例当前正在运行,此操作将暂停实例,同时保存其内容。如果将大量数据添加到容器中,此操作可能需要很长时间才能完成。如果这是一个问题,您可以通过键入dockercommit-p=falseNAME_OF_INSTANCEmycontainerimage而不是下一个命令来避免此暂停。但是,除非绝对必要,否则不要这样做。在这种情况下,创建具有不一致/不完整数据的图像的可能性会增加。在本教程中,为生成的图像选择了一个通用名称:mycontainerimage。如果愿意,您可以更改此名称。如果更改名称,请记住在遇到它的所有后续命令中替换它。dockercommitNAME_OF_INSTANCEmycontainerimage现在,将这个图像保存到一个文件中,并压缩它。dockersavemycontainerimage|gzip>mycontainerimage.tar.gz接下来,使用您喜欢的文件传输方法,将mycontainerimage.tar.gz复制到您要将容器迁移到的主机。在目标主机上加载容器镜像登录到您已将镜像传输到的主机后,将其导入Docker。gunzip-cmycontainerimage.tar.gz|dockerload因为你从来没有在这里初始化容器,你还不能用dockerstart启动它。相反,您发出与过去第一次运行Docker实例时使用的命令相同的命令。现在唯一的区别是您最终将使用“mycontainerimage”而不是您过去使用的任何图像。下一个命令只是一个例子;不要复制粘贴它,除非它适合你。(第一次运行镜像不需要特殊参数)dockerrun-d--name=PICK_NAME_FOR_CONTAINERmycontainerimage相反,在下面的命令示例中,需要参数--publish将主机上的端口80转发到端口上的端口80container:dockerrun-d--name=http-server--publish80:80mycontainerimage之后,可以使用dockerstop和dockerstart命令正常停止和启动容器。在不创建文件的情况下传输图像有时您可能希望跳过创建mycontainerimage.tar.gz文件。也许你没有足够的磁盘空间,因为容器里面有很多数据。您可以使用单个命令在目标主机上保存、压缩、传输和解压缩图像,以及挂载图像。运行前面讨论的dockercommit命令后,您可以使用:dockersavemycontainerimage|gzip|sshroot@203.0.113.1'gunzip|dockerload'它应该也适用于Windows,因为现在有一个内置的SSH客户端(不再需要PuTTY).然后,继续使用适用于您情况的dockerrun命令。结论作为偶尔移动容器的临时解决方案,dockersave和dockerload很棒。但请记住,如果您经常移动容器,您可能应该构建自己的专有库。原标题:HowtoCopy/MoveaDockerContainertoAnotherHost,作者:AlexandruAndrei