Kubernetes 和 Docker 的区别与联系
Docker 是什么?
想象一下你有一个玩具盒子(容器),你可以把你的玩具(应用程序)放进这个盒子里。Docker 就是这样一个工具,它允许你创建这些“玩具盒子”,每个盒子里面可以装一个独立的应用程序及其所有依赖项。这样,无论是在家里的桌子上还是在学校里,你都可以轻松地拿出你的玩具来玩,因为所有的配件都在盒子里。
Kubernetes 是什么?
现在,想象你有很多个这样的玩具盒子,并且你想确保它们都能正确工作,不会互相干扰,还能自动恢复如果某个盒子坏了。Kubernetes 就像是一个超级管理员,它可以管理大量的玩具盒子,确保它们按照规则运行,甚至可以在需要的时候为你添加更多的盒子。
所以,Docker 是用来创建和运行单个容器的工具,而 Kubernetes 是用来管理和编排多个容器的平台。你可以将 Docker 想象成制造玩具盒子的机器,而 Kubernetes 则是管理这些盒子的仓库管理员。
使用场景
-
Docker:
- 开发环境:让开发者在本地机器上拥有一个一致的开发环境。
- 测试环境:快速复制出多个容器用于不同的测试任务。
- 微服务架构:为每个微服务创建独立的容器,便于部署和维护。
-
Kubernetes:
- 大规模应用部署:管理数百甚至数千个容器的应用部署,确保高可用性和弹性扩展。
- 持续集成/持续部署(CI/CD):自动化地构建、测试和部署应用。
- 云原生应用:支持现代云原生应用的生命周期管理,如自我修复、滚动更新等。
底层原理
-
Docker:
- 命名空间(Namespaces):为每个容器创建一个隔离的运行环境。
- 控制组(cgroups):限制容器使用的资源(CPU、内存等)。
- 镜像(Images):打包应用程序及其依赖,形成可移植的容器镜像。
-
Kubernetes:
- Pods:最小的部署单元,通常包含一个或多个紧密相关的容器。
- Service:定义一组 Pod 的逻辑集合和访问策略,提供稳定的网络端点。
- Controller:确保集群中的状态与预期状态相匹配,例如维持特定数量的副本。
- Scheduler:决定将 Pod 放置在哪台物理机或虚拟机上运行。
- Etcd:分布式键值存储,用于保存集群的状态信息。
示例代码和详细注释
假设我们有一个简单的 PHP Web 应用程序和 MySQL 数据库的组合,并且我们想了解如何在 Docker 和 Kubernetes 中管理和部署它们。
目录结构
my_php_app/
├── docker-compose.yml
├── k8s/
│ ├── deployment.yaml
│ └── service.yaml
├── php/
│ └── Dockerfile
└── web/
└── index.php
index.php
内容(简化版)
<?php
// 连接MySQL数据库并查询一条记录
$host = getenv('DB_HOST') ?: 'db'; // 注意这里使用的是环境变量或默认的容器名称作为主机名
$username = 'user';
$password = 'password';
$database = 'mydb';
try {
$pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password