一份写给开发者的容器生态指南: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 命令通常通过 kubectlkubeconfig 认证文件配合使用。

# ---------- 资源查看(灵魂命令) ----------
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 还有用吗?”

答案是:不仅有用,而且是开发环节不可或缺的。

正确的软件生命周期流转路径应该是:

  1. 开发阶段:使用 Docker Compose。开发者在本地 Mac/Windows 上跑起完整的微服务依赖(MySQL, Redis, MQ),修改代码后 docker-compose up --build,秒级验证。
  2. 镜像构建:使用 Docker。将应用打包成标准的 OCI 镜像,推送到 Harbor/Docker Hub。
  3. 生产部署:使用 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 是终极形态,它解决了分布式世界里最棘手的稳定性与扩展性问题。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐