Docker 学习系列17 镜像和容器的导入导出

先说总结:
docker save保存的是镜像(image),docker export保存的是容器(container);
docker load用来载入镜像包,docker import用来载入容器,但两者都会恢复为镜像;
docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。

比如我本机上有一个 finleyma/express的镜像,容器ID为4a655b443069
使用如下命令分别导出镜像和容器
docker save -o image-express-save.tar finleyma/express
docker export -o container-express-export.tar 4a655b443069

发现如下特点:

  1. 镜像压缩包比容器要大。
  2. 目录结构不太一样
image.png
  1. 容器压缩包 是很典型的Linux目录结构,还找到当初build时被ADD进的源码文件
image.png
  1. 镜像压缩包 其实就是分层的文件系统。Docker镜像就是由这样一层曾的文件叠加起来。
    打开压缩包内的 repositories,
    内容为 {"finleyma/express":{"latest":"dda6ce6f2c43f673353e2ce232b31d11ff15b444e338a0ef8f34b6ef74093d6c"}}
    既这个镜像的名称,tag是latest,id为dda6ce6f2c43f673353e2ce232b31d11ff15b444e338a0ef8f34b6ef74093d6c
    而且tar内有相同ID的目录。
image.png

json文件的内容如下:里面记录着这一层容器文件的元信息,通过parent,还能知道依赖的上一层的文件系统是什么。

{
    "id": "dda6ce6f2c43f673353e2ce232b31d11ff15b444e338a0ef8f34b6ef74093d6c",
    "parent": "b75acde96878455ce36208008bb1143d4ea17723257c991f8bfb33ad9e27251d",
    "created": "2018-09-19T15:41:54.6130547Z",
    "container": "3cd78865317bce73179abc7d21fcbe860a96d14fc980c01566fa2c9412b17d7d",
    "container_config": {
        "Hostname": "3cd78865317b",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "ExposedPorts": {
            "8081/tcp": {}
        },
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "NODE_VERSION=8.9.4", "YARN_VERSION=1.3.2"],
        "Cmd": ["/bin/sh", "-c", "#(nop) ", "CMD [\"npm\" \"start\"]"],
        "ArgsEscaped": true,
        "Image": "sha256:91f850e6adbd56df68088dffe63c56e6f48fc24f763ff9d22c739742be71212a",
        "Volumes": null,
        "WorkingDir": "/usr/src/app",
        "Entrypoint": null,
        "OnBuild": [],
        "Labels": {}
    },
    "docker_version": "18.06.1-ce",
    "config": {
        "Hostname": "",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "ExposedPorts": {
            "8081/tcp": {}
        },
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "NODE_VERSION=8.9.4", "YARN_VERSION=1.3.2"],
        "Cmd": ["npm", "start"],
        "ArgsEscaped": true,
        "Image": "sha256:91f850e6adbd56df68088dffe63c56e6f48fc24f763ff9d22c739742be71212a",
        "Volumes": null,
        "WorkingDir": "/usr/src/app",
        "Entrypoint": null,
        "OnBuild": [],
        "Labels": null
    },
    "architecture": "amd64",
    "os": "linux"
}

打开lay.tar, 对于的原来就是当初dockerfile中的ADD . /app/

image.png

那 node_modules 跑哪了,你很快就能猜测到,肯定在上一层文件中。事实确实是这样的。ADD . /app/ 之前对于的命令是 RUN npm install

image.png

所以写dockerfile时,一行命令对于一层文件系统,要充分利用这样机制,层的数量尽可能少,只安装必要的依赖包。

参考:
https://blog.csdn.net/liukuan73/article/details/78089138
https://yeasy.gitbooks.io/docker_practice/content/appendix/best_practices.html
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 12,876评论 1 21
  • 刚开始接触Docker之后,就对容器和镜像的概念有所迷惑,上一篇也简单的说了一下之前的见解,其实并不准确,在之后的...
    冬天只爱早晨阅读 5,778评论 0 17
  • Docker值得关注的特性: o 文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。 o 资源隔离:系统...
    Anson前行阅读 4,292评论 0 2
  • 首先自我介绍。另外一个老师的介绍。 纪律强调。 介绍一下我们这节课的上课内容(动漫)。 关于动漫的介绍。什么是动漫...
    深有嘉鱼阅读 1,553评论 0 2
  • 随着越来越多的人晚上用电子设备,夜间模式变得愈加重要。 夜间模式示范 我们的目标是通过简单办法给你的UI组件添加主...
    软件iOS开发阅读 8,103评论 1 2

友情链接更多精彩内容