Docker、开发人员的最佳实践以及下一步是什么?

2025-06-10

Docker、开发人员的最佳实践以及下一步是什么?

本文部分内容最初发表于“ HackerNoon

如今,每家公司都在转型成为软件公司,软件开发也正以创纪录的速度蓬勃发展。
在当今的云市场中,每天都有众多 DevOps 工具和方法涌现。人们的选择如此之多,以至于竞争达到了顶峰,这反过来又给这些软件公司带来了压力,迫使他们不断提供比竞争对手更优秀的产品和服务。

随着云方法的日益普及,许多公司开始拥抱云实践和容器化等概念,这意味着像Docker这样的 DevOps 工具需求旺盛。在本文中,我们将了解一些与 Docker 相关、对开发人员和架构师有用的知识。

虚拟机和Docker的演变:

很久以前,在 Docker 和容器出现之前,大公司会购买大量服务器,以确保其服务和业务不会中断。这通常意味着公司购买的服务器数量超出实际需求,成本极其高昂。但他们必须这样做,因为随着越来越多的用户访问他们的服务器,他们希望确保服务器能够良好扩展,避免宕机或中断。
后来,VMware 和 IBM(关于谁是第一个推出虚拟化技术的,至今仍存在争议)推出了虚拟化技术,使我们能够在同一主机上运行多个操作系统。这改变了游戏规则,但多内核和多操作系统似乎也非常昂贵。
因此,快进到现代容器化时代,我们有了“Docker”这家公司,它解决了许多问题。

为什么开发人员喜欢 Docker?

Docker 使开发人员能够轻松地在精心打包的虚拟容器环境中开发和部署应用程序。这意味着无论应用程序位于何处、在哪台机器上运行,都能以相同的方式运行。Docker
容器几乎可以部署到任何机器上,而不会出现任何兼容性问题,因此您的软件与系统无关,从而使软件更易于使用、开发工作更少、维护和部署更轻松。简而言之,“它在我的机器上运行正常”的时代已经一去不复返了。

开发人员通常会首先访问 Docker Hub(一个 Docker 容器的在线云存储库),然后拉取一个包含针对其特定编程语言(例如 Ruby 或 NodeJS)的预配置环境,其中包含启动所需的所有文件和框架。Docker 就是这样一个真正兑现了“构建、交付和运行”承诺的工具。

全球乃至整个行业,许多公司和机构都在使用 Docker 来加速开发流程。PayPal 目前拥有 700 多个应用程序,并已将其全部转换为基于容器的应用程序。他们运行着 15 万个容器,这帮助他们将开发效率提高了 50%。

另一个很好的例子是大都会人寿保险公司 (MetLife),他们在基础设施方面节省了大量成本,因为他们能够使用更少的操作系统来管理更多应用程序。这让他们节省了大量硬件资源,从而在基础设施和成本削减方面节省了大量资金。迁移到 Docker 后,大都会人寿的虚拟机成本降低了 70%,CPU 数量减少了 67%,平均 CPU 利用率提高了 10 倍,成本降低了 66%。这就是 Docker 的强大之处。

Docker 为何如此受欢迎?

  • 轻的
  • 便携的
  • 快速地
  • 没有虚拟机管理程序

Docker 是一种虚拟化形式,但与虚拟机不同的是,它的资源直接与主机共享。这使得你能够在只能运行少量虚拟机的地方运行多个 Docker 容器。

虚拟机必须隔离一定数量的资源,例如硬盘空间、内存、处理能力,模拟硬件并启动整个操作系统。然后,虚拟机通过运行在主机操作系统上的翻译应用程序(称为“虚拟机管理程序”)与主机计算机进行通信。

另一方面,Docker 原生与系统内核通信,绕过了 Linux 机器上的中间人,甚至在 Windows 10、Windows Server 2016 及更高版本上也是如此。
这意味着您可以在容器中运行任何版本的 Linux,并且它都能原生运行。不仅如此,Docker 占用的磁盘空间也更少。

虚拟化与容器化:

虚拟化与容器化
来源:这张图片在互联网上随处可见,但我是在 Nick Janetakis 的教程中第一次看到它的

在虚拟化中,基础架构代表着您的服务器是裸机——主机可以是您的笔记本电脑或台式机。在此之上,我们拥有操作系统,例如 Windows 服务器,或者您的个人笔记本电脑,Mac OS 或 Linux 发行版。
在虚拟化中,我们有一个称为虚拟机管理程序 (Hypervisor) 的东西。因为我们运行的是这些虚拟机,它们本质上是文件内部独立的桌面环境,所以虚拟机管理程序会理解如何读取该文件。这就是虚拟机映像,而像 VMware 和 VirtualBox 这样的常见虚拟机管理程序知道如何解释这些操作系统。

除此之外,我们还有实际的客户操作系统。每个客户操作系统都有自己的内核,从资源分配的角度来看,这会导致开销增加。
在操作系统之上,我们实际安装二进制文件和库,最后,我们可以将所有文件复制到这个操作系统上,这个操作系统实际上构成了我们想要部署到服务器上的应用程序。

现在让我们将其与容器化进行对比。容器化中,我们有基础设施和操作系统,但没有虚拟机管理程序 (Hypervisor)。它有一个直接在操作系统上运行的进程,称为 Docker Daemon,它负责管理在系统上运行容器、镜像以及 Docker 附带的所有命令实用程序。
我们在这些镜像中运行的应用程序基本上直接在主机上运行。我们创建的镜像就像是我们要分发的应用程序的副本,而镜像的运行实例就是所谓的容器。
容器化基本上解决了“它在我的机器上运行正常,但在他们的机器上却不行”的问题。

Docker术语:

镜像:镜像本质上是一个可执行包,包含运行应用程序所需的一切,包括配置文件、环境变量、运行时和库。Dockerfile
:包含构建 Docker 镜像的所有指令。它本质上是一个简单的文本文件,其中包含构建镜像的指令。您也可以将其称为 Docker 镜像创建的自动化。

  • 构建:从 Dockerfile 创建图像快照。

  • 标签:图片的版本。每张图片都会有一个标签名称。

  • 容器:从特定镜像版本创建的轻量级软件包/单元。

  • DockerHub:图像存储库,我们可以在其中找到不同类型的图像。

  • Docker Daemon:Docker 守护进程在主机系统上运行。用户无法直接与 Docker 守护进程通信,只能通过 Docker 客户端进行通信。

  • Docker 引擎:允许您创建和运行 Docker 容器的系统。

  • Docker 客户端:它是 Docker 二进制格式的主要用户界面。Docker 守护进程将接收来自用户的 docker 命令,并与 Docker 守护进程进行身份验证。

  • Docker 镜像仓库:Docker 镜像仓库是一个存储 Docker 镜像的解决方案。此服务负责托管和分发镜像。默认镜像仓库是 Docker Hub。

使用 Docker 拥抱 DevOps:

Docker 作为一种工具,完美契合 DevOps 生态系统。它专为那些紧跟技术快速变化的现代软件公司而打造。在您的 DevOps 工具链中,Docker 不可或缺;它已成为事实上的必备工具,几乎无可替代。Docker
之所以能够如此出色地支持 DevOps,是因为它丰富的用例和优势,它通过将应用程序容器化,从而简化开发流程并加快发布周期,为软件开发流程带来了诸多优势。

Docker 可以解决大多数开发和运维问题,而最主要的问题是“它在我的机器上运行良好”,这使得两个团队能够有效协作,高效工作。
根据RightScale 2019 年云现状报告,Docker 凭借惊人的年增长率,在容器领域占据了主导地位。
使用 Docker,您可以创建不可变的开发、暂存和生产环境。由于所有更改都是使用不可变的 Docker 镜像和容器进行的,因此您将对所有更改拥有高度的控制权。如果您愿意,可以随时回滚到之前的版本。


开发、预发布和生产环境变得更加相似。使用Docker,可以保证如果某个功能在开发环境中有效,那么它在预发布和生产环境中也能正常工作。Datadog对其客户群进行了抽样调查,涵盖超过 10,000 家公司和 7 亿个容器。调查报告显示,截至 2018 年 4 月初,23.4% 的 Datadog 客户已采用 Docker,高于一年前的 20.3%。自 2015 年以来,运行 Docker 的客户比例以每年约 3 到 5 个百分点的速度增长。

Docker最佳实践:

在接触 Docker 之前,你必须了解一些最佳实践,才能最大限度地利用这个工具的优势。以下列出了一些需要牢记的 Docker 最佳实践:

  • 构建镜像只做一件事(另请参阅Docker 镜像的安全最佳实践

  • 使用标签来引用图像的特定版本

  • 更喜欢极简的基础镜像

  • 使用多阶段构建

  • 尽可能不要使用 root 用户

  • 使用官方的、专用的图像

  • 启用Docker 内容信任

  • 使用 Docker Bench 确保安全

  • 使用Artifactory 管理 Docker 镜像

  • 利用 Docker 企业功能获得额外保护

  • 编写docker文件始终至关重要,构建轻薄且智能的docker镜像,而不是臃肿的docker镜像

  • 将数据保存在容器外

  • 使用 Docker compose 作为基础设施即代码,并使用标签进行跟踪

  • 基于角色的访问控制

  • 不要将用户凭证/密钥/关键数据添加到镜像中。将其用作部署变量

  • 利用docker 缓存,如果可能的话,尝试将“COPY . .”推送到 Dockerfile 的最后一行

  • 使用 .dockerignore 文件

  • 不要安装调试工具来减小镜像大小

  • 始终对 docker/containers 使用资源限制

  • 对小型应用程序使用 Swarm 模式

  • 不要盲目相信 DockerHub 的下载!务必验证!更多信息,请参阅“ DockerHub 漏洞可能影响深远

  • 使用调整好的内核参数制作 Docker 镜像

  • 使用alpine 镜像

Docker 是一项非常出色的技术,拥有很高的采用率,使其成为拥抱 DevOps 实践的默认工具。Docker 已经帮助多家公司开启了数字化转型。

数百万用户依赖 Docker,每天下载 1 亿甚至更多的容器镜像(根据其博客),超过 450 家公司已转向 Docker 企业版,其中包括一些全球最大的企业。
但最近,Docker 被 Mirantis 收购,这可能会对开发者社区产生巨大影响。问题在于,Docker 推出 Docker Swarm 的战略方针并没有带来足够的收益,而 Kubernetes 则席卷了整个市场,几乎扼杀了 Docker Swarm。这促使他们与一家在 Kubernetes 和 Openstack 领域并肩作战、帮助企业快速部署的公司合作。

虽然所有这些优秀的公司都在转型,但受影响最大的却是开发者。这些公司被收购,明年它们可能还是原来的它们,也可能不再是原来的它们。现在是时候采取行动了

鏂囩珷鏉ユ簮锛�https://dev.to/pavanbelagatti/docker-best-practices-for-developers-what-next-1fjk
PREV
Docker 开发者入门
NEXT
面向开发人员的 Agentic RAG!