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 ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
34b6a2ac2b46 | nginx:1.27.0 | "/docker-entrypoint.sh nginx -g 'daemon off;'" | 5 minutes ago | Up 5 minutes | 0.0.0.0:80->80/tcp | nginx |
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;'