我已经从事计算机安全工作近40年了,在过去的20年里,我一直专注于容器技术。大约10年前出现的Docker,掀起了一场有关人们如何在互联网上分发和运行应用程序的革命。当开始使用Docker时,我感觉它的设计还可以更好。使用一个以root(特权)身份运行的守护进程,然后不断添加更多的守护进程,我认为这不是正确的做法。我觉得可以利用底层操作系统的概念来创建一个以更高安全性和更少特权来运行相同容器化应用程序的工具。基于这个想法,我在Red Hat公司时的团队开始构建一系列工具,以帮助开发人员和管理员以更安全的方式来运行容器,而Podman就是这一系列工具之一。
我从2000年年初开始撰写关于SELinux等主题的博客,至今已经写了大量文章。这些年,我撰写了数百篇有关容器和安全性的文章,我希望能够将这些想法整合起来,写一本介绍Podman技术的书,以供用户和客户参考。
本书介绍了Podman及其使用方法,并深入探讨了我们用到的Linux操作系统的不同功能和技术。作为一名安全工程师,我还用几章的篇幅描述了容器安全的工作原理。阅读本书应该能让你更好地了解容器是什么、它们如何工作,以及如何使用Podman的不同功能。你甚至会了解更多关于Docker的知识。随着Podman日益普及并逐步应用到更多系统的基础架构中,本书将成为一个引导你前行的、便捷的Podman实践参考指南。
我要感谢所有帮助我完成本书撰写的人。首先感谢Podman团队的成员,他们撰写的许多技术文章帮助我理解了一些我此前没有完全理解的技术,并帮助构建了Podman这个伟大的产品,他们是Brent Baude、Matt Heon、Valentin Rothberg、Giuseppe Scrivano、Urvashi Mohnani、Nalin Dahyabhai、Lokesh Mandvekar、Miloslav Trmac、Jason Greene、Jhon Honce、Scott McCarty、Tom Sweeney、Ashley Cui、Ed Santiago、Chris Evich、Aditya Rajan、Paul Holzinger、Preethi Thomas和Charlie Doern。我还要感谢无数的开源贡献者,是他们使Linux容器和Podman成为可能。
我也要感谢Manning的整个团队,尤其是Toni Arritola。Toni教会了我如何更好地聚焦我的想法。在完成此书的过程中,她是我非常棒的合作伙伴,正是她的帮助才使本书圆满完成。
感谢所有的审稿人——Alain Lompo、Alessandro Campeis、Allan Makura、Amanda Debler、Anders Björklund、Andrea Monacchi、Camal Cakar、Clifford Thurber、Conor Redmond、David Paccoud、Deepak Sharma、Federico Kircheis、Frans Oilinki、Gowtham Sadasivam、Ibrahim Akkulak、James Liu、James Nyika、Jeremy Chen、Kent Spillner、Kevin Etienne、Kirill Shirinkin、Kosmas Chatzimichalis、Krzysztof Kamyczek、Larry Cai、Michael Bright、Mladen Knežić、Oliver Korten、Richard Meinsen、Roman Zhuzha、Rui Liu、Satadru Roy、Seung-jin Kim、Simeon Leyzerzon、Simone Sguazza、Syed Ahmed、Thomas Peklak和Vivek Veerappan,感谢你们,你们的修改建议让本书变得更好。
本书主要介绍了如何构建、管理和运行容器,写作目标是阐述如何将人们在Docker中学到的技能轻松地转移到Podman上,以及如果你从未使用过容器引擎,应该如何轻松地学习使用Podman。本书还将教会你使用像pod这样的高级功能,并指导你构建准备在Kubernetes边缘或内部运行的应用程序。最后,本书介绍了Linux内核中用于将容器与系统及其他容器进行隔离的所有安全功能。
本书适用于希望了解、开发和使用容器的软件开发人员,以及需要在生产环境中运行容器的系统管理员。阅读本书将让你更深入地理解容器是什么。具备Linux进程相关知识且熟悉Linux Shell的用法对于充分理解本书很有必要。
对所有探索容器使用方法的人来说,阅读本书都会有所收获。对Docker有深刻理解的用户也会从书中了解到一些Docker不提供而Podman拥有的高级功能,并会对Docker的工作原理有更深入的理解。初学者还将学到容器和pod的相关基础知识。
本书包括4部分和6个附录。
■ 第1部分“基础”,包括4章,介绍了Podman的基础内容。第1章解释了Podman的功能、Podman项目的发起原因以及为什么它很重要。接下来的两章介绍Podman命令行界面和如何在容器内使用卷。第4章介绍pod的概念以及如何在Podman中使用pod。这些章节适合各种水平的读者阅读,但如果你在Docker方面拥有丰富的实践经验,则可以快速浏览第2章的大部分内容。
■ 第2部分“设计”,包括两章,深入探讨了Podman的设计。在这部分,你将了解非特权容器及其工作原理,更好地理解用户命名空间和非特权容器的安全性,以及学习如何自定义Podman的环境配置。
■ 第3部分“高级主题”,包括3章,内容超越了Podman的基础知识。在第7章中,你将了解到通过与systemd集成,Podman如何在生产环境中运行。它涵盖了在容器内运行systemd以及如何将其用作容器管理器等内容。你将学习如何使用Podman和systemd在边缘设备上管理容器化服务的生命周期。Podman使得生成systemd单元文件变得简单,从而帮助你将容器化应用程序更快地投入生产环境。在第8章中,你将了解到如何使用Podman将容器迁移到Kubernetes中。Podman支持使用与Kubernetes相同的YAML文件来启动容器,并能够从当前容器生成Kubernetes YAML。在第9章中,你将看到Podman可以作为服务运行,从而允许远程访问Podman容器。基于Podman服务,你可以使用其他编程语言和工具来管理Podman容器。你还将了解到docker-compose如何与Podman容器配合使用,以及学习如何使用Python库(如podman-py和docker-py)与Podman服务通信,以达到管理容器的目的。
■ 第4部分“容器安全”,包括两章,讨论重要的安全注意事项。第10章介绍确保容器隔离的功能。该章涵盖了Linux的安全子系统,如SELinux、seccomp、Linux能力、内核文件系统和命名空间。随后的第11章详细讨论了一些安全注意事项。我认为,如果要以尽可能安全的方式运行容器,则可以将这些安全注意事项当作最佳实践。
此外,6个附录涵盖了与Podman相关的主题。
■ 附录A介绍了与Podman相关的工具,包括Skopeo、Buildah和CRI-O。
■ 附录B深入介绍了Podman和Docker中可用的各种OCI运行时,包括runc、crun、Kata和gVisor。
■ 附录C描述了如何将Podman安装到本地系统,无论该系统是Linux、macOS还是Windows。
■ 附录D介绍了Podman开源社区以及如何加入社区。
■ 附录E和F分别深入介绍了在使用macOS和Windows系统的机器上运行Podman的方法。
丹尼尔·沃尔什(Daniel Walsh)领导了创建Podman、Buildah、Skopeo、CRI-O及其相关工具的团队。他是Red Hat公司的杰出高级工程师,于2001年8月加入该公司。他在计算机安全领域工作了40多年。在领导容器团队之前,他曾在Red Hat公司领导SELinux的开发,因此有时被称为“SELinux先生”。他拥有圣十字学院(College of the Holy Cross)的数学学士学位和伍斯特理工学院(Worcester Polytechnic Institute)的计算机科学硕士学位。你可以在GitHub上找到他的账号(@rhatdan),也可以通过电子邮件联系他,他的邮箱为dwalsh@redhat.com。
本书封面上的插图被称为“La Vandale”,意为“破坏者”,它来自Jacques Grasset de Saint-Sauveur于1797年出版的一本作品集(其中的每个插图都是手工精心绘制和上色的)。在那个时代,人们可以通过服饰轻松地辨别一个人的居住地、职业和社会地位。本书的封面来自这本作品集中的图片,以此颂扬计算机行业的创新和进取精神。