容器 10 年,Docker 6 年

2019年10月9日 411点热度 0人点赞 0条评论

图片

自 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 专栏。

64770容器 10 年,Docker 6 年

这个人很懒,什么都没留下

文章评论