长期以来,软件开发一直与软件部署、维护和运营相隔离。
然而,随着 Docker 的出现,开发人员现在可以轻松地了解部署、配置和操作,从而产生了我们今天所知的DevOps—— 业界最受追捧和高薪的角色之一。
Docker 容器还帮助激发了许多现在被视为标准的技术行业趋势,其中一些包括:自动化 CI/CD 管道、微服务、无服务器架构等,仅举几例。
但实际上 Docker 到底是什么!?!
Docker的定义
Docker 是一个平台,它允许我们将应用程序打包成可部署的可执行文件——称为容器,以及所有必要的操作系统库和依赖项。
这基本上意味着我们可以将我们的应用程序与正在使用的底层基础设施/硬件分开 - 实现快速开发、测试和部署。
因为 Docker 容器提供了简单高效的操作系统级虚拟化。
虚拟化是允许我们创建和管理与底层硬件隔离的虚拟资源的技术。它是云计算的动力,并被当今几乎所有的生产系统所使用。
虚拟化的主要好处是:
- 更好地利用硬件资源
- 应用程序隔离
- 改进的可扩展性和可用性
- 集中管理和安全
为什么选择 Docker?
(Docker) 容器与虚拟机的主要区别因素是容器仅虚拟化操作系统,而不是像虚拟机那样虚拟化整个物理机。
这意味着容器本身并不包含一个完整的客户操作系统,这使得它们比它的替代品更轻、更快、更便携和更灵活。
Docker 本身提供了管理容器整个生命周期的平台和工具。
Docker的主要好处:
- 简单:Docker 通过使用单个包自行管理所有繁重的虚拟化,消除了将软件开发与运营集成的巨大复杂性。
- 速度:你可以每次在几秒或几分钟内启动并运行你的应用程序,而不是花费数小时或数天来设置环境,只是为了在不同的机器或环境上重新进行。更快的生命周期意味着你的团队可以更加敏捷。
- 可移植性:由于 Docker 镜像(即容器的蓝图)一旦构建就不可更改,你可以将它们部署在任何支持 Docker 的环境中,并且它将完全按照它在本地计算机上的运行方式运行。这意味着,你可以将应用程序无缝部署到云提供商、本地或混合环境。不再有“但它适用于我的机器”的头痛!
注意:即使镜像是不可变的,你也可以通过提供环境变量或命令参数等运行时配置来更改容器的行为。 - 效率:由于容器共享主机操作系统内核的资源,与虚拟机相比,运行多个容器所需的资源要少得多。因此,硬件资源利用效率更高。
- 水平可扩展性:使用容器设计系统的主要好处之一是,你的系统组件默认情况下是隔离的。通过在系统组件之间进行隔离/松耦合,你可以独立开发和部署它们。如果某些组件比其他组件负载更密集,只需添加更多机器、运行更多容器并对其进行负载平衡以横向扩展。
这就是 Google、Netflix、Uber 等巨头实现无限可扩展性的方式! - 技术栈的自由:Docker 与堆栈无关,这意味着它不关心或限制你在容器上使用的语言、库或框架。因此,作为开发人员,你可以使用你选择的工具和框架进行创新。
这真的为像我们这样的技术爱好者打开了整个世界——如果你喜欢学习新技术并能够在项目中实际使用它们,那么你需要学习 Docker! - 开源和社区支持:开源且易于使用使得 Docker 被广泛采用,带来了协作和社区支持。它的上游存储库以Moby的形式提供。
“Docker 听起来很棒。但有什么问题?”
尽管容器很棒,但它们并不是万能的解决方案。
由于多个容器在同一主机上运行并且不虚拟化硬件,因此与 VM 相比,它们提供了较低级别的隔离。这可能会在某些利基项目中引起安全或合规问题,这可能是一个重要的考虑因素。
Docker架构
要了解 Docker,我们需要了解以下概念:
- Docker 守护进程:docker 的“大脑”——它是一个服务于 API 请求的进程,并管理 Docker 对象,如镜像、容器和卷等。如果需要,它还可以与其他 Docker 守护进程通信。
- Docker 客户端:使用 REST API 与 Docker 守护进程通信的(docker)命令行程序。
- Docker 主机:运行守护进程的(物理或虚拟)机器。
- 容器:这是启用操作系统级虚拟化的过程 - 通过打包所需的库和依赖项并提供与主机和其他容器的隔离。
- 镜像:用于创建容器的只读“蓝图”或模板。
- Registry:镜像的存储或存储库,例如 Docker Hub。
主要的 Docker 工作流程如下:
- 在你的系统上安装 Docker
- 获取你需要的 Docker 镜像:从注册表中提取镜像(通过 docker pull)并直接使用它们或在现有镜像之上构建你自己的镜像(即使用 Dockerfile 和 docker build)
- 使用这些镜像运行容器(通过 docker run / docker-compose / docker swarm 等)
笔记:
- 你必须登录到 Docker Hub 才能从中提取镜像(通过 docker login)
- 如果你尝试使用本地不存在的镜像运行容器,则 Docker 守护进程将自动尝试从 Docker Hub 拉取镜像(如果存在)。
快速演示
假设你的系统上安装了 Docker。现在,例如,要运行 Redis 容器,只需打开终端并执行:
docker run redis
“一条命令就让Redis跑起来了!”
是的,就是这么简单!
“下载档案、提取、构建二进制文件、管理配置和设置权限等怎么样?Docker 是如何实现这一点的?”
当你运行该命令时,Docker 会执行以下步骤:
- CLI(客户端)将你输入的命令转换为向守护进程发出的 REST 请求
- 守护进程检查本地是否存在“最新”的 redis镜像
- 如果没有,守护进程将从 Docker Hub 中提取镜像并将其保存在本地(根据你的互联网速度,下载镜像可能需要几秒钟/分钟)
- 然后 Daemon 使用 Image 创建一个 Container - 因为 Image 已经包含了这样做所需的所有信息
- 最后你发现你的机器上面运行了一个 Redis 服务器。
这只是一个例子。你可以类似地运行许多其他经过验证的官方预构建镜像,例如 MySQL、Ubuntu、Nginx、Apache Server 等。仅举几例。
你还可以通过扩展现有镜像来构建自己的镜像;即以你想要的语言、库或框架添加你自己的代码,并根据需要对其进行配置。
结论
通过简化虚拟化,Docker 使容器成为当今现代软件团队的事实标准。它还允许曾经害怕操作的开发人员现在可以管理和自动化它。
毫无疑问,IT 行业的任何人都将从学习 Docker 和容器中受益。
我希望它让你和我一样兴奋!
那么,让我们一起继续了解更多关于 Docker 的知识吧!
在本系列的下一篇文章中,我将详细了解docker image的工作原理、如何正确使用它们以及使用 Dockerfile 构建你自己的自定义镜像。