当前位置:

首页 > 系统应用 > Docker的镜像理解以及容器的备份、恢复和迁移操作

Docker的镜像理解以及容器的备份、恢复和迁移操作

Docker Desktop macOS版
Docker Desktop macOS版

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

立即下载
Mac 2026-10-13
数据库 编程开发 Desktop 开发工具

Docker镜像的基本知识 1.1 什么是Docker镜像 从整体上看,一个完整的Docker镜像能支撑一个Docker容器的运行,主要提供文件系统视角。比如一个ubuntu:14.04镜像,它提供了一个基本的Ubuntu 14.04发行版——注意,这个镜像并不包含操作系统Linux内核。 说到这,

Docker镜像的基本知识

1.1 什么是Docker镜像

从整体上看,一个完整的Docker镜像能支撑一个Docker容器的运行,主要提供文件系统视角。比如一个ubuntu:14.04镜像,它提供了一个基本的Ubuntu 14.04发行版——注意,这个镜像并不包含操作系统Linux内核。

说到这,得区分一下Linux内核和Ubuntu 14.04 Docker镜像的不同。传统虚拟机安装Ubuntu 14.04,会包含两部分:第一,某个Linux内核的发行版本(比如Linux 3.8);第二,特定的Ubuntu发行版(不含Linux内核,但包含软件管理方式、驱动,比如apt-get)。

理解了这些,就不难明白:为什么一个Linux内核版本为3.8的Ubuntu 14.04系统,可以把内核升级到3.18,而Ubuntu版本依然是14.04。关键在于Linux内核版本与Ubuntu操作系统发行版的区别。

Linux内核加上Ubuntu操作系统发行版,组成一台能工作的机器。那么,能不能灵活替换Ubuntu操作系统发行版呢?Docker正是利用这一点实现了——技术手段就是Docker镜像。

在Docker架构中,Docker镜像类似于“Ubuntu操作系统发行版”,可以在任何满足要求的Linux内核之上运行。简单来说,有“Debian操作系统发行版”Docker镜像、“Ubuntu操作系统发行版”Docker镜像。如果在Debian镜像里装MySQL 5.6,就可以命名为mysql:5.6镜像;如果在Debian镜像里装Golang 1.3,就命名为golang:1.3镜像。以此类推,根据安装的软件,能得到任何想要的镜像。

镜像最终的作用是什么?回到Linux内核上运行,运行时提供的环境就是容器。

以上是从宏观角度看的。再从微观角度深入:刚才说“Debian镜像中安装MySQL 5.6,就成了mysql:5.6镜像”,这里就体现了Docker镜像的层级概念。底层一个Debian操作系统镜像,上面叠加一个MySQL层,就完成了一个MySQL镜像的构建。层级概念很容易理解:Debian操作系统镜像通常被称为MySQL镜像层的父镜像。

层级管理大大方便了Docker镜像的分发与存储。说到分发,自然会想到Docker镜像的灵活性、传输便捷性和高超的移植性。Docker Hub作为全球镜像仓库,是Docker生态的数据仓库,将全世界的Docker数据汇聚在一起,是Docker生态的命脉。

Docker有两项技术非常重要:一是Linux容器方面的技术,二是Docker镜像的技术。从技术本身看,两者可复制性很强,不存在绝对的技术难点。然而Docker Hub因为积累了海量数据,其可复制性几乎不存在——这需要整个生态的营造。

1.2 Docker镜像的内容

大致了解了Docker镜像是什么,我们来看看Docker镜像里到底有什么?

在接触Docker两年多的时间里,对Docker镜像内容的认识经历了三个阶段:

第一阶段:初步接触Docker。很多人都会和我一样有一个认识:Docker镜像代表一个容器的文件系统内容。

第二阶段:初步接触联合文件系统。联合文件系统的概念让我意识到镜像层级管理的技术——每一层镜像都是容器文件系统内容的一部分。

第三阶段:研究镜像与容器的关系。容器是一个动态环境,每一层镜像中的文件属于静态内容。然而Dockerfile中的ENV、VOLUME、CMD等内容最终都要落实到容器的运行环境中,这些不可能直接坐落到每一层镜像所包含的文件系统内容里。因此,每个Docker镜像还会包含一个json文件,记录与容器之间的关系。

归纳一下:Docker镜像的内容主要包含两部分——第一,镜像层文件内容;第二,镜像json文件。

1.3 Docker镜像存储位置

镜像存储的位置,包含镜像层文件和镜像json文件。比如ubuntu:14.04镜像包含4个镜像层,在aufs存储驱动下,磁盘上的情况如下图所示:

1.3.1 查看镜像层组成

可以通过命令 docker history ubuntu:14.04 查看,结果如下:

Docker的镜像理解以及容器的备份、恢复和迁移操作

1.3.2 镜像层文件内容存储

Docker镜像层的内容一般在Docker根目录的aufs路径下,为 /var/lib/docker/aufs/diff/,具体情况如下:

Docker的镜像理解以及容器的备份、恢复和迁移操作

图中显示了镜像 ubuntu:14.04 的4个镜像层内容,以及每个镜像层内的一级目录情况。额外注意:镜像层 d2a0ecffe6fa 中没有任何内容,也就是所谓的空镜像。

1.3.3 镜像json文件存储

对于每个镜像层,Docker都会保存一份相应的json文件,存储路径为 /var/lib/docker/graph。ubuntu:14.04 所有镜像层的json文件展示如下:

Docker的镜像理解以及容器的备份、恢复和迁移操作

除了json文件,每个镜像层还包含一个layersize文件,记录镜像层内部文件内容的总大小。为给下文铺垫,下面贴出 ubuntu:14.04 中空镜像层 d2a0ecffe6fa 的json文件:

Docker的镜像理解以及容器的备份、恢复和迁移操作

Docker镜像存储就先看到这儿。Docker镜像的基本知识也告一段落。接下来进入第二部分。

Dockerfile、Docker镜像和Docker容器的关系

Dockerfile是软件的原材料,Docker镜像是软件的交付品,Docker容器则可以认为是软件的运行态。从应用软件的角度看,三者分别代表软件的三个不同阶段:Dockerfile面向开发,Docker镜像成为交付标准,Docker容器涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

简单来说:Dockerfile构建出Docker镜像,通过Docker镜像运行Docker容器。

我们可以从Docker容器的角度来反推三者的关系。先看下图:

Docker的镜像理解以及容器的备份、恢复和迁移操作

假设这个容器的镜像通过以下Dockerfile构建:

FROM ubuntu:14.04  
ADD run.sh /  
VOLUME /data  
CMD ["./run.sh"]

2.1 Dockerfile与Docker镜像

结合上图来看Dockerfile与Docker镜像的关系:

  • FROM ubuntu:14.04:设置基础镜像,使用基础镜像 ubuntu:14.04 的所有镜像层,为简单起见图中将其作为一个整体展示。
  • ADD run.sh /:将Dockerfile所在目录的 run.sh 加到镜像的根目录,新一层镜像只有一项内容:根目录下的 run.sh。
  • VOLUME /data:设定镜像的VOLUME,在容器内部路径为 /data。注意:此时并未在新一层镜像中添加任何文件,构建出的镜像层文件为空,但更新了镜像的json文件,以便通过此镜像启动容器时获取这方面信息。
  • CMD ["./run.sh"]:设置镜像的默认执行入口,同样不添加任何文件,只在上一层镜像json文件基础上更新新建镜像的json文件。

通过以上分析,这个Dockerfile构建出的新镜像包含4个镜像层,每一条命令对应一个镜像层,镜像之间存在父子关系,图中已清晰展示。

2.2 Docker镜像与Docker容器的关系

Docker镜像是Docker容器运行的基础——没有Docker镜像,就不可能有Docker容器,这也是Docker的设计原则之一。

可以这样理解:Docker镜像是静态内容;Docker容器是动态内容。动态内容很容易联想到进程、内存、CPU等,确实,Docker容器都会包含这些。

为了方便理解,可以把Docker容器看作一个或多个运行进程,这些进程占有相应的内存、CPU计算资源、虚拟网络设备以及文件系统资源。Docker容器所占用的文件系统资源,正是通过Docker镜像的镜像层文件提供的。

那么静态的镜像如何转化为动态的Docker容器?第一,转化的依据是什么?第二,谁执行这个转化?

转化的依据是每个镜像的json文件。Docker通过解析json文件,获知应该在这个镜像之上运行什么样的进程、配置什么样的环境变量,从而实现静态向动态的转变。

谁执行转化?答案是Docker守护进程。也许大家早就理解:Docker容器实质上就是一个或多个进程,而容器的父进程就是Docker守护进程。转化工作的执行就不难理解了:Docker守护进程手握镜像json文件,为容器配置相应环境,并真正运行镜像所指定的进程,完成容器创建。

容器运行起来后,镜像json文件就失去作用了。此时镜像的绝大部分作用就是:为容器提供文件系统视角,供内部进程访问文件资源。

再次回到上图,看看容器和镜像之间的一些特殊关系。之前说过Docker镜像是分层管理的,管理容器时镜像仍然是分层管理。由于动态容器中已经存在进程,进程会对文件系统视角内的文件进行读写——那么,容器会不会篡改Docker镜像的内容?

答案是不会。统一来说,所有Docker镜像层对于容器都是只读的,容器的写操作绝对不会作用在镜像中。

实现原理很重要:Docker守护进程会在镜像的最上层之上再添加一个可读写层,容器所有的写操作都作用在这一层。如果容器需要写底层镜像中的文件,就会涉及Copy-on-Write机制(aufs等联合文件系统保证):先将文件从镜像层拷贝至最上层的可读写层,然后容器进程对副本进行写操纵。对于容器进程来说,它只能看到最上层的文件。

最后再说一个点:Docker容器的文件系统视角中,是不是存在一些内容不是存储在Docker镜像里的?

答案是肯定的。

再次重申,Docker镜像中存储的都是静态文件,原则上应该与容器具体信息、主机信息完全解耦。容器中不存在于镜像中的内容主要有以下几点:

  • /proc 以及 /sys 等虚拟文件系统的内容
  • 容器的hosts文件、hostname文件以及resolv.conf文件——这些是具体环境的信息,原则上不应该被打入镜像
  • 容器的Volume路径,这部分视角来源于从宿主机上挂载到容器内部的路径
  • 部分设备文件

Docker中容器的备份、恢复和迁移

1. 备份容器

首先,为了备份Docker中的容器,需要看看想要备份的容器列表。在运行着Docker引擎、已创建容器的Linux机器中运行 docker ps 命令:

# docker ps

Docker的镜像理解以及容器的备份、恢复和迁移操作

选择要备份的容器,创建该容器的快照。使用 docker commit 命令创建快照:

# docker commit -p 30b8f18f20b4 container-backup

Docker的镜像理解以及容器的备份、恢复和迁移操作

该命令会生成一个作为Docker镜像的容器快照,可以通过 docker images 查看:

# docker images

Docker的镜像理解以及容器的备份、恢复和迁移操作

现在有两个选择:一是登录Docker注册中心并推送该镜像;二是将镜像打包成tar包备份,供今后使用。

如果要上传或备份镜像到Docker注册中心,运行 docker login 登录,然后推送:

# docker login

Docker的镜像理解以及容器的备份、恢复和迁移操作

# docker tag a25ddfec4d2a arunpyasi/container-backup:test
# docker push arunpyasi/container-backup

Docker的镜像理解以及容器的备份、恢复和迁移操作

如果不想备份到注册中心,而是保存在本地机器中,可以打包成tar包:

# docker sa ve -o ~/container-backup.tar container-backup

Docker的镜像理解以及容器的备份、恢复和迁移操作

验证tar包是否生成,在保存目录中运行 ls 即可。

2. 恢复容器

如果已经在注册中心推送了镜像,只需拉回并直接运行:

# docker pull arunpyasi/container-backup:test

Docker的镜像理解以及容器的备份、恢复和迁移操作

如果镜像作为tar包文件备份到了本地,使用 docker load 命令加载:

# docker load -i ~/container-backup.tar

确保镜像加载成功,运行 docker images:

# docker images

镜像加载后,用该镜像运行容器:

# docker run -d -p 80:80 container-backup

Docker的镜像理解以及容器的备份、恢复和迁移操作

3. 迁移Docker容器

迁移容器同时涉及备份和恢复。可以将任意Docker容器从一台机器迁移到另一台机器。过程是:先将容器备份为Docker镜像快照,然后该镜像或者推送到Docker注册中心,或者作为tar包文件保存到本地。如果推送到注册中心,只需在任何想要的机器上使用 docker run 恢复并运行。如果打包成tar包,只需拷贝或移动到目标机器,加载镜像并运行容器即可。

尾声

至此,我们已经学习了如何快速备份、恢复和迁移Docker容器。本教程适用于各个可以成功运行Docker的操作系统平台。Docker是一个相当简单易用、功能却十分强大的工具,命令简短且易记,带有许多简单而强大的标记和参数。上述方法让备份容器变得安逸,日后可以轻松恢复它们——即便主机系统崩溃甚至被意外清除,也能恢复容器和镜像。如果你还有很多问题、建议、反馈,欢迎在下面的评论框中写出来,帮助我们改进或更新。谢谢大家!享受吧 :-)

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
系统应用 容器 Docker 镜像
相关文章 更多
maven配置镜像和仓库区别及正确配置方法
maven配置镜像和仓库区别及正确配置方法

详细介绍 Maven 配置镜像与仓库的区别以及正确的配置步骤,帮助读者快速掌握实践操作。

docker容器自动重启怎么解决 排查原因与修复方法
docker容器自动重启怎么解决 排查原因与修复方法

遇到Docker容器频繁自动重启?本文提供从查看容器日志、解读退出代码到配置Restart Policy的完整排查与修复方案,确保服务稳定性。

docker挂载目录教程详解本地目录映射方法
docker挂载目录教程详解本地目录映射方法

遇到Docker容器重启后数据丢失?本文手把手教你如何使用-v参数将本地目录映射到容器内部,解决数据持久化难题,并附带权限错误排查技巧。

飞牛音乐服务器连接失败原因排查及解决教程
飞牛音乐服务器连接失败原因排查及解决教程

遇到飞牛NAS音乐服务无法连接?本文提供详细的界面操作指引,涵盖服务启用检查、端口与防火墙设置、媒体库索引状态确认及客户端配置修正,助你快速恢复音乐播放。

docker 安装 hermes agent完整部署安装教程
docker 安装 hermes agent完整部署安装教程

本文详细介绍如何使用 Docker 部署 Hermes Agent,涵盖镜像获取、配置文件挂载、网络设置及常见故障排查,帮助开发者实现快速、干净的服务接入。

skyvern官网入口及中文版使用教程
skyvern官网入口及中文版使用教程

Skyvern是一款基于大语言模型的开源浏览器自动化框架,目前仅提供英文界面且无官方中文版。本文指导用户通过GitHub获取源码,使用Docker快速部署本地环境,并解释其如何通过DOM树解析与自然语言指令实现网页自动操作,同时提供针对中文用户的配置建议与替代方案。

docker 容器无法启动的配置检查命令及排查方法
docker 容器无法启动的配置检查命令及排查方法

当 Docker 容器启动后立即退出时,不要盲目重启。本文详解如何通过 docker logs 查看标准输出错误,利用 docker inspect 检查挂载与网络配置,并修正入口点脚本权限问题,提供一套高效的因果排查流程。

NAS硬盘一直转正常吗怎么办?持续运转原因及解决方法
NAS硬盘一直转正常吗怎么办?持续运转原因及解决方法

NAS硬盘一直转动是否正常?本文深入分析导致硬盘无法进入休眠状态的四大核心原因,包括系统索引、第三方应用干扰及网络协议机制,提供可操作的排查与优化方案。

Docker Compose 健康检查实战:用 service_healthy 消除启动竞态
Docker Compose 健康检查实战:用 service_healthy 消除启动竞态

解决容器已运行但应用不可用的问题。通过配置 healthcheck 探针和 depends_on service_healthy 条件,确保服务在依赖真正就绪后才启动。包含参数详解、YAML 配置示例及故障排查步骤。

php 升级php5.5 、php7
php 升级php5.5 、php7

升级 PHP 7 在实际运维中是个常见需求,但不同环境、不同版本之间切换,坑也不少。这里整理了两条比较典型的路:一条是源码编译安装,一条是直接用第三方 YUM 源替换。两种方式各有优劣,下面把关键步骤和踩过的坑都列出来,方便以后快速复用。 方法一:通过 Webtatic 源安装 PHP 5.5(过渡

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
PixPix 网页版
PixPix 网页版
Windows

PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。

Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

即将离开本站
您即将前往第三方网站,请确认是否继续?