问题描述
有一个由两个容器组成的论坛应用程序:一个用于数据库,另一个用于公告板应用程序本身。这两个容器在同一主机上运行了相当长的时间。该应用程序不遵循“微服务”架构,因为数据库文件存储在数据库容器的可写层中。论坛的配置设置直接设置在公告板应用程序的可写层中。
由于当前服务器已经到达生命周期的尽头,我们希望将该论坛迁移到不同的主机。我们看到有两种方法可以实现:
- 使用
docker commit
将两个容器制作成镜像,然后将这些镜像上传到仓库,并从新主机上拉取它们。 - 使用
docker export
创建容器文件系统的归档,并在新主机上导入它们。
对于临时容器迁移,这两种方法的优缺点是什么?是否有更适合我们特定需求的解决方案?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1:使用docker commit
和docker save
进行容器迁移
根据您的需求,只需使用docker commit
将容器提交为新的镜像,然后使用docker save
将镜像保存为归档文件,最后在新主机上使用docker load
和docker run
来运行它。
以下是具体步骤:
1. 在当前主机上使用docker commit
命令将容器提交为新的镜像。假设容器名称为CONTAINER
,您可以使用以下命令:
docker commit CONTAINER name:tag
这将创建一个名为name:tag
的新镜像。
使用
docker save
命令将镜像保存为归档文件。假设您要将归档文件保存为archive.tar.gz
,您可以使用以下命令:
docker save name:tag | gzip > archive.tar.gz
这将创建一个名为archive.tar.gz
的归档文件。将归档文件传输到新主机。您可以使用
scp
命令将归档文件传输到新主机的根目录下:
scp archive.tar.gz root@new:.
在新主机上使用
docker load
命令加载归档文件,并使用docker run
命令运行容器。假设您已经将归档文件保存在新主机的根目录下,您可以使用以下命令:
docker load < archive.tar.gz
docker run name:latest
这将加载归档文件中的镜像,并在新主机上运行容器。
请注意,为了保留归档文件中的标签,保存镜像时使用了name:tag
而不是容器的ID。
方案2:使用docker export
和docker import
进行容器迁移
使用docker export
和docker import
命令可以创建容器文件系统的归档,并在新主机上导入它们。但需要注意的是,docker export
只会保存容器文件系统,不会保存元数据,如默认命令。因此,在新主机上导入归档文件时可能会遇到一些问题。
以下是具体步骤:
1. 在当前主机上使用docker export
命令创建容器文件系统的归档文件。假设容器名称为CONTAINER
,您可以使用以下命令:
docker export CONTAINER > container.tar
这将创建一个名为container.tar
的归档文件。
将归档文件传输到新主机。您可以使用
scp
命令将归档文件传输到新主机的根目录下:
scp container.tar root@new:.
在新主机上使用
docker import
命令导入归档文件,并使用docker run
命令运行容器。假设您已经将归档文件保存在新主机的根目录下,您可以使用以下命令:
docker import container.tar name:tag
docker run name:latest
这将导入归档文件中的容器文件系统,并在新主机上运行容器。
请注意,使用docker export
和docker import
命令进行容器迁移时,可能会丢失一些元数据,如默认命令。因此,这种方法可能不适用于所有情况。
方案比较
方案1使用docker commit
和docker save
命令进行容器迁移,可以保留镜像的所有元数据,并且在新主机上运行容器非常简单。但是,这种方法需要上传和下载镜像,可能会占用更多的网络带宽和存储空间。
方案2使用docker export
和docker import
命令进行容器迁移,可以创建容器文件系统的归档文件,并在新主机上导入它们。但是,这种方法可能会丢失一些元数据,如默认命令,导致在新主机上运行容器时出现问题。
根据您的需求和具体情况,您可以选择适合您的方案进行容器迁移。
以上是针对临时容器迁移的两种常见方法,根据您的具体需求选择适合您的方法即可。