架构师修炼之微服务部署 - 深入理解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 随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台.就像前边的文章说的, ...
随机推荐
- Pandas 精简实例入门
目录 0. 案例引入 1. Pandas 主要数据结构 1.1 DataFrame 1.1.1 设置索引 1.1.2 重设索引 1.1.3 以某列为索引 1.2 MultiIndex 1.3 Seri ...
- redis的使用及配置
linux环境下redis启动和管理 在redis根目录下执命令 快捷启动默认端口 ./redis-server ../redis.conf 启动redis管理端 ./redis-cli 清理缓存命令 ...
- iOS 状态栏显示/隐藏
iOS 10为止,将在plist文件中将 View controller-based status bar appearance 设置为NO,就可以用UIApplication设置状态栏. 注意,要在 ...
- Mac下安装安装selenium与安装chromedriver安装
开发环境:MacOS,Python3.7 1. 安装selenium 可以使用pip安装(pip install selenium)或者使用pycharm进行安装下载 2. 运行如下代码: from ...
- SpringCloud入门(九): Zuul 上传&回退&异常处理&跨域
Zuul的上传 1.构建一个上传类 import org.springframework.web.bind.annotation.PostMapping; import org.springframe ...
- Javascript判断图片是否存在
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- k8s + docker + Jenkins使用Pipeline部署SpringBoot项目时Jenkins错误集锦
背景 系统版本:CentOS7 Jenkins版本:2.222.1 maven版本:apache-maven-3.6.3 Java版本:jdk1.8.0_231 Git版本:1.8.3.1 docke ...
- My背包九讲——01背包
文章目录 背包问题中的常用变量说明 题目 解题思路 我想要想理解最简单 01背包就是要`理解
- Coding 是门技术
今天的分享来源于工作中的点点滴滴…… 01. 习惯性自嘲 代码写久了,伴随肩疼头痛眼近视,于是乎也就成了名副其实的 code farmer(码农),作为如牛吃草挤奶般的码农,吃草(撸)挤奶(码)便是日 ...
- 国内 Java 开发者必备的两个装备,你配置上了么?
虽然目前越来越多的国产优秀技术产品走出了国门,但是对于众领域的开发者来说,依然对于国外的各种基础资源依赖还是非常的强.所以,一些网络基本技能一直都是我们需要掌握的,但是速度与稳定性问题一直也都有困扰着 ...