您的位置:首页 > 运维架构 > Docker

容器 10 年,Docker 6 年

2019-10-10 15:34 891 查看

自 2013 年起,随着 Docker 的正式面世,容器技术迅速成为了基础技术领域中的热门。而在近两三年中,随着容器编排领域的混战结束,Kubernetes 已经成为了容器编排领域事实上的标准。
有一些人认为 Kubernetes 的出现取代了 Docker
但事实上,Docker 与 Kubernetes 是相辅相成的。

当 Kubernetes 使用 Docker 作为容器运行时,用来启动应用;当 Docker 容器规模变大时,自然是需要有容器编排工具进行管理的。

引用最近一次的网络研讨会后的文章内容:
In fact, Kubernetes is better with Docker. And Docker is better with Kubernetes.

无论在使用 Docker 或是 Kubernetes 亦或者是使用基于这些技术的其他衍生技术时,都有可能会遇到一些意料之外的情况,当问题发生时,我们总是希望可以快速定位问题,并且从根本上解决问题。

一般情况下,上层的问题比较容易解决,但如果问题发生在运行时 Docker 或容器上时,如果没有系统性的知识,很难从根本上解决问题。


容器是什么

Docker 在大多数人眼中几乎是容器(Container)的代名词,即使是现在我也会常听到有人说“我有几个 Docker 跑 xx 服务” 类似这样的话,无疑 Docker 引领了容器的时代。
一直在提容器,我们不如深入一点先来探究下容器到底是什么?
在 Docker 官网上对容器的描述是:“A standardized unit of software”——软件的标准单元,并没有什么更详细的内容了。多数人对容器的看法也都停留在很浅显的认识:认为容器是轻量级的虚拟机,因此后来也就有一段时间有人推“富容器”技术。

说白了,容器其实是在某台机器上的“一组”进程,当然这组进程可能只有一个;它们有相同的特性,当然所受的限制也是相同的;既然叫做容器,很自然的我们认为它们与外界可以进行隔离 / 应该有一个分界线。


Docker 的优势

Docker 一开始能吸引众多用户,其中一个很重要的因素就在于它上手使用很简单。在安装完 Docker 之后,一行命令语句 docker run hello-world 便已经运行了一个容器,一切看着都及其简单。

2008 年到 2013 年这之间大约 5 年左右的时间,以 LXC 为首的容器技术并没有得到类似 Docker 出现后那么广泛的普及,我在之前的线下演讲中也提到过这个点,最主要的原因在于 LXC 太偏向技术了,使用 LXC 有一定的门槛,导致了好多人的退却。

Docker 则提供了简单易用的工具, 优雅灵活的容器生命周期管理,以及镜像的构建,分发等配套设施,这为后期的推进提供了很多的便利。
再加上 Docker 的策略很好,以及在 Docker 公司内部也有大量的实践经验,因此这些事情做起来也都很顺畅了。


使用 Docker 面临的问题

我们要正视 Docker 是一个已经 6 岁的项目了,自它 1.0 发布以来已经 5 年之久了,因此它在生产环境中已经得到了大量的实践和验证,虽然不可避免的也会存在一些历史遗留问题,好在也逐步改进中。

在实际的生产使用中,我们所运行的容器包含着业务代码,生产环境的网络、系统等因素也都很复杂。一旦出现问题,如何才能最高效地定位并解决问题,并且保证之后不再有类似的问题发生?

要做到这些,就需要对 Docker 技术有足够的了解。在大型公司中,都有专职负责基础支撑技术的开发或运维人员,而在中小型企业可能就很少有这类团队或者压根没有,需要开发人员自行解决。

另一方面,不一定只是在容器运行过程时才会遇到问题,我们可能在构建镜像的时候就已经遇到了各种各样的问题:
  • 构建的镜像体积为什么这么大
  • Pull 镜像为什么这么慢
  • 新构建的镜像为什么不生效
  • 构建镜像为什么这么久

现在很多岗位的招聘需求上都有写需要了解或者掌握 Docker,或者将掌握 Docker 等容器技术作为加分项目,并且这个要求不局限于运维或者后端开发等岗位。

在我们的实际使用中,大家可能遇到各种各样的情况和问题,那遇到 Docker 相关的问题,如何解决呢?
或者说,如何才能真正掌握 Docker 这么技术,在使用中游刃有余呢?
我在 GitChat 开设了《Docker 核心知识必知必会》专栏,其结合了我多年的 Docker 源码研究和实际填坑的经验,同时会深入部分 Linux 内核的原理和源码中,我希望通过这个专栏内容的学习你能有所收获。

扫码查看《Docker 核心知识必知必会

专栏介绍

我希望借由这个专栏,将 Docker 容器技术的本质和思想与我在开发和运维 Docker 过程中对其原理和实践经验的总结讲清楚,并将结合着实践和核心特性的原理,加深对 Docker 容器技术的理解。
因此,我把专栏划分成了三大模块:
一、Docker 入门:这个模块分成了三篇内容。
第一篇,了解 Docker 容器技术生态的发展脉络;
第二篇,是为刚入门 Docker 的读者准备的,也是为后续章节进行铺垫;

第三篇,是很多读者或公司都常会困惑的问题,Docker 与 Linux 内核兼容性如何,要上生产环境该选择哪个版本?我会在这一篇中与你分享,让你不再困惑。


二、Docker 核心特性:这个大模块围绕 Docker 的核心知识点,拆分成了 7 大部分。
分别是容器、镜像、CI/CD、架构、存储、安全和网络。这些是该专栏的核心内容,在这部分内容中,我将基本按照从实践到原理的方式进行组织,让你从根儿上知道如何用,以及为什么这么用。
  • 在容器篇,我会先给你介绍容器生命周期管理相关的内容,那你对容器的使用有个基本认识;之后会对容器资源进行管理;并对容器的核心进行深入剖析;最后动手来自己写容器。
  • 在镜像篇,将介绍镜像完整的生命周期管理;镜像是如何构建与分发的;如何使用 Dockerfile 进行镜像构建;并介绍 Docker 的下一代构建系统是如何提速近 10 倍的;接下来结合我的实际镜像为你介绍 Dockerfile 的优化和最佳实践;最后分别深入源码为你介绍镜像构建、分发的原理,以及认证流程和原理。
  • 在 CI/CD 篇,会介绍如何将 Docker 与 CI/CD 结合,同时介绍适用于生产环境使用的 CI/CD pipeline,希望能为读者建设 CI/CD 提供一些启发。
  • 架构篇中我会结合源码介绍 Docker 的核心架构,以及其是如何协作的;Docker 提供了一种可扩展的 Plugin 机制,在特定场景下使用 Plugin 扩展 Docker 也是一种不错的选择;接下来会结合实际经验介绍容器监控和日志方面的具体实践方案,希望能为读者在实际使用中提供一个参考;最后会与读者分享我所总结的 Docker 相关问题的定位及调试手段 正确的方法能让你排查问题的效率翻倍。
  • 存储篇主要介绍 Docker 中 volume 的使用;以及如何进行数据备份和恢复;最后会深入内部介绍现在 Docker 最推荐的 Overlay2 存储驱动的工作原理。
  • 安全篇会涉及镜像和容器运行时的安全;以及会涉及一些的 Linux 内核安全相关的知识,详细介绍如何利用 Linux 内核的安全模块为 Docker 保驾护航。
  • 网络篇除了介绍基础网络知识外,还会介绍如何定制 bridge 网络;iptables 始终是一个很核心的知识点,我会为读者将 Docker 与 iptables 梳理清楚,以及如何自定义的进行网络管理;最后详细介绍了 docker-proxy,Docker 内部 DNS 以及 Docker 的核心网络知识,让网络不再成为一个拦路虎。


三、生态扩展:不得不说“开源”是 Docker 成长迅速的关键。

在这个模块中,我将详细介绍 Docker 与 Kubernetes 间的联系,以及容器生态中的其他组件;与读者分享如何参与到 Docker 容器生态内,当然这里也会涉及到 Docker 现在的代码组织相关的内容;最后将与读者探讨 Docker 生态未来的走向。

对应的知识图谱如下:

专栏作者介绍

张晋涛:网易有道资深运维开发

《Kubernetes从上手到实践》作者、PyConChina 讲师和出品人、Kubernetes 组成员,多个 Docker 官方镜像贡献者,对 Docker、Kubernetes 及相关生态有大量实践及深入源码的研究,Kind (Kubernetes In Docker)项目的长期贡献者。

内容亮点

  • 6 个维度系统性解读 Docker 核心功能

  • 实践与源码相结合

  • 深入 Linux 内核,剖析容器所需关键技术

  • 生产环境 Docker 的使用和填坑经验总结


适宜人群

  • 容器运维或开发工程师

  • 准备使用或正在使用 Docker 的前后端工程师

  • 准备面试容器相关技术岗位的应试者或面试官

  • 调研 Kubernetes 等云原生技术的工程师

点击阅读原文,了解 Docker 专栏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: