容器化技术已经成为现代云计算和DevOps的核心组成部分,而 DockerKubernetes(K8S) 是其中最重要的两个工具。很多人对它们的定位和关系感到困惑:

  • Docker 负责什么?
  • Kubernetes 又负责什么?
  • 它们的网络模型有何不同?

本文将从 架构定位、核心功能、网络模型 三个方面深入对比,帮助你彻底理解二者的关系与差异。


1. Docker 与 Kubernetes 的定位与关系

(1) Docker:单机容器运行时

  • 核心功能
    • 创建、运行和管理单个容器(应用打包与隔离)。
    • 提供镜像构建(Dockerfile)和分发(Docker Hub)。
  • 适用场景
    • 本地开发、测试环境。
    • 单机部署简单应用。

(2) Kubernetes:容器编排系统

  • 核心功能
    • 管理多个容器化应用的部署、伸缩、负载均衡。
    • 自动化运维(自愈、滚动更新、服务发现)。
  • 适用场景
    • 生产环境的大规模集群管理。
    • 微服务架构(数百个容器的协同)。

类比理解

  • Docker 像是一台“集装箱卡车”,负责单个容器的运输。
  • Kubernetes 像是“全球物流系统”,调度成千上万的卡车和集装箱。

2. 核心区别对比

特性 Docker Kubernetes (K8S)
核心目标 创建和运行容器 编排和管理多个容器
集群支持 单机(需 Swarm 扩展集群能力) 原生支持多节点集群
伸缩性 手动 自动扩缩容(HPA)
服务发现 需手动配置或依赖第三方工具 内置 DNS 和服务发现(Service)
存储管理 本地卷或插件 支持 PV/PVC(动态存储)
网络模型 单机网络(bridge/host/none) 集群级网络(CNI 插件)

3. 网络模型详解

(1) Docker 网络

Docker 的网络是单机级别的,主要模式包括:

  • bridge(默认)
    • 容器通过虚拟网桥(docker0)通信,分配私有 IP。
    • 外部访问需端口映射(-p 8080:80)。
      1
      docker run -p 8080:80 nginx  # 映射主机端口
  • **host**:
    • 容器直接使用主机网络栈(无隔离,性能高)。
      1
      docker run --network=host nginx
  • **none**:
    • 无网络(仅用于特殊场景)。

局限性

  • 跨主机通信需手动配置(如 Overlay 网络或第三方工具)。

(2) Kubernetes 网络

K8S 的网络是集群级别的,核心要求:

所有 Pod 之间可以直接通信(无论是否在同一节点)。

关键组件

  1. Pod 网络

    • 每个 Pod 拥有唯一 IP(容器共享网络命名空间)。
    • 通过 CNI(Container Network Interface)插件实现:
      • Calico(BGP 路由)
      • Flannel(Overlay 网络)
      • Cilium(eBPF 高性能)
  2. Service 网络

    • 为 Pod 提供稳定的虚拟 IP(VIP)和负载均衡。
    • 类型包括:
      • ClusterIP(集群内访问)
      • NodePort(主机端口暴露)
      • LoadBalancer(云厂商 LB 集成)
  3. Ingress

    • 管理外部 HTTP/S 流量路由(如 Nginx Ingress Controller)。

示例流量路径

graph LR
    A[外部用户] --> B[Ingress]
    B --> C[Service]
    C --> D[Pod 1]
    C --> E[Pod 2]

4. 如何选择?

  • 只用 Docker

    • 适合本地开发、单机应用。
    • 例子:快速运行一个 PostgreSQL 容器。
      1
      docker run -d --name postgres -e POSTGRES_PASSWORD=123456 postgres
  • 使用 Kubernetes

    • 适合生产环境、微服务架构。
    • 例子:部署一个高可用的 Web 应用:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
      name: web-app
      spec:
      replicas: 3
      template:
      containers:
      - name: nginx
      image: nginx:latest

5. 常见问题解答

Q1:Docker 和 Kubernetes 必须一起用吗?

  • 不是。Docker 可以单独使用,但 K8S 需要容器运行时(如 Docker、containerd)。

Q2:K8S 替代 Docker 了吗?

  • 不是替代关系,而是互补。Docker 负责“容器化”,K8S 负责“编排”。

Q3:K8S 网络为什么比 Docker 复杂?

  • Docker 只需处理单机,K8S 需解决跨主机通信、服务发现、安全策略等分布式问题。

6. 总结

维度 Docker Kubernetes
定位 容器运行时 容器编排平台
网络范围 单机 跨主机集群
适用场景 开发/测试 生产/大规模部署
学习曲线

推荐学习路径

  1. 先掌握 Docker(容器化基础)。
  2. 再学习 Kubernetes(编排与生产实践)。