04-Docker 容器镜像持久化

官方文档:https://docs.docker.com/reference/

export、import 容器持久化为文件

export 对当前的容器状态建立快照,并持久化为 tar 文件

官方文档:https://docs.docker.com/engine/reference/commandline/export/

1
docker export 容器ID > container.tar            # 导出容器 container.tar,相当于快照

注意:使用 export 会把之前分层的镜像合并成,变的只剩一层镜像

import 导入镜像

官方文档:https://docs.docker.com/engine/reference/commandline/import/

语法

1
2
3
4
5
6
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

OPTIONS:
--change,-c:Apply Dockerfile instruction to the created image
--message,-m:Set commit message for imported image
--platform:API 1.32+ Set platform if server is multi-platform capable

示例

1
2
docker import container.tar test/ubuntu       # 导入镜像,镜像名字为test/ubuntu,load不可以指定名字
cat container.tar| docker import - test/ubuntu # 导入镜像,镜像名字为test/ubuntu,load不可以指定名字

适用场景和注意事项

适用场景

主要用来制作基础镜像,比如从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后把这个镜像分发给其他人使用,作为基础的开发环境。(因为export 导出的镜像只会保留从镜像运行到 export 之间对文件系统的修改,所以只适合做基础镜像)

注意事项

  • 会丢弃历史记录和元数据。
  • 启动 export 与 import 命令导出导入的镜像必须加 /bin/bash 或者其他 /bin/sh,否则会报错。
  • docker export 导出的镜像是不带历史记录的,如果原本的镜像有3层,export 之后只会有1层,这一层为从镜像运行到 export 之间对文件系统的修改。
  • 可以使用 docker history ImageName/ImageID 查看镜像,只有一层。

save、load 镜像持久化为文件

save 对当前的镜像进行持久化,形成 tar 文件

官方文档:https://docs.docker.com/engine/reference/commandline/save/

1
docker save -o image.tar 镜像ID   # 将一个镜像导出为文件,会保存镜像的所有记录

使用 save 持久化镜像,镜像的层数不变

压缩的方式打包

1
docker save myimage:latest | gzip > myimage_latest.tar.gz

load 加载 tar 文件为镜像

官方文档:https://docs.docker.com/engine/reference/commandline/load/

1
2
docker load --input image.tar    # 导入image.tar到本地镜像,import可以指定名字
docker load < image.tar # 导入image.tar到本地镜像,import可以指定名字

适用场景

生产环境没有外网,在本机将镜像打包成 tar。拷贝到生产环境,再通过 docker push到生产环境本地镜像仓库。

commit 把当前容器变为镜像

commit 官方文档:https://docs.docker.com/engine/reference/commandline/commit/

commit 把当前容器的内容新建一个层文件,覆盖在旧的镜像文件层之上

语法

1
2
3
4
5
6
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

-a, --author="" # 作者
-c, --change="" # 使用dockerfile指令来创建镜像,-c 可以指定dockerfile 的很多参数,如 -c "CMD ["/bin/bash"]"-c='ENTRYPOINT ["python", "run.py"]'
-m, --message="" # 注释
-p # 在commit的时候,将正在运行的容器暂停

适用场景

主要作用是将配置好的一些容器复用,再生成新的镜像。

注意事项

commit是一个综合性的命令,它主要做了:

  • 将container当前的读写层保存下来,保存成一个新层
  • 和镜像的历史层一起合并成一个新的镜像
  • 如果原本的镜像有3层,commit之后就会有4层,最新的一层为从镜像运行到commit之间对文件系统的修改。

总结

  • commit+save 模式:保留了一个镜像的所有历史文件和元数据,它把容器的内容作为一个新的层覆盖在原有镜像之上,然后实现持久化。原有的镜像没有改变。

    这样的好处是,当发现这个commit+save的镜像包有问题的时候,可以快速回滚到之前的镜像版本。

  • export 模式:打扫干净屋子再请客。把之前镜像的层级删干净,只保留最新的快照文件。

    这种情况适用于不需要回滚,当前的状态即是最佳状态的时候。这样做的好处是,删除了没有用处的历史数据,同时保留了镜像具有的所有功能,关键是镜像文件还小的很。


04-Docker 容器镜像持久化
https://flepeng.github.io/042-云原生-01-Docker-21-命令-04-Docker-容器镜像持久化/
作者
Lepeng
发布于
2023年3月4日
许可协议