架构师修炼之微服务部署 - 深入理解Docker镜像

时间:2021-11-14 04:20:16

镜像简介

它是一个创建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特性之后,容器与镜像的关系如下:

架构师修炼之微服务部署 - 深入理解Docker镜像

只读镜像层的数据更新时,就会复制数据到可读写操作的容器层。这个复制处理的具体操作依赖系统选择的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 为了加速镜像构建、重复利用资源,会利用这些中间层镜像。

镜像优化

知道镜像内部分层之后,我们就可以做一些处理来优化我们的镜像。

  1. 由于镜像每层是只读的,构建之后无法改变。所以在构建这一层时创建的临时文件,也需要在这一层进行删除,后续层中做的删除只是表面效果。

优化前:

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/*
  1. 对于已经没有任何依赖的中间层镜像进行删除。

架构师修炼之微服务部署 - 深入理解Docker镜像的更多相关文章

  1. 架构师修炼之微服务部署 - Docker简介

    Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是 ...

  2. 罗辑思维首席架构师:Go微服务改造实践

    转自:http://www.infoq.com/cn/news/2018/05/luojisiwei 方圆 曾先后在 Cisco,新浪微博从事基础架构研发工作.十多年一直专注于后端技术的研发,在消息通 ...

  3. 阿里P7架构师详解微服务链路追踪原理

    背景介绍 在微服务横行的时代,服务化思维逐渐成为了程序员的基本思维模式,但是,由于绝大部分项目只是一味地增加服务,并没有对其妥善管理,当接口出现问题时,很难从错综复杂的服务调用网络中找到问题根源,从而 ...

  4. Atitit&period;架构设计趋势 设计模式 ---微服务架构&&num;160&semi;&&num;160&semi;soa

    Atitit.架构设计趋势 设计模式 ---微服务架构  soa 什么是微服务架构?1 .微服务与SOA的关系 :微服务架架构师面向服务架构(SOA)的一种特定实现1 微服务与康威定律2 微服务的一些 ...

  5. Chris Richardson微服务翻译:微服务部署

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服务部署( ...

  6. Docker 系列七(Dubbo 微服务部署实践)&period;

    一.前言 之前我们公司部署服务,就是大家都懂的那一套(安装JDK.Tomcat —> 编译好文件或者打war包上传 —> 启动Tomcat),这种部署方式一直持续了很久,带来的问题也很多: ...

  7. docker微服务部署之:六、Rancher管理部署微服务

    docker微服务部署之:五.利用DockerMaven插件自动构建镜像 一. 什么是Rancher Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源 ...

  8. 中小型研发团队架构实践三:微服务架构(MSA)

    一.MSA 简介 1.1.MSA 是什么 微服务架构 MSA 是 Microservice Architect 的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相 ...

  9. Re:从 0 开始的微服务架构--&lpar;四&rpar;如何保障微服务架构下的数据一致性--转

    原文地址:http://mp.weixin.qq.com/s/eXvoJew3bjFKzLLJpS0Otg 随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台.就像前边的文章说的, ...

随机推荐

  1. 【转】Apache 配置虚拟主机三种方式

    Apache 配置虚拟主机三种方式  原文博客http://www.cnblogs.com/hi-bazinga/archive/2012/04/23/2466605.html 一.基于IP 1. 假 ...

  2. 使用Node&period;JS访问Hyperledger Fabric的gRPC服务

    在即将正式发布的Hyperledger Fabric SDK 1.0中,Hyperledger Fabric通过gRPC提供服务接口以取代现有的REST API.本文介绍了如何使用Node.JS访问H ...

  3. Java基础知识强化42:StringBuffer类之StringBuffer的截取功能

    1. StringBuffer的截取功能: public String subString(int Start): public String subString(int Start, int end ...

  4. Android WebView中显示一张或多张图片

    最近需要在平板中显示多张图片,调查了下,决定用WebView(说实话,我还不清楚有没有其他android控件能够显示多张图片的.....), 主要是用HTML的img来显示多张图片. google百度 ...

  5. 系统重装助手教你如何在Microsoft Edge中恢复&OpenCurlyDoubleQuote;关闭所有选项卡”警告

    在Microsoft Edge中,当您打开多个选项卡时,浏览器将显示“您要关闭所有选项卡吗?” 警告,以防止您意外关闭重要标签. 通常,在没有第二个想法的情况下,您会立即禁用此功能,检查提示中的“始终 ...

  6. 高阶函数map&lowbar;reduce&lowbar;sorted&lowbar;filter

    能够把函数当成参数传递的参数就是高阶函数 map map: 功能: 拿iterable的每一个元素放入func中, func的返回值放入迭代器内进行返回 参数: iterable, func 返回: ...

  7. 42&period; 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 ...

  8. vue 跳转路由传参数用法

    // 组件 a <template> <button @click="sendParams">传递</button> </template ...

  9. &lbrack;UE4&rsqb;单映射:TMap容器,字典表

    一.TMap是什么 TMap是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系.因此你可以通过键名来快速查找到值.此外,单映射要求每个键都是唯一的. 二.创建和填充单映射 如果你想创建一 ...

  10. 微信分享SDK

    网址:http://www.8ru.org/weixin-js-sdk.html 下载demo:http://demo.open.weixin.qq.com/jssdk