(一)容器化技术与Docker

logo.png

我们都知道Docker是一个容器化工具,那么什么是容器呢,Docker和容器有什么关系,Docker又能解决什么问题呢?

麻烦的环境配置

软件开发最大的麻烦事之一就是环境配置,在开发之前我们需要准备各种运行环境、IDE、辅助工具。就像我们要使用电脑前,先要安装操作系统一样。

而一个可用软件的交付过程通常包含两个部分 - 开发和维护。不幸的是,我们很难保证软件开发测试和运行维护阶段的软件能运行在一模一样的环境下。开发常说:"It works on my machine",很多时候我们都要花大量的时间去配置环境和教别人配置环境。

现在的应用程序

  • 以前的应用程序:
    • 几乎都是单块应用: 大系统, 多模块
    • 紧耦合: 内部调用
    • 不常变更: 需求稳定(改动成本高)
  • 如今的应用程序:
    • 解耦: 微服务/异步
    • 经常变更: 快速迭代
    • 动态创建和部署: 服务化
applications.jpg

新架构的挑战

  • 多样化的技术栈
  • 需要动态创建机器
  • 很多活动组件
  • 运维人员需要管理复杂的架构

在新的应用程序架构下,我们部署应用的成本大大增加。
不但要搭建不同语言、不同技术栈适配的运行环境,还要部署到多个服务器主机上;并且这些主机还可能来自不同地方(公/私有云主机、物理主机)。

统一的管理

其实在软件开发的过程中我们就思考过类似的问题 - 如何统一的管理我们的代码包。例如,Maven、Gradle、NPM,我们使用一个相同的格式(规范)将我们的代码划分成模块,并使用一套工具去管理他们。在此之后我们不需要重复的copy代码、复制文件,只需要声明式的引入我们需要的代码包就可以了。

当然,我们希望我们的应用部署也能如此简单。

“容器”

good-container.png

app-container.png

“容器”是一个黑盒,对于它的使用者来说:

  • 无需关心里面有什么:只关注“容器”能做什么
  • 有一套工具来管理黑盒:打包、运输、运行
  • 减少了部署单元的数量,从而减少了花销:多个工具聚集在一个“容器”内
  • 更容易管理多个环境:以“容器”为单位进行部署和管理

虚拟化技术

  • 虚拟机

    • 精心配置的虚拟机也是满足我们(基本)要求的容器,我们能够通过虚拟机镜像来打包我们的应用。但是,庞大的操作系统占用了大量的系统资源,使运行成本大大上升。


      VM.png
  • 容器

    • (作为进程)共用内核并提供额外的隔离手段,避免虚拟的操作系统占用。


      container.png

虚拟机

  • 应用
  • 运行环境(Java/数据库/libs...)
  • 客户机操作系统(Guest Operating System)
  • 虚拟机管理系统(Hypervisor)
    • 操作系统级:MacOS(HyperKit),Windows的Hyper-V
    • 应用软件级:VirtualBox,VMWare Workstation
  • 主操作系统(Host Operating System)
  • 硬件(Infrastructure)/云主机

容器

  • 应用
  • 运行环境(Java/数据库/libs...)
  • Docker守护进程(Docker Daemon): 类似虚拟机管理系统
  • 主操作系统(Host Operating System)
  • 硬件(Infrastructure)/云主机

容器技术

容器技术已经发展了一段时间了, 例如, LXC, BSD Jails, Solaris Zones...


history.png
  • 看起来像虚拟机
    • 可以SSH到容器
    • 具有root的访问权限
    • 可以安装包
    • 可以mount文件系统
    • 拥有自己的eth0接口
    • 可以修改iptables 规则和routing table
  • 共享宿主机的内核
  • 隔离 cgroups (memory, cpu, blkio)
  • 拥有进程空间 (pid, mnt, net, ipc, uts)
    • pid - 隔离进程PID
    • mnt - 允许创建不同的文件系统层级
    • net - 隔离网络控制、iptables、防火墙、路由
    • ipc - 定义内部进程交流的范围
    • uts - 允许修改hostname

容器技术的局限

  • 容器没有标准的格式
  • 所以容器是不可移植的
  • 没有标准的工具,所以比如要自己管理网络
  • 没有可重用的模块和API

Docker

what-is-docker.png
  • 使容器变得更容易使用
  • 容器镜像的商品化
  • 可插拔的模块易于吸引供应商加入
  • 适当的API可用来创建高层次抽象的工具
  • 和微服务诞生在同一个时代

Docker架构

docker-architecture.png
  • Docker Client:接收命令和Docker Host进行交互的客户端
  • Docker Host:运行Docker服务的主机
    • Docker Daemon:守护进程,用于管理所有镜像和容器
    • Docker Images/Containers:镜像和容器实例
  • Registry(Hub):镜像仓库
docker-architecture2.png

Docker底层实现

docker-tech.png

底层实现原理详解见

Docker核心技术

core-tech.png
  • Namespace 命名空间
    Linux 的命名空间机制提供了以下七种不同的命名空间,包括 CLONE_NEWCGROUP、CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS,通过这七个选项我们能在创建新的进程时设置新进程应该在哪些资源上与宿主机器进行隔离。因此容器只能感知内部的进程,而对宿主机和其他容器一无所知。
  • CGroups (Control Groups)
    Linux 的 CGroup 能够为一组进程分配资源,也就是我们在上面提到的 CPU、内存、网络带宽等资源.
  • UnionFS


    union-fs.png

    Docker中的每一个镜像都是由一系列的只读层组成的,Dockerfile 中的每一个命令都会在已有的只读层上创建一个新的层。通过 docker run 命令可以在镜像的最上层添加一个可写的层 - 容器层,所有对于运行时容器的修改其实都是对这个容器读写层的修改。
    容器和镜像的区别就在于,所有的镜像都是只读的,而每一个容器其实等于镜像加上一个可读写的层,也就是同一个镜像可以对应多个容器。同时已构建的每一层镜像也可以作为其他镜像的基础层进行共用。

Docker VS VM

VM-vs-docker.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,481评论 0 120
  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,514评论 15 147
  • 我的宝宝一出生没有母乳喝,美国医院和中国不同,宝宝出生2天如果检查健康即要安排出院。2天的时间,护士会教妈妈日常宝...
    Lucas的未来阅读 1,913评论 0 2
  • 一只猫,忌讳任何声音。活着,只为让世界忘记我的存在,白日,也酝酿黑暗。 我爱夏天,到处都宣泄沸腾,没有谁会注意平缓...
    徐墀阅读 249评论 0 0
  • 如何将山峰翻转 犹如松针落地 需要一些时间 何时山峰翻转 山顶便不再尖 夕阳时候 大片光景难见 可是哪有山峰翻转 ...
    伍丁零阅读 157评论 1 3