镜像简介
它是一个创建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.架构设计趋势 设计模式 ---微服务架构&#160;&#160;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 随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台.就像前边的文章说的, ...
随机推荐
-
【转】Apache 配置虚拟主机三种方式
Apache 配置虚拟主机三种方式 原文博客http://www.cnblogs.com/hi-bazinga/archive/2012/04/23/2466605.html 一.基于IP 1. 假 ...
-
使用Node.JS访问Hyperledger Fabric的gRPC服务
在即将正式发布的Hyperledger Fabric SDK 1.0中,Hyperledger Fabric通过gRPC提供服务接口以取代现有的REST API.本文介绍了如何使用Node.JS访问H ...
-
Java基础知识强化42:StringBuffer类之StringBuffer的截取功能
1. StringBuffer的截取功能: public String subString(int Start): public String subString(int Start, int end ...
-
Android WebView中显示一张或多张图片
最近需要在平板中显示多张图片,调查了下,决定用WebView(说实话,我还不清楚有没有其他android控件能够显示多张图片的.....), 主要是用HTML的img来显示多张图片. google百度 ...
-
系统重装助手教你如何在Microsoft Edge中恢复“关闭所有选项卡”警告
在Microsoft Edge中,当您打开多个选项卡时,浏览器将显示“您要关闭所有选项卡吗?” 警告,以防止您意外关闭重要标签. 通常,在没有第二个想法的情况下,您会立即禁用此功能,检查提示中的“始终 ...
-
高阶函数map_reduce_sorted_filter
能够把函数当成参数传递的参数就是高阶函数 map map: 功能: 拿iterable的每一个元素放入func中, func的返回值放入迭代器内进行返回 参数: iterable, func 返回: ...
-
42. oracle通过两张表的一个字段对应,update其中一张表的某个字段
update A a set a.A2 = (select b.B2 from B b where b.B1=a.A1) where exists (select 1 from B where B.B ...
-
vue 跳转路由传参数用法
// 组件 a <template> <button @click="sendParams">传递</button> </template ...
-
[UE4]单映射:TMap容器,字典表
一.TMap是什么 TMap是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系.因此你可以通过键名来快速查找到值.此外,单映射要求每个键都是唯一的. 二.创建和填充单映射 如果你想创建一 ...
-
微信分享SDK
网址:http://www.8ru.org/weixin-js-sdk.html 下载demo:http://demo.open.weixin.qq.com/jssdk