1,了解容器

    容器相当于是运行一个镜像的实例。
    Docker 使用一个叫做 UnionFS 的层级文件系统进行镜像操作。容器对镜像文件的所有操作均是在虚拟出的“读写层”上进行的。当然对容器而言,UnionFS 和普通的文件系统并无差别,也无法看到任何“读写层”。
    每次运行 docker run 命令的时候,Docker 都会指定新建容器。使用docker start/stop/restart的时候,会启动、停止和重启已经创建的容器。
    当一个容器运行完之后,会自动退出。

    2,将容器创建新的镜像

    使用docker commit指令,可以将已存在的容器并且针对改动过的内容生成新的镜像,并且作为该镜像新的版本。我们可以将新创建的镜像放在registry保存。
    注意:在使用docker commit指令时,运行中的容器默认会在这期间暂停运行。

    3,迁移容器

    docker export与docker import指令用于容器进行持久化备份和还原;docker save与docker load指令用于当前镜像进行持久化备份和还原。将容器导出后再导入(exported-imported)后的容器会丢失所有的历史,而保存再加载(saved-loaded)的镜像则没有丢失历史和层,这意味着后者可以通过docker tag命令实现层回滚。它们最后持久化都会生成一个tar文件。

    1,docker export命令导出容器
    Docker server接受到相应的HTTP请求后,会通过deamon实例调用ContainerExport方法来镜像具体的操作:
    1,根据命令行参数(容器名称)找到待导出容器中的所有数据
    2,对该容器调用container.Export()函数导出容器中的所有数据,包括:
    挂载待导出容器的文件系统;
    打包该容器basefs(即graphdriver上的挂载点)下的所有文件。
    返回打包文档的结果并卸载该容器
    3,强导出的数据回写到HTTP请求应答中

    2,docker save 命令保存镜像
    根据待处理的容器数目发送不同格式的HTTP请求,分别为/images/get与/images/{name:.*}/get,前者对应数量为1的情况,后者读研数量大于1的情况。
    Docker client发来的以上两种请求均由getImagesGetHandler处理,该Handler调用ImageExport函数镜像具体处理。
    CmdImageExport函数负责查询到所有被要求export的镜像ID,并调用exportImage函数。如果用户没有指定镜像标签,则导出该repository下所有的镜像。另外,还会被导出的repository的名称、标签及ID信息以JSON格式写入到名为repositories的文件中。最后执行文件压缩并写入到输出流。
    exportImage函数是一个for循环,将各个依赖layer进行export工作,及从顶层layer、其父layer及至base layer。具体如下:
    1,为每个被要求导出的镜像创建一个文件夹,以其镜像ID命名。
    2,在该文件夹下创建VERSION文件,写入”1.0”。
    3,在该文件夹下创建json文件,在该文件中写入进行的元数据信息,包括镜像ID、父镜像ID、以及对
    应的Docker容器ID等。
    4,在该文件夹下创建layer.tar文件,压缩镜像的filesystem。该过程的核心函数为TarLayer,对存储
    进行的diff路径中的文件进行打包。
    5,对该layer的父layer执行下一次循环。

    补充:备份后的进行可以上传至registry,也可以保存到本地。