架构师修炼之微服务部署 - 深入理解Docker镜像
镜像简介
它是一个创建Docker 容器的只读模板,通过DockerFile可以自定义镜像。
它也是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Dockerfile简介
Dockerfile是一个文本文件,其内包含了创建镜像(image)所需要的所有指令(Instruction)。使用docker build有序的执行文件中每一条指令,每一条指令构建一层,构建的层通过UnionFS组合起来形成一个只读的镜像。
UnionFS简介
它是一个Linux和FreeBSD的文件系统服务。通过它可以将多个不同文件系统(含文件或者目录)组合形成一个虚拟的文件系统。
比如: test1和test2两个文件夹,各个文件夹下有各自的文件。
test1/n
test1/b
test2/l
test2/f
通过UnionFS虚拟成test文件夹之后,表面上会变成如下样子。
test/n
test/b
test/l
test/f
它有一个很重要的特性:Copy on write
比如:把changed、test1、test2三个文件夹虚拟组合成test文件夹。虚拟组合时指定changed读写权限、test1与test2只读权限。
├── changed
├── test
│ ├── n
│ ├── b
│ ├── l
│ └── f
├── test1
│ ├── n
│ └── b
└── test2
├── l
└── f
如果对 test/f 文件进行修改,将会复制 f 文件到具备读写权限的changed文件夹,而原始的 test2/f 不会更新。
├── changed
│ └── f #复制创建
├── test
│ ├── n
│ ├── b
│ ├── l
│ └── f #更新
├── test1
│ ├── n
│ └── b
└── test2
├── l
└── f #不更新
镜像与容器关系
使用UnionFS与Copy on write特性之后,容器与镜像的关系如下:
只读镜像层的数据更新时,就会复制数据到可读写操作的容器层。这个复制处理的具体操作依赖系统选择的Storage Driver。
Storage Driver列表:
- overlay2, overlay
- aufs
- btrfs
- devicemapper
- vfs
- zfs
由上可以知道,由于共用了只读镜像层,从而缩小了容器的大小,加快了启动速度。
镜像内部分层结构
举个例子看看镜像里头分层情况。
第一步:创建DockerFile,内容如下
FROM centos:7
执行docker build:
D:\docker\00-basic>docker build -t centos7 .
Sending build context to Docker daemon 2.048kB
Step 1/1 : FROM centos:7
7: Pulling from library/centos
ab5ef0e58194: Pull complete Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c
Status: Downloaded newer image for centos:7
---> 5e35e350aded
Successfully built 5e35e350aded
Successfully tagged centos7:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
查看镜像分层构造:
D:\docker\00-basic>docker history centos7
IMAGE CREATED CREATED BY SIZE COMMENT
5e35e350aded 5 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 5 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 5 months ago /bin/sh -c #(nop) ADD file:45a381049c52b5664… 203MB
第二步:修改DockerFile内容如下。
FROM centos:7
RUN echo "Hello world" > /tmp/newfile
执行docker build:
D:\docker\00-basic>docker build -t centos7 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos:7
---> 5e35e350aded
Step 2/2 : RUN echo "Hello world" > /tmp/newfile
---> Running in 8bd61ed2d5e7
Removing intermediate container 8bd61ed2d5e7
---> cdbbf869ca90
Successfully built cdbbf869ca90
Successfully tagged centos7:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
查看镜像分层构造:
D:\docker\00-basic>docker history centos7
IMAGE CREATED CREATED BY SIZE COMMENT
cdbbf869ca90 About a minute ago /bin/sh -c echo "Hello world" > /tmp/newfile 12B
5e35e350aded 5 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 5 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 5 months ago /bin/sh -c #(nop) ADD file:45a381049c52b5664… 203MB
对比两次的分层结构,就可以知道第二步只在第一步的基础上加了一个12B的分层。
从而可以推导出:Docker 为了加速镜像构建、重复利用资源,会利用这些中间层镜像。
镜像优化
知道镜像内部分层之后,我们就可以做一些处理来优化我们的镜像。
- 由于镜像每层是只读的,构建之后无法改变。所以在构建这一层时创建的临时文件,也需要在这一层进行删除,后续层中做的删除只是表面效果。
优化前:
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
优化后:
FROM ubuntu:18.04
RUN apt-get update && apt-get clean && rm -rf /var/lib/apt/lists/*
- 对于已经没有任何依赖的中间层镜像进行删除。
架构师修炼之微服务部署 - 深入理解Docker镜像的更多相关文章
- 架构师修炼之微服务部署 - Docker简介
Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是 ...
- 罗辑思维首席架构师:Go微服务改造实践
转自:http://www.infoq.com/cn/news/2018/05/luojisiwei 方圆 曾先后在 Cisco,新浪微博从事基础架构研发工作.十多年一直专注于后端技术的研发,在消息通 ...
- 阿里P7架构师详解微服务链路追踪原理
背景介绍 在微服务横行的时代,服务化思维逐渐成为了程序员的基本思维模式,但是,由于绝大部分项目只是一味地增加服务,并没有对其妥善管理,当接口出现问题时,很难从错综复杂的服务调用网络中找到问题根源,从而 ...
- Atitit.架构设计趋势 设计模式 ---微服务架构 soa
Atitit.架构设计趋势 设计模式 ---微服务架构 soa 什么是微服务架构?1 .微服务与SOA的关系 :微服务架架构师面向服务架构(SOA)的一种特定实现1 微服务与康威定律2 微服务的一些 ...
- Chris Richardson微服务翻译:微服务部署
Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服务部署( ...
- Docker 系列七(Dubbo 微服务部署实践).
一.前言 之前我们公司部署服务,就是大家都懂的那一套(安装JDK.Tomcat —> 编译好文件或者打war包上传 —> 启动Tomcat),这种部署方式一直持续了很久,带来的问题也很多: ...
- docker微服务部署之:六、Rancher管理部署微服务
docker微服务部署之:五.利用DockerMaven插件自动构建镜像 一. 什么是Rancher Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源 ...
- 中小型研发团队架构实践三:微服务架构(MSA)
一.MSA 简介 1.1.MSA 是什么 微服务架构 MSA 是 Microservice Architect 的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相 ...
- Re:从 0 开始的微服务架构--(四)如何保障微服务架构下的数据一致性--转
原文地址:http://mp.weixin.qq.com/s/eXvoJew3bjFKzLLJpS0Otg 随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台.就像前边的文章说的, ...
随机推荐
- 使用tensorflow实现cnn进行mnist识别
第一个CNN代码,暂时对于CNN的BP还不熟悉.但是通过这个代码对于tensorflow的运行机制有了初步的理解 ''' softmax classifier for mnist created on ...
- iOS 图片圆角性能
通常设置圆角方式 imageView.clipsToBounds = YES; imageView.layer.cornerRadius = 50; 这样设置会触发离屏渲染,比较消耗性能.比如当一个页 ...
- ICPC训练周赛 Benelux Algorithm Programming Contest 2019
D. Wildest Dreams 这道题的意思是Ayna和Arup两人会同时在车上一段时间,在Ayna在的时候,必须单曲循环Ayna喜欢的歌,偶数段Ayna下车,若此时已经放了她喜欢的那首歌,就要将 ...
- EXPLAIN 查看 SQL 执行计划
EXPLAIN 查看 SQL 执行计划.分析索引的效率: id:id 列数字越大越先执行: 如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. ...
- PHP序列化及反序列化分析学习小结
PHP反序列化 最近又遇到php反序列化,就顺便来做个总结. 0x01 PHP序列化和反序列化 php序列化:php对象 序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性.序 ...
- Java IO流的写入和写出操作 FileInputStream和FileOutputStream
今天学习了Java的IO流,关于文件的读入和写出,主要是FileInputStream和FileOutputStream来实现,这两个流是字节流.还有字符流(FileReader和FileWriter ...
- 并发——详细介绍CAS机制
一.前言 今天花了点时间了解了一下JDK1.8中ConcurrentHashMap的实现,发现它实现的主要思想就是依赖于CAS机制.CAS机制是并发中比较重要的一个概念,所以今天这篇博客就来详细介 ...
- Java中的get()方法和set()方法
在Java中,为了数据的安全,换句话说就是为了隐藏你的代码的一些实现细节,我们会用private来修饰属性,使用private修饰的属性就不能被其他类直接访问了,想要访问就需要通过set.get方法: ...
- mpvue怎么使用iconfont
原文链接:https://blog.csdn.net/weixin_39818813/article/details/80695750 1.首先去阿里巴巴矢量图标库区把你要图标加到购物车 阿里巴巴矢量 ...
- Git应用详解第六讲:Git协作与Git pull常见问题
前言 前情提要:Git应用详解第五讲:远程仓库Github与Git图形化界面 git除了可以很好地管理个人项目外,最大的一个用处就是实现团队协作开发.况且,linus大神开发git的初衷就是为了维护L ...