重点摘要
1. 容器虚拟化操作系统,而非硬件
虚拟机(VM)虚拟化硬件,容器则虚拟化操作系统。
虚拟化差异。 与模拟硬件的虚拟机不同,容器虚拟化的是操作系统。这一根本差异使得容器比虚拟机更轻、更快且更高效。虚拟机需要为每个实例提供完整的操作系统,而容器则共享主机的操作系统内核,从而减少了资源开销。
效率与速度。 由于容器共享主机操作系统,它们消耗的资源更少,启动速度也远快于虚拟机。这使得容器成为现代应用开发的理想选择,速度和效率至关重要。单个主机可以运行显著更多的容器,而不是虚拟机,从而最大化资源利用率。
安全隐患的影响。 容器的共享内核模型最初引发了安全担忧。然而,现代容器平台已经成熟,采用了强大的安全措施,使得容器的安全性可以与虚拟机相媲美,甚至更高。这些措施包括SELinux、AppArmor和镜像漏洞扫描等技术。
2. Docker引擎由模块化、专业化组件组成
Docker引擎由多个专业工具组成,这些工具协同工作以创建和运行容器——API、镜像构建器、高级运行时、低级运行时、shim等。
模块化架构。 Docker引擎并不是一个单一的实体,而是一个由多个专业组件协同工作的集合。这种模块化设计提供了更大的灵活性、可维护性和创新性。关键组件包括API、镜像构建器(BuildKit)、高级运行时(containerd)和低级运行时(runc)。
OCI标准。 Docker引擎遵循开放容器倡议(OCI)规范,确保容器生态系统内的互操作性和标准化。这种合规性使得Docker能够与其他符合OCI标准的工具和平台无缝协作。OCI规范涵盖了镜像格式、运行时和分发。
组件职责。 Docker引擎中的每个组件都有特定的职责。例如,containerd管理容器生命周期,而runc与操作系统内核接口以创建和管理容器。这种关注点的分离增强了系统的整体稳定性和效率。
3. 镜像是运行应用程序的只读模板
镜像是一个只读包,包含运行应用程序所需的一切。
镜像定义。 Docker镜像是一个静态的只读模板,包含运行应用程序所需的所有内容,包括代码、依赖项和运行时环境。镜像类似于虚拟机模板或面向对象编程中的类,作为创建容器的蓝图。
镜像层。 Docker镜像由一系列只读层构成,每一层代表对基础镜像的一组更改或添加。这种分层方法通过允许镜像共享公共层来促进效率,从而减少存储空间和下载时间。每一层都是不可变的,确保了一致性和可重现性。
镜像注册表。 镜像存储在称为注册表的集中式库中,Docker Hub是最受欢迎的注册表。注册表促进了镜像的共享和分发,使开发者能够轻松地在不同环境中部署应用程序。注册表实现了OCI分发规范和Docker Registry v2 API。
4. Docker Hub促进镜像共享与分发
大多数流行的应用程序和操作系统在Docker Hub上都有官方注册库,易于识别,因为它们位于Docker Hub命名空间的顶层,并带有绿色的Docker官方镜像徽章。
集中式注册库。 Docker Hub作为一个集中式注册库,用于存储和共享Docker镜像。它既托管官方镜像,这些镜像经过Docker和应用程序供应商的审核和策划,也包括社区贡献的非官方镜像。
官方与非官方镜像。 Docker Hub上的官方镜像标有绿色的“Docker官方镜像”徽章,表明它们符合特定的质量和安全标准。虽然非官方镜像可能有价值,但用户在使用前应谨慎并验证其可信度。官方镜像的例子包括nginx、busybox、redis和mongo。
镜像命名与标记。 镜像通过一个完全合格的名称来识别,包括注册表名称、用户/组织名称、库名称和标签。标签是可变的,可以用于版本控制,而摘要提供了一个内容可寻址的标识符,确保不可变性。除非另有说明,Docker默认使用Docker Hub。
5. 多阶段构建优化镜像大小与安全性
因此,您的容器镜像应仅包含在生产中运行应用程序所需的内容。
生产就绪镜像。 多阶段构建是一种强大的技术,用于创建小型、安全且高效的生产镜像。通过在单个Dockerfile中使用多个FROM指令,开发者可以将构建环境与运行时环境分开。
构建阶段。 多阶段构建涉及多个阶段,每个阶段都有自己的基础镜像和指令集。初始阶段用于编译和构建应用程序,而最终阶段则创建一个仅包含必要运行时组件的最小镜像。这减少了镜像的大小和攻击面。
多阶段构建的好处:
- 更小的镜像大小:减少存储空间和下载时间
- 改善安全性:通过移除不必要的工具和依赖项来最小化攻击面
- 更快的构建时间:允许构建阶段的并行执行
- 增强可移植性:确保应用程序在不同环境中的一致行为
6. Compose简化多容器应用管理
与其通过复杂的脚本和冗长的docker命令将这些服务拼凑在一起,不如使用Compose在一个简单的YAML文件中描述它们。
声明式配置。 Docker Compose通过允许开发者在单个YAML文件中定义整个应用程序栈,简化了多容器应用的管理。该Compose文件指定了应用程序所需的服务、网络、卷和其他资源。
简化部署。 使用Compose,部署多容器应用变得简单,只需运行一个命令:docker compose up
。Docker随后读取Compose文件,自动创建和配置所有必要的资源。
Compose的好处:
- 精简的开发工作流程:简化了定义和管理复杂应用的过程
- 增强可移植性:允许应用程序轻松部署到不同环境
- 改善协作:促进开发者之间的共享与协作
- 基础设施即代码:将应用程序基础设施视为代码,实现版本控制和自动化
7. Swarm在多个主机上编排容器
Kubernetes更受欢迎,拥有更活跃的社区和生态系统。然而,Swarm更易于使用,适合中小型企业和较小的应用部署。
集群与编排。 Docker Swarm是一个原生的集群和编排解决方案,允许开发者在多个主机上管理容器。它提供了服务发现、负载均衡和自动扩展等功能。
管理节点与工作节点。 Swarm集群由管理节点和工作节点组成,管理节点负责管理集群状态和调度任务,而工作节点则执行容器化应用。Swarm使用TLS加密通信,认证节点并授权角色。
高可用性。 Swarm实现了主动/被动多管理节点高可用性,确保即使一个或多个管理节点失败,集群仍然保持运行。Raft共识算法用于维护多个管理节点之间的一致集群状态。
8. Overlay网络实现多主机容器通信
现实世界中的容器需要一种可靠且安全的方式进行通信,而不必关心它们运行在哪个主机上或这些主机连接到哪些网络。
多主机网络。 Overlay网络提供了一个虚拟化的网络层,使得在不同主机上运行的容器能够无缝通信。这对于构建跨多个机器的分布式应用至关重要。
VXLAN封装。 Docker使用VXLAN(虚拟扩展局域网)技术创建Overlay网络。VXLAN将容器流量封装在UDP数据包中,使其能够穿越底层物理网络,而无需对现有基础设施进行任何更改。
Overlay网络的好处:
- 简化网络:抽象掉底层网络拓扑的复杂性
- 增强可移植性:允许应用程序轻松部署到不同环境
- 提高安全性:为容器流量提供加密和隔离
- 改善可扩展性:使应用程序能够在多个主机上扩展
9. 卷确保持久数据存储
卷是独立的对象,不与容器的生命周期绑定。
数据持久性。 Docker卷提供了一种机制,用于持久化容器生成的数据,即使在容器停止或删除后,数据仍然存在。卷是独立的对象,与容器分开管理。
卷驱动程序。 Docker支持多种卷驱动程序,包括本地、NFS和基于云的存储解决方案。这使得开发者可以选择最适合其应用需求的存储后端。
卷的好处:
- 数据持久性:确保在容器停止或删除时数据不会丢失
- 数据共享:允许多个容器访问和共享相同的数据
- 存储管理:提供集中管理存储资源的方式
- 可移植性:使应用程序能够轻松迁移到不同环境
10. Docker利用Linux安全技术实现隔离
从高层次来看,命名空间提供轻量级的隔离,但并未提供强大的安全边界。
内核命名空间。 Docker利用Linux内核命名空间为容器提供隔离。命名空间虚拟化各种系统资源,如进程ID、网络接口和挂载点,使每个容器拥有自己隔离的系统视图。
控制组(cgroups)。 cgroups用于限制和控制容器可以消耗的资源,如CPU、内存和I/O。这防止容器垄断系统资源,确保资源的公平分配。
能力。 能力提供了对容器权限的细粒度控制。通过去除不必要的能力,开发者可以减少容器的攻击面。
强制访问控制(MAC)。 MAC系统,如SELinux和AppArmor,通过对容器实施访问控制策略提供额外的安全层。这些策略可以限制容器可以执行的操作,即使它拥有必要的能力。
seccomp。 Seccomp(安全计算模式)是Linux内核的一项功能,允许开发者限制容器可以发出的系统调用。这可以显著减少容器的攻击面,防止它们执行潜在危险的系统调用。
11. Docker Scout通过漏洞扫描增强安全性
Docker Scout提供领先的漏洞扫描,扫描您的镜像,提供已知漏洞的详细报告,并推荐解决方案。
镜像扫描。 Docker Scout是一种扫描Docker镜像以查找已知漏洞的工具。它提供了关于发现的漏洞的详细报告,包括其严重性和潜在影响。
修复建议。 除了识别漏洞外,Docker Scout还提供修复建议,例如建议更新基础镜像或特定软件包版本,以解决漏洞。
与Docker生态系统的集成。 Docker Scout集成到Docker生态系统的各个部分,包括CLI、Docker Desktop和Docker Hub。这使得开发者能够轻松地将漏洞扫描纳入其开发工作流程。
最后更新日期:
评论
《Docker 深入浅出》获得了大多数积极的评价,读者们称赞其易于理解和实用的方式来解释 Docker 概念。许多人认为这是初学者和中级用户的优秀入门书籍,欣赏其清晰的解释和实用的示例。一些读者指出,它填补了知识空白,并提供了对 Docker 生态系统的良好概述。然而,少数评论者认为在某些领域缺乏深度,可能不适合经验丰富的 Docker 用户。总体而言,这本书因其将复杂主题变得易于理解的能力而备受推崇。