Skip to content

Docker 镜像和容器的迁移

镜像迁移

当容器运行一段时间后,产生了一些系统数据,这时候想要迁移整个容器和数据。

旧服务器导出镜像

shell
# 根据容器创建新镜像
docker commit jenkins jenkins:v1
# 导出镜像
docker save -o jenkins_image.tar jenkins:v1

新服务器导入镜像

shell
# 新环境中导入镜像
docker load -i jenkins_image.tar

docker run -d --restart=always --name=jenkins -p 8080:8080 jenkins:v1

至此,迁移完成。

后面的教程仅供参考,个人实战有些问题,网上的博客真是害人不浅!

Docker save、load、export、import

Docker 镜像的导入导出,用于迁移、备份、升级等场景。涉及的命令有 save、load、export、import,分为 2 类,一个是拷贝容器,一个是拷贝镜像,不要混用。

  • 镜像导入是一个复制的过程;容器的导入是将当前容器变成一个新的镜像;
  • docker save 命令保存的是镜像;docker export 命令保存的是容器;
  • export 命令导出的 tar 文件略小于 save 命令导出的;
  • export 命令导出的是容器,export 导出的文件在 import 导入时,无法保留镜像的所有历史(即每一层 layer 信息),也就不能进行回滚操作。而 save 命令导出的是镜像,所以导入时可以完整保留每一层 layer 信息。docker history 镜像 id 命令可以查询每一层 layer 信息。
  • load 命令不能对镜像重命名;import 命令可以对镜像重命名;

可以依据具体使用场景来选择命令:

  • 若是只想备份 images,使用 save、load 即可
  • 若是在启动容器后,容器内容有变化,需要备份,则使用 export、import

拷贝镜像(未测试)

shell
# save 命令:保存镜像到本地
docker save [options] images [images...]

# 示例
docker save -o nginx_image.tar nginx:latest
# 或
docker save > nginx_image.tar nginx:latest

其中 -o> 表示输出到文件,nginx_docker_image.tar 为目标文件,nginx:latest 是源镜像名(name:tag)

shell
# load 命令:从本地文件加载镜像到 docker
docker load [options]

# 示例
docker load -i nginx_image.tar
# 或
docker load < nginx_image.tar

其中 -i< 表示从文件输入。会成功导入镜像及相关元数据,包括 tag 信息

拷贝容器(自己测试导入后无法启动!)

shell
# 先记录下来容器的启动命令,后面导入时需要。
docker ps --no-trunc -a
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
34b6a2ac2b46nginx:1.27.0"/docker-entrypoint.sh nginx -g 'daemon off;'"5 minutes agoUp 5 minutes0.0.0.0:80->80/tcpnginx
shell

# 记录下来【COMMAND】这一列的值。比如:/docker-entrypoint.sh nginx -g 'daemon off;'

# export 命令:导出容器到本地
docker export [options] container

# 示例
docker export -o nginx_container.tar nginx

其中 -o 表示输出到文件,nginx_container_backup.tar 为目标文件,nginx 是源容器名(name)

shell
# import 命令:从本地文件导入容器到 docker
docker import [options] file|URL|- [REPOSITORY[:TAG]]

# 示例
docker import nginx_container.tar nginx:v1

使用 docker images 命令可以查看是否导入成功,导入成功就可以根据镜像运行容器

导入从容器导出的镜像后,现在它就是一个镜像了,启动则需要根据具体的启动参数来启动,比如:

shell
# 最后面的是导出容器前,记录下来【COMMAND】这一列的值。
# 如果容器没加【COMMAND】的话,会报错:docker: Error response from daemon: No command specified.
docker run -d -p 80:80 --restart=always --name=nginx nginx:v1 nginx -g 'daemon off;'

docker run -d -p 80:80 --restart=always --name=nginx nginx:v1 /docker-entrypoint.sh nginx -g 'daemon off;'