认识 Docker

Docker 是一种虚拟化容器技术。他主要解决了配置环境问题。软件部署环节的第一步就是配置环境,使软件能够在机器上流畅地运行。常常听到的一句话是:“我的电脑上能运行啊。”可是换到生产环境就不行了,又需要重新配置环境。最好的解决方式是能够将原始环境的配置一模一样地复制一份,大家就能够时刻保持在相同的环境下运行软件。

认识 Docker

Docker 是一种虚拟化容器技术。当我听到虚拟化容器最先想到的是虚拟机,docker 和虚拟机又有很大差别。

虚拟机可以在一种操作系统里面运行另一种操作系统,看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件可以随时删除。通过虚拟机我们可以在硬件上运行多个不同的操作系统,但是他有几个缺点:

  1. 资源占用多:虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了;
  2. 冗余步骤多:虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录;
  3. 启动慢:启动操作系统需要多久,启动虚拟机就需要多久。

Docker 最初基于 Linux 中的一种容器轻量级虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。LXC 则基于 Linux 内核调用 CGroups 和 Namespaces,同时提供用户态 API 接口。用户则可以通过 LXC 提供的资源限制和隔离功能,创建一套完整并且相互隔离的虚拟应用运行环境。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。所以 Docker 是进程级别的管理,相对于虚拟机他就有以下几个优点:

  1. 启动快:容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。
  2. 资源占用少:容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
  3. 体积小:容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

Docker 的历史

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目, 它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权 协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会, 并成立推动 开放容器联盟(OCI)。

Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一 万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容 器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。


Docker 的作用

Docker 带来了行业的变革。首先是解决了云平台之间标准规范不统一,无法相互兼容对接的问题,有了 Docker 屏蔽了硬件层的差异,提供了统一的用户应用层;其次推进了软件开发的流程,各个部门采用相同的数据镜像之后可以将精力进一步集中在产品本身;也简化了软件运行生命周期中软件的日志管理和监控管理,因为 Docker 拥有统一的数据规范和接口规范,不需要对每一款产品进行定制化开发。

具体来说 Docker 的作用归纳为以下几点:

  1. 简化配置。将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度;

  2. 提供一次性的环境。通过作用一可以做到本地测试他人的软件、持续集成的时候提供单元测试和构建的环境;

  3. 代码流水线管理(Code Pipeline)。通过作用一,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少;

  4. 快速部署。在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。Docker通过为进程创建一个容器而无需启动一个操作系统,将这个过程缩短到了秒级;

  5. 调试能力。Docker提供了很多的工具,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug;

  6. 隔离应用,组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构;

  7. 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。


Docker 三个基本概念

镜像

相比于传统的虚拟化中的 ISO 镜像,Docker 镜像要轻量化很多,它只是一个可定制的 rootfs。用户可以使用其他人创建的镜像,也可以通过 docker commit 这样的命令自己来创建镜像。

Docker 镜像是通过 Dockerfile 来创建,除了提供容器运行时所需的程序、库、资源、配置等文 件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像基于联合文件系统的一种层式结构。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后 一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除 前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看 到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

容器

Docker 可以帮助我们构建和部署容器,只需要把应用程序或者服务打包放进容器即可,他们可以是 Web 服务器、数据库或者应用程序服务器等,docker 都用同样的方式将内容装载进容器中。我们就可以针对容器进行创建、启动、停止、删除、暂停等操作。

容器和镜像可以这样区别。镜像是 docker 生命周期中的构建和打包阶段,而容器则是启动和执行阶段。每个容器都包含一个软件镜像,而容器可以共享底层的只读镜像,通过写入自己特有的内容后添加新的镜像层,新增的镜像层和下层镜像一起又可以作为基础镜像被更上层的镜像使用。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来就好像是在一 个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安 全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

仓库

Docker Registry 用于存储和分发用户构建的镜像,可以分成公有私有两种。将镜像存储在仓库之中,就可以在其他服务器上使用这些镜像。

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

国外的仓库镜像

官方、默认、高质量镜像

CoreOS 的 Quay.io

Google 的镜像,Kubernetes 的镜像即此

国内的仓库镜像

阿里云加速器

DaoCloud 加速器

时速云镜像仓库

网易镜像仓库

DaoCloud 镜像市场

阿里云镜像库


参考资料

《Docker全攻略》
《第一本Docker书》
《Docker技术入门与实战》
《Docker进阶与实战》
Docker 入门教程
八个Docker的真实应用场景

发布了191 篇原创文章 · 获赞 17 · 访问量 6万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览