一份写给开发者的容器生态指南:Docker、Docker Compose 与 Kubernetes
·
一份写给开发者的容器生态指南:Docker、Docker Compose 与 Kubernetes
从“单机容器”到“多服务编排”,再到“生产级集群调度”,这三者构成了云原生时代最核心的技能树。
前言:它们到底在解决什么问题?
很多初学者容易把这三种技术混为一谈,甚至觉得它们是“竞品”。其实不然:
- Docker 是地基,解决的是“单个容器如何运行”的问题。
- Docker Compose 是项目管理工具,解决的是“本地/单机环境下如何同时管理多个关联容器”的问题。
- Kubernetes (K8s) 是集群操作系统,解决的是“大规模生产环境下,成千上万个容器如何自动调度、自愈和滚动更新”的问题。
简单一句话:Docker 是“单兵”,Compose 是“班排战术”,Kubernetes 是“集团军作战指挥系统”。
一、核心定位与哲学对比
| 维度 | Docker | Docker Compose | Kubernetes |
|---|---|---|---|
| 设计目标 | 标准化应用打包(镜像)和单容器运行 | 定义、运行多容器应用(一个项目) | 自动化容器的部署、扩展和管理(集群) |
| 使用场景 | 本地开发测试、构建镜像、运行临时工具 | 本地微服务开发环境、单机集成测试 | 生产环境、大规模分布式系统、弹性伸缩 |
| 配置文件 | 命令行参数(或 Dockerfile) | docker-compose.yml (YAML) |
多种资源清单 (Pod, Service, Ingress, Deployment 等 YAML) |
| 网络模式 | 需手动创建 Bridge/Overlay 网络 | 自动为项目创建独立网络,服务间自动 DNS 解析 | 扁平化的 Cluster IP / Service Mesh,复杂的网络策略 |
| 数据持久化 | Volume 挂载(手动管理) | 同 Docker,但支持定义命名卷 | PV (PersistentVolume) / PVC (PersistentVolumeClaim) 抽象存储层 |
| 学习曲线 | ⭐⭐ (简单) | ⭐⭐⭐ (中等) | ⭐⭐⭐⭐⭐ (陡峭) |
二、常用命令速查表(实用主义)
这里整理了日常开发运维中最高频的命令,按工具分类,方便手边查阅。
1. Docker 常用命令(单机单容器)
# ---------- 生命周期管理 ----------
docker run -d --name nginx -p 80:80 nginx:latest # 后台运行并映射端口
docker ps -a # 查看所有容器状态
docker stop <容器ID> # 停止容器
docker start <容器ID> # 启动已停止的容器
docker restart <容器ID> # 重启容器
docker rm -f <容器ID> # 强制删除容器
# ---------- 镜像与构建 ----------
docker images # 查看本地镜像列表
docker pull ubuntu:22.04 # 拉取远程镜像
docker build -t my-app:v1 . # 基于 Dockerfile 构建镜像
docker rmi <镜像ID> # 删除本地镜像
# ---------- 调试与交互 ----------
docker logs -f <容器ID> # 滚动查看容器日志
docker exec -it <容器ID> /bin/bash # 进入容器内部交互式终端
docker inspect <容器ID> # 查看容器底层配置元数据
docker cp ./file.txt <容器ID>:/app/ # 宿主机与容器互传文件
# ---------- 清理 ----------
docker system prune -a -f # 一键清理所有未使用的容器、镜像、网络(危险操作)
2. Docker Compose 常用命令(多服务编排)
前提:需在包含
docker-compose.yml的目录下执行。
# ---------- 启动与停止 ----------
docker-compose up -d # 后台启动当前 YAML 中的所有服务
docker-compose down # 停止并移除所有容器、默认网络
docker-compose down -v # 移除容器、网络及关联的数据卷(谨慎)
docker-compose restart # 重启所有服务
# ---------- 扩容与更新 ----------
docker-compose up -d --scale web=3 # 将 web 服务实例扩容到 3 个
docker-compose up -d --build # 重新构建镜像并重启服务(代码更新后常用)
# ---------- 状态与日志 ----------
docker-compose ps # 查看当前项目下的容器状态
docker-compose logs -f # 滚动查看所有服务的聚合日志
docker-compose logs -f web # 只看 web 服务的日志
# ---------- 单服务操作 ----------
docker-compose exec web /bin/bash # 进入 web 服务所在容器的终端
docker-compose build web # 仅重新构建 web 服务镜像
# ---------- 启动与停止 ----------
docker-compose up -d # 后台启动当前 YAML 中的所有服务
docker-compose down # 停止并移除所有容器、默认网络
docker-compose down -v # 移除容器、网络及关联的数据卷(谨慎)
docker-compose restart # 重启所有服务
# ---------- 扩容与更新 ----------
docker-compose up -d --scale web=3 # 将 web 服务实例扩容到 3 个
docker-compose up -d --build # 重新构建镜像并重启服务(代码更新后常用)
# ---------- 状态与日志 ----------
docker-compose ps # 查看当前项目下的容器状态
docker-compose logs -f # 滚动查看所有服务的聚合日志
docker-compose logs -f web # 只看 web 服务的日志
# ---------- 单服务操作 ----------
docker-compose exec web /bin/bash # 进入 web 服务所在容器的终端
docker-compose build web # 仅重新构建 web 服务镜像
3. Kubernetes 常用命令(生产级集群)
注:K8s 命令通常通过
kubectl与kubeconfig认证文件配合使用。
# ---------- 资源查看(灵魂命令) ----------
kubectl get nodes # 查看集群节点状态
kubectl get pods -o wide # 查看 Pod 详细分布(IP+节点)
kubectl get svc,deploy,sts # 同时查看 Service、Deployment、StatefulSet
kubectl get all -n <namespace> # 查看指定命名空间下所有资源
# ---------- 创建与更新 ----------
kubectl apply -f deployment.yaml # 创建或更新资源(声明式)
kubectl create deployment nginx --image=nginx # 命令行快速创建(命令式,不常用)
kubectl delete -f deployment.yaml # 删除 YAML 中定义的资源
kubectl scale deploy web --replicas=5 # 将 web 部署动态扩缩容至 5 个副本
# ---------- 调试与排障 ----------
kubectl logs -f <pod-name> # 查看 Pod 日志(类似 docker logs)
kubectl exec -it <pod-name> -- /bin/bash # 进入容器终端
kubectl describe pod <pod-name> # 查看 Pod 的事件和详细状态(排查 CrashLoopBackOff 利器)
kubectl port-forward pod/<pod-name> 8080:80 # 将本地 8080 端口映射到 Pod 的 80 端口(调试利器)
# ---------- 高级运维 ----------
kubectl rollout status deploy/web # 查看滚动更新状态
kubectl rollout undo deploy/web # 回滚到上一个版本
kubectl top nodes # 查看节点资源使用率(需安装 metrics-server)
# ---------- 资源查看(灵魂命令) ----------
kubectl get nodes # 查看集群节点状态
kubectl get pods -o wide # 查看 Pod 详细分布(IP+节点)
kubectl get svc,deploy,sts # 同时查看 Service、Deployment、StatefulSet
kubectl get all -n <namespace> # 查看指定命名空间下所有资源
# ---------- 创建与更新 ----------
kubectl apply -f deployment.yaml # 创建或更新资源(声明式)
kubectl create deployment nginx --image=nginx # 命令行快速创建(命令式,不常用)
kubectl delete -f deployment.yaml # 删除 YAML 中定义的资源
kubectl scale deploy web --replicas=5 # 将 web 部署动态扩缩容至 5 个副本
# ---------- 调试与排障 ----------
kubectl logs -f <pod-name> # 查看 Pod 日志(类似 docker logs)
kubectl exec -it <pod-name> -- /bin/bash # 进入容器终端
kubectl describe pod <pod-name> # 查看 Pod 的事件和详细状态(排查 CrashLoopBackOff 利器)
kubectl port-forward pod/<pod-name> 8080:80 # 将本地 8080 端口映射到 Pod 的 80 端口(调试利器)
# ---------- 高级运维 ----------
kubectl rollout status deploy/web # 查看滚动更新状态
kubectl rollout undo deploy/web # 回滚到上一个版本
kubectl top nodes # 查看节点资源使用率(需安装 metrics-server)
三、从 Compose 到 K8s:他们不是替代品,而是上下游
很多人会问:“既然有了 Kubernetes,Docker Compose 还有用吗?”
答案是:不仅有用,而且是开发环节不可或缺的。
正确的软件生命周期流转路径应该是:
- 开发阶段:使用 Docker Compose。开发者在本地 Mac/Windows 上跑起完整的微服务依赖(MySQL, Redis, MQ),修改代码后
docker-compose up --build,秒级验证。 - 镜像构建:使用 Docker。将应用打包成标准的 OCI 镜像,推送到 Harbor/Docker Hub。
- 生产部署:使用 Kubernetes。运维或 CI/CD 系统将镜像拉取到 K8s 集群,通过 Deployment 和 Service 暴露服务,利用 HPA (Horizontal Pod Autoscaler) 应对流量高峰。
为什么在 K8s 时代还要学 Compose?
- 本地仿真:K8s 本地运行(如 Minikube 或 Kind)极其消耗资源。Compose 轻量且启动快,最适合作为 “单元测试环境” 。
- 开发效率:Compose 支持
depends_on和健康检查,能够完美模拟微服务间的调用关系,且文件可读性极高。 - 转型桥梁:K8s 官方提供了
kompose工具,可以将docker-compose.yml自动转换为 K8s 的 Deployment 和 Service 资源清单,帮助团队从单机向集群平稳过渡。
四、生产环境抉择指南
| 你的需求 | 推荐方案 | 原因 |
|---|---|---|
| 个人技术尝鲜,跑一个 WordPress 或 Nginx | Docker | 干净利落,一个命令搞定。 |
| 团队本地开发,服务多(如 Spring Cloud + MySQL + ES) | Docker Compose | 配置存于 Git,团队成员环境一致,一键 up 启动。 |
| 公司业务上线,要求高可用、7x24小时、自动恢复 | Kubernetes | 提供自愈能力、滚动更新、灰度发布和强大的服务发现机制。 |
| 边缘计算或资源极其受限的物联网网关 | Docker(或精简后的 K3s) | 重量级 K8s 无法运行,单容器最省资源。 |
写在最后
Docker 是基本功,不懂 Docker 直接去学 K8s,犹如不会打字直接学编程;
Compose 是提效器,它让你在开发中不必忍受繁琐的docker run参数;
K8s 是终极形态,它解决了分布式世界里最棘手的稳定性与扩展性问题。
更多推荐




所有评论(0)