通过案例讲述docker,k8s,docker compose三者的关系
以下是一个结合 Docker、Docker Compose 和 Kubernetes(k8s)的案例,展示三者在应用开发、本地测试和生产部署中的协作关系:
案例背景
假设我们要开发一个 Web 应用,包含以下组件:
- 前端:Node.js 编写的 Web 界面
- 后端:Python Flask 编写的 API 服务
- 数据库:MySQL 数据库
阶段 1:开发环境(Docker 和 Docker Compose)
目标:在本地快速启动所有服务,方便开发和调试。
-
使用 Docker 容器化每个组件:
- 为每个服务(前端、后端、数据库)编写
Dockerfile
,定义容器镜像的构建规则。 - 例如,后端服务的 Dockerfile:
FROM python:3.9 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["flask", "run", "--host=0.0.0.0"]
- 为每个服务(前端、后端、数据库)编写
-
使用 Docker Compose 编排服务:
- 编写
docker-compose.yml
,定义服务间的依赖关系和网络配置:version: '3' services: frontend: build: ./frontend ports: - "3000:3000" backend: build: ./backend ports: - "5000:5000" environment: - DB_HOST=mysql mysql: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=secret
- 编写
-
一键启动所有服务:
docker-compose up
- Docker Compose 会按顺序启动 MySQL → 后端 → 前端,并自动创建容器间的专用网络。
阶段 2:本地测试(Docker Compose 的优势)
- 快速迭代:通过
docker-compose build
和docker-compose up
快速重建镜像并重启服务。 - 隔离环境:每个服务运行在独立容器中,避免本地环境依赖冲突。
- 依赖管理:MySQL 作为独立容器运行,无需在本地安装。
阶段 3:生产环境(Kubernetes 接管)
目标:将应用部署到生产集群,实现高可用、自动扩缩容和故障恢复。
-
将 Docker 镜像推送到镜像仓库:
docker-compose build docker tag frontend my-registry/frontend:v1 docker push my-registry/frontend:v1 # 类似推送后端和数据库镜像
-
编写 Kubernetes 部署文件:
- 为每个服务创建 Kubernetes 资源(如
Deployment
和Service
)。 - 例如,后端服务的 Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: backend-deployment spec: replicas: 3 selector: matchLabels: app: backend template: metadata: labels: app: backend spec: containers: - name: backend image: my-registry/backend:v1 env: - name: DB_HOST value: mysql-service
- 为每个服务创建 Kubernetes 资源(如
-
使用 Kubernetes 部署:
kubectl apply -f mysql-deployment.yaml kubectl apply -f backend-deployment.yaml kubectl apply -f frontend-deployment.yaml
- Kubernetes 会在集群中调度容器,管理副本、网络和负载均衡。
-
生产环境能力:
- 自动扩缩容:根据 CPU 使用率自动扩展后端副本数。
- 服务发现:通过
mysql-service
名称自动解析数据库地址。 - 故障恢复:如果某个容器崩溃,Kubernetes 会自动重启它。
三者的核心关系总结
工具 | 角色 | 适用场景 |
---|---|---|
Docker | 容器化单个服务 | 构建和运行单个容器 |
Docker Compose | 编排多个容器(单机环境) | 本地开发、测试环境 |
Kubernetes | 编排容器集群(分布式环境) | 生产环境、大规模部署 |
关键协作流程
- 开发阶段:用 Docker 容器化每个组件,用 Docker Compose 简化多容器协作。
- 测试阶段:通过 Docker Compose 在本地模拟完整环境。
- 生产阶段:用 Kubernetes 管理容器集群,实现高可用和自动化运维。
注:从 Docker Compose 到 Kubernetes 的过渡工具(如
kompose convert
)可将docker-compose.yml
转换为 Kubernetes 资源文件,但生产环境通常需要手动优化配置。