云原生技术系列-Containerization容器化Docker

前言

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

image.png

正文

物理机、虚拟机和容器

image.png
image.png
image.png

容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。
虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。
因此容器的隔离级别会稍低一些。

image.png

明显区别:
Docker比虚拟化少了两层,取消了 hypervisor 层和 GuestOS 层,使用 Docker Engine 进行调度和隔离,所有应用共用主机操作系统,因此在体量上 Docker 较虚拟机更轻量级,在性能上优于虚拟化,接近裸机性能。

本质区别:

  • 虚拟机是操作系统级别的资源隔离,
  • 容器是进程级别的隔离
image.png

Docker优势:

  • 更低的硬件成本
  • 更快速的部署环境
  • 更简便的环境维护
  • 与微服务架构更为契合

Docker不足:

  • 隔离效果不如VM,共享宿主机操作系统的一些基础库等
  • 网络配置功能相对简单,主要以桥接方式为主
  • 查看日志也不够方便灵活

Docker的优势

  • 轻量:在一台机器上运行的多个Docker容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
  • 标准:Docker容器基于开放式标准,能够在所有主流Linux版本、Microsoft Windows以及包括VM、裸机服务器和云在内的任何基础设施上运行。
  • 安全:Docker赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

Docker Engine

Docker daemon: 运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互

Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon

image.png

Docker的理念

Build, Ship, and Run Any App, Anywhere

image.png
image.png

Docker的核心组成

image.png

镜像Image

image.png
image.png
  • 内容:打包程序运行所需的应用、环境等参数信息
  • 分层结构,每层一个hash值,类似于Git commit,方便回滚,因此建议在制作每一层的功能尽量相对独立和完整。
  • 好处:减少了硬盘存储的大小。保存每次变更,不保存每个版本的完整结果。
  • 注意:删除每一层不需要的内容。Why?某一层遗忘删除的内容会被保留到后续的层级,从而导致最终镜像膨胀。

容器(Container)

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。

容器可以被创建、启动、停止、删除、暂停等 。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。使用数据卷来帮助解决这个问题。

数据卷(Volume)

文件数据存储是数据交互的重要组成,在虚拟机中,通常直接采用虚拟机的文件系统作为应用数据等文件的存储位置,这种方式的问题在于,虚拟机或者容器出现问题导致文件系统无法使用时,之前存放的数据也就丢失了。

另外一种方式,就是挂载真实数据源的方式,Docker就是采用这种方式,通过底层的Union File System 技术,除了能够从宿主操作系统中挂载目录外,还能够建立独立的目录持久存放数据,或者在容器间共享。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新run,数据却不会丢失。

仓库( Repository)

镜像仓库是Docker用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。

一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。

Docker Registry有公服和私服之分,类似于Maven的公共仓库和私有仓库。

网络(Network)

image.png
  • Bridge方式:默认网络连接方式,使用一个虚拟的网络接口,桥接到宿主机上的网络接口上。
  • Host方式:host方式可以让容器无需创建自己的网络协议栈,而直接访问宿主机的网络接口,在容器中执行ip addr会发现与宿主机的网络配置是一样的,host方式让容器直接使用宿主机的网络接口,传输数据的效率会更加高效,避免bridge方式带来的额外开销,但是这种方式也可以让容器访问宿主机的D-bus等网络服务,可能会带来意想不到的安全问题,应谨慎使用host方式
  • Container方式:让容器共享一个已经存在的网络配置
  • None方式:不会对容器的网络做任务配置,需要用户自己去定制。

docker生命周期

image.png

可以看到,容器的生命周期分为五种状态

  • Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还未处于运行状态。
  • Running:容器正在运行,也就是容器中的应用正在运行。
  • Paused:容器已暂停,表示容器中的所有程序都处于暂停 ( 不是停止 ) 状态。
  • Stopped:容器处于停止状态,占用的资源和沙盒环境都依然存在,只是容器中的应用程序均已停止。
  • Deleted:容器已删除,相关占用的资源及存储在 Docker 中的管理信息也都已释放和移除。

此外,这张图中对于一些常用的指令也进行了标注,建议可以结合这张图,一方面了解docker容器的生命周期,一方面也了解一些常用的docker操作指令。

DockerFile

作用:定义docker镜像构建步骤,适用于构建比较复杂的docker镜像。有点类似于makefile之于CPP项目,shell script之于shell指令。

命令 含义
FROM 指定基础镜像
RUN 构建指令,会生成新的层。支持 \ 换行,多条之间用 && 连接,减少新层
COPY 将构建命令所在的主机本地的文件或目录,复制到镜像文件系统
ADD 不仅能够将构建命令所在的主机本地的文件或目录,而且能够将远程URL所对应的文件或目录,作为资源复制到镜像文件系统。
ENTRYPOINT 主要用于对容器进行一些初始化
CMD 定义容器中主程序的启动命令,建议使用数组的方式
EXPOSE 指定暴露的端口
VOLUME 指定挂载持久卷的位置

构建镜像指令:

docker build  -t {目录} –f {dockerfile文件地址} 

Dockerfile的使用-一个完整的Demo


image.png

总结

  • 虚拟化:将计算机物理资源进行抽象、转换为虚拟的计算机资源提供给程序使用的技术
  • 容器技术:为操作系统自身支持一些接口,能够让应用程序间可以互不干扰的独立运行
  • docker:在开发、部署、运维,以及集群化等方面,显著的提升了工作效率
  • 镜像:docker中可以运行的虚拟环境,对比对象中的类
  • 容器:从镜像中产生,隔离出来的虚拟环境,对比类的实例
  • 网络:程序间进行数据交换,docker中共可以创建虚拟网络进行环境隔离
  • 数据卷:docker中文件存储,既能挂载,又能建立独立的目录持久存放数据,还能容器共享
  • docker daemon:实现docker这套容器化技术的工具,以服务的形式运行以便静默的提供功能
  • docker cli:docker engine提供的通过命令行调用daemon接口的工具
  • dockerfile:定义docker镜像构建步骤

最后来一张图:

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

推荐阅读更多精彩内容