最近需要将一台服务器上的应用和数据迁移到另一台服务器上,由于全部使用了 Docker 部署,所以水篇文章


注:作者写这篇文章的时候对Docker的认知和学习还不够深入,这篇文章是有一定问题的:

实际上,不应该用 commit 来而应该用 Dockerfile 定制镜像。commit 的应用大多数在保存入侵现场等场景上。而Docker容器本身应该是无状态的,通过数据卷存储所有数据,迁移只需要在另一台服务器上通过一样的镜像启动容器,迁移数据卷即可

大多数情况下也不建议使用 commitcommit 会在原有镜像上叠加修改后的容器存储层构建成新的镜像,了解Docker分层存储概念的就会知道,这样造成的问题就是日后的每一次修改都会添加一层,而且就算把之前层的操作、产生的文件删除、复原了,也无法删除这一层,会像滚雪球一样致镜像极度臃肿,而且由于命令的执行,实际上有大量无关内容被添加进来,进一步加剧这个问题。此外,通过 commit 构建的镜像到底执行过什么操作,无从得知,成为一个黑箱镜像。这种镜像难以维护


1. 通过云端仓库迁移

1.1 备份容器

首先将容器进行备份,创建一个新的镜像(commit 会将对容器的变更保存下来,生成新的镜像):

docker commit 容器ID 备份后的镜像名:标签

1.2 将容器推送到云端仓库

登录 docker 仓库(阿里云有免费的)

docker login 地址

标记镜像到仓库(重命名)

docker tag 镜像ID 仓库/名称:标签

推送镜像

docker push 仓库/名称:标签

1.3 拉取镜像并部署

从云端仓库拉取镜像

docker pull 仓库/名称:标签

从镜像启动容器

docker run 仓库/名称:标签

2. 通过镜像文件迁移

2.1 备份容器

首先将容器进行备份,创建一个新的镜像:

docker commit 容器ID 备份后的镜像名:标签

2.2 导出为文件

将镜像打包为 tar 文件

docker save -o 目录 镜像

2.3 导入镜像

将 tar 传输到另一台服务器后,导入 tar 包

docker load -i tar文件

然后启动镜像即可

docker run 镜像