上一篇 下一篇 分享链接 返回 返回顶部

Docker 管打包,Kubernetes 管集群:区别、场景与常用命令一次讲清

发布人:慈云数据-客服中心 发布时间:9小时前 阅读量:4

Docker 和 Kubernetes 对比|附完整命令

在云原生技术体系中,DockerKubernetes 是两个经常被同时提起的核心技术。很多初学者容易把它们混为一谈,认为 Kubernetes 是 Docker 的替代品,或者认为学了 Docker 就等于掌握了 Kubernetes。实际上,二者的定位完全不同:Docker 更偏向于容器的构建、运行与管理,而 Kubernetes 更偏向于大规模容器集群的编排、调度和治理

本文将从概念、架构、使用场景、核心能力、优缺点以及常用命令等方面,系统对比 Docker 和 Kubernetes,并附上完整常用命令,帮助你建立清晰的技术认知。


一、Docker 是什么?

Docker 是一个开源的容器化平台,主要用于将应用程序及其依赖环境打包成一个标准化的镜像,然后在任何支持 Docker 的环境中以容器形式运行。

简单来说,Docker 解决的是:

“如何让应用在不同环境中一致地运行?”

在没有 Docker 之前,开发、测试、生产环境经常存在差异。例如开发环境使用的是 JDK 17,生产环境可能是 JDK 11;开发机有某个依赖库,服务器上却没有。Docker 通过镜像将应用和依赖统一打包,避免了“在我电脑上明明可以运行”的问题。


二、Kubernetes 是什么?

Kubernetes,简称 K8s,是一个开源的容器编排平台,最初由 Google 设计,后来捐赠给 CNCF。它主要用于自动化部署、扩缩容、负载均衡、服务发现、故障恢复以及管理大规模容器集群。

Kubernetes 解决的是:

“当容器数量很多、服务器很多时,如何自动化管理这些容器?”

如果你只有一个应用、一个容器、一台服务器,Docker 就足够了。但如果你有几十个微服务、几百个容器、几十台服务器,就需要 Kubernetes 来统一调度、编排和治理。


三、Docker 和 Kubernetes 的核心区别

对比维度 Docker Kubernetes
技术定位 容器化平台 容器编排平台
主要作用 构建、运行、管理单机容器 管理多节点、多容器集群
使用对象 镜像、容器、网络、卷 Pod、Deployment、Service、Ingress
管理范围 单机为主 集群为主
自动恢复 较弱,需要额外配置 原生支持故障自愈
自动扩缩容 不擅长 原生支持 HPA/VPA
服务发现 基础能力有限 原生支持 Service/DNS
负载均衡 需要手动或借助外部组件 原生支持
配置管理 环境变量、挂载文件 ConfigMap、Secret
学习难度 相对较低 相对较高
典型场景 本地开发、单机部署、镜像构建 生产级微服务集群部署

四、两者关系:不是替代,而是协作

Docker 和 Kubernetes 并不是简单的替代关系。

Docker 可以用来:

  • 编写 Dockerfile;
  • 构建镜像;
  • 本地运行容器;
  • 推送镜像到镜像仓库;
  • 快速搭建开发环境。

Kubernetes 可以用来:

  • 拉取镜像并运行 Pod;
  • 管理多个容器实例;
  • 实现服务发现和负载均衡;
  • 自动重启失败容器;
  • 根据流量自动扩缩容;
  • 滚动发布和回滚应用。

在真实企业环境中,常见流程如下:

开发人员编写代码
        ↓
编写 Dockerfile
        ↓
使用 Docker 构建镜像
        ↓
推送镜像到镜像仓库
        ↓
Kubernetes 从仓库拉取镜像
        ↓
Kubernetes 部署、调度、扩缩容和管理服务

也就是说,Docker 更像是“容器镜像生产工具”,Kubernetes 更像是“容器运行平台和调度系统”。


五、Docker 核心概念

1. 镜像 Image

镜像是一个只读模板,包含应用程序、运行时、依赖库、环境变量和启动命令。例如,一个 Nginx 镜像包含了运行 Nginx 所需的所有内容。

2. 容器 Container

容器是镜像运行后的实例。一个镜像可以启动多个容器。可以理解为:

镜像 = 类
容器 = 对象

3. Dockerfile

Dockerfile 是用于构建镜像的脚本文件,里面定义了基础镜像、复制文件、安装依赖、暴露端口、启动命令等内容。

4. 仓库 Registry

镜像仓库用于存储和分发镜像,例如 Docker Hub、阿里云镜像仓库、Harbor、GitHub Container Registry 等。

5. 数据卷 Volume

容器本身是临时的,删除容器后容器内部数据也可能丢失。Volume 用于持久化存储数据。


六、Kubernetes 核心概念

1. Pod

Pod 是 Kubernetes 中最小的调度单位。一个 Pod 中可以包含一个或多个容器,但常见情况下一个 Pod 只运行一个主容器。

2. Node

Node 是 Kubernetes 集群中的工作节点,可以是物理机,也可以是虚拟机。Pod 最终运行在 Node 上。

3. Deployment

Deployment 用于声明式管理 Pod,可以控制副本数量、滚动更新和版本回滚。

4. Service

Service 用于为一组 Pod 提供稳定访问入口。因为 Pod IP 会变化,Service 可以屏蔽这种变化。

5. Ingress

Ingress 用于管理集群外部访问内部服务的 HTTP/HTTPS 路由规则,通常配合 Ingress Controller 使用。

6. ConfigMap 和 Secret

ConfigMap 用于保存普通配置,Secret 用于保存敏感信息,例如密码、Token、证书等。

7. Namespace

Namespace 用于在同一个集群中进行逻辑隔离,例如 dev、test、prod 环境。


七、Docker 常用命令大全

下面列出 Docker 在日常开发和部署中最常用的命令。


1. 查看 Docker 版本和信息

docker version
docker info

2. 镜像相关命令

搜索镜像

docker search nginx

拉取镜像

docker pull nginx:latest
docker pull mysql:8.0
docker pull redis:7

查看本地镜像

docker images
docker image ls

删除镜像

docker rmi nginx:latest
docker rmi IMAGE_ID

强制删除镜像

docker rmi -f IMAGE_ID

构建镜像

docker build -t my-app:1.0 .

给镜像打标签

docker tag my-app:1.0 registry.example.com/my-app:1.0

推送镜像到仓库

docker push registry.example.com/my-app:1.0

3. 容器相关命令

创建并运行容器

docker run -d --name my-nginx -p 8080:80 nginx:latest

参数说明:

  • -d:后台运行;
  • --name:指定容器名称;
  • -p:端口映射,格式为 宿主机端口:容器端口

交互式运行容器

docker run -it ubuntu:22.04 /bin/bash

查看运行中的容器

docker ps

查看所有容器

docker ps -a

停止容器

docker stop my-nginx

启动容器

docker start my-nginx

重启容器

docker restart my-nginx

删除容器

docker rm my-nginx

强制删除运行中的容器

docker rm -f my-nginx

进入正在运行的容器

docker exec -it my-nginx /bin/bash

如果容器中没有 bash,可以使用:

docker exec -it my-nginx /bin/sh

查看容器日志

docker logs my-nginx
docker logs -f my-nginx
docker logs --tail=100 my-nginx

查看容器资源占用

docker stats

查看容器详细信息

docker inspect my-nginx

4. 网络相关命令

查看网络列表

docker network ls

创建网络

docker network create my-network

查看网络详情

docker network inspect my-network

容器连接到网络

docker network connect my-network my-nginx

容器断开网络

docker network disconnect my-network my-nginx

删除网络

docker network rm my-network

5. 数据卷相关命令

查看数据卷

docker volume ls

创建数据卷

docker volume create my-volume

查看数据卷详情

docker volume inspect my-volume

删除数据卷

docker volume rm my-volume

使用数据卷运行容器

docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v mysql-data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0

6. Docker Compose 常用命令

Docker Compose 用于定义和运行多容器应用,通常通过 docker-compose.ymlcompose.yaml 文件管理。

启动服务

docker compose up
docker compose up -d

停止服务

docker compose down

查看服务状态

docker compose ps

查看日志

docker compose logs
docker compose logs -f

重新构建并启动

docker compose up -d --build

停止但不删除容器

docker compose stop

启动已停止的服务

docker compose start

八、Kubernetes 常用命令大全

Kubernetes 的主要命令工具是 kubectl。下面按照实际工作场景整理常用命令。


1. 集群信息查看

查看 kubectl 版本

kubectl version --client

查看集群信息

kubectl cluster-info

查看节点

kubectl get nodes
kubectl get nodes -o wide

查看当前上下文

kubectl config current-context

查看所有上下文

kubectl config get-contexts

切换上下文

kubectl config use-context CONTEXT_NAME

2. Namespace 命令

查看命名空间

kubectl get namespaces
kubectl get ns

创建命名空间

kubectl create namespace dev

删除命名空间

kubectl delete namespace dev

设置默认命名空间

kubectl config set-context --current --namespace=dev

3. Pod 命令

查看 Pod

kubectl get pods
kubectl get pods -n dev
kubectl get pods -A
kubectl get pods -o wide

查看 Pod 详情

kubectl describe pod POD_NAME
kubectl describe pod POD_NAME -n dev

查看 Pod 日志

kubectl logs POD_NAME
kubectl logs -f POD_NAME
kubectl logs --tail=100 POD_NAME

如果 Pod 中有多个容器,需要指定容器名:

kubectl logs POD_NAME -c CONTAINER_NAME

进入 Pod 容器

kubectl exec -it POD_NAME -- /bin/bash
kubectl exec -it POD_NAME -- /bin/sh

如果有多个容器:

kubectl exec -it POD_NAME -c CONTAINER_NAME -- /bin/bash

删除 Pod

kubectl delete pod POD_NAME
kubectl delete pod POD_NAME -n dev

4. Deployment 命令

创建 Deployment

kubectl create deployment nginx --image=nginx:latest

查看 Deployment

kubectl get deployments
kubectl get deploy
kubectl get deployment nginx

查看 Deployment 详情

kubectl describe deployment nginx

修改副本数

kubectl scale deployment nginx --replicas=3

更新镜像

kubectl set image deployment/nginx nginx=nginx:1.25

查看发布状态

kubectl rollout status deployment/nginx

查看发布历史

kubectl rollout history deployment/nginx

回滚到上一个版本

kubectl rollout undo deployment/nginx

回滚到指定版本

kubectl rollout undo deployment/nginx --to-revision=2

删除 Deployment

kubectl delete deployment nginx

5. Service 命令

暴露 Deployment 为 Service

kubectl expose deployment nginx --port=80 --target-port=80 --type=ClusterIP

查看 Service

kubectl get services
kubectl get svc
kubectl get svc -o wide

查看 Service 详情

kubectl describe svc nginx

删除 Service

kubectl delete svc nginx

使用 NodePort 暴露服务

kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

使用 LoadBalancer 暴露服务

kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer

6. YAML 文件应用命令

Kubernetes 推荐使用 YAML 文件进行声明式管理。

应用配置

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f k8s/

删除配置

kubectl delete -f deployment.yaml
kubectl delete -f k8s/

查看 YAML 输出

kubectl get deployment nginx -o yaml

导出资源配置

kubectl get deployment nginx -o yaml > deployment.yaml

7. ConfigMap 和 Secret 命令

创建 ConfigMap

kubectl create configmap app-config --from-literal=APP_ENV=prod

从文件创建 ConfigMap

kubectl create configmap app-config --from-file=application.yaml

查看 ConfigMap

kubectl get configmap
kubectl describe configmap app-config

创建 Secret

kubectl create secret generic db-secret \
  --from-literal=username=root \
  --from-literal=password=123456

查看 Secret

kubectl get secret
kubectl describe secret db-secret

注意:Secret 默认只是 Base64 编码,并不等于强加密。生产环境建议结合密钥管理系统使用。


8. 排查问题常用命令

查看事件

kubectl get events
kubectl get events --sort-by=.metadata.creationTimestamp

查看资源使用情况

kubectl top nodes
kubectl top pods

kubectl top 依赖 metrics-server。

查看某个资源详情

kubectl describe RESOURCE_TYPE RESOURCE_NAME

例如:

kubectl describe pod nginx-xxx
kubectl describe deployment nginx
kubectl describe node node-1

临时运行调试容器

kubectl run debug --image=busybox:latest -it --rm -- /bin/sh

九、Docker 示例:部署一个 Nginx

下面演示如何使用 Docker 快速启动一个 Nginx 服务。

docker pull nginx:latest
docker run -d --name nginx-demo -p 8080:80 nginx:latest
docker ps

访问:

http://localhost:8080

查看日志:

docker logs -f nginx-demo

停止并删除:

docker stop nginx-demo
docker rm nginx-demo

这个过程非常简单,适合本地开发、测试和单机部署。


十、Kubernetes 示例:部署一个 Nginx

下面使用 Kubernetes 部署一个 Nginx,并暴露服务。

1. 创建 Deployment

kubectl create deployment nginx-demo --image=nginx:latest

2. 设置副本数量

kubectl scale deployment nginx-demo --replicas=3

3. 暴露服务

kubectl expose deployment nginx-demo \
  --port=80 \
  --target-port=80 \
  --type=NodePort

4. 查看资源

kubectl get pods -o wide
kubectl get deployment
kubectl get svc

5. 查看发布状态

kubectl rollout status deployment/nginx-demo

6. 删除资源

kubectl delete svc nginx-demo
kubectl delete deployment nginx-demo

这个过程比 Docker 复杂一些,但它可以运行多个副本,并且能够在 Pod 失败后自动拉起新的 Pod,从而具备更强的高可用能力。


十一、Dockerfile 示例

下面是一个简单的 Node.js 应用 Dockerfile 示例:

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./

RUN npm install --production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

构建镜像:

docker build -t node-app:1.0 .

运行容器:

docker run -d --name node-app -p 3000:3000 node-app:1.0

推送到仓库:

docker tag node-app:1.0 registry.example.com/node-app:1.0
docker push registry.example.com/node-app:1.0

十二、Kubernetes YAML 示例

下面是一个完整的 Deployment 和 Service 示例。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: node-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: node-app
  template:
    metadata:
      labels:
        app: node-app
    spec:
      containers:
        - name: node-app
          image: registry.example.com/node-app:1.0
          ports:
            - containerPort: 3000

保存为 deployment.yaml,执行:

kubectl apply -f deployment.yaml

Service 示例:

apiVersion: v1
kind: Service
metadata:
  name: node-app-service
spec:
  type: ClusterIP
  selector:
    app: node-app
  ports:
    - port: 80
      targetPort: 3000

保存为 service.yaml,执行:

kubectl apply -f service.yaml

查看:

kubectl get deployment
kubectl get pods
kubectl get svc

删除:

kubectl delete -f service.yaml
kubectl delete -f deployment.yaml

十三、什么时候用 Docker?

以下场景非常适合使用 Docker:

  1. 本地开发环境统一
    例如团队所有人使用相同版本的 MySQL、Redis、Nginx、JDK。

  2. 单机部署应用
    如果应用规模不大,只需要部署在一台服务器上,Docker 足够简单高效。

  3. 构建标准化镜像
    CI/CD 流程中通常使用 Docker 构建应用镜像。

  4. 快速启动中间件
    开发测试环境中,一条命令即可启动数据库、缓存、消息队列等组件。

  5. 学习容器技术基础
    Docker 是理解容器、镜像、网络、挂载和运行时的重要入口。


十四、什么时候用 Kubernetes?

以下场景更适合使用 Kubernetes:

  1. 微服务数量较多
    当系统由多个服务组成,并且需要统一部署、扩缩容、发布和治理时,Kubernetes 更合适。

  2. 需要高可用和自动恢复
    Kubernetes 可以自动检测 Pod 状态,并在异常时重新调度。

  3. 需要弹性伸缩
    根据 CPU、内存或自定义指标自动扩容和缩容。

  4. 需要滚动发布和回滚
    Kubernetes 原生支持平滑发布,降低发布风险。

  5. 多节点集群管理
    当服务器数量较多时,Kubernetes 可以统一调度资源,提高资源利用率。

  6. 生产级容器平台建设
    企业级云原生平台通常基于 Kubernetes 构建。


十五、Docker 的优缺点

优点

  • 上手快,命令简单;
  • 镜像生态丰富;
  • 非常适合开发和测试;
  • 可以显著提升环境一致性;
  • 单机部署效率高;
  • 和 CI/CD 流程结合方便。

缺点

  • 不擅长管理大规模容器;
  • 原生高可用能力有限;
  • 自动扩缩容能力不足;
  • 多主机网络和服务发现需要额外方案;
  • 生产级集群治理能力较弱。

十六、Kubernetes 的优缺点

优点

  • 支持大规模容器编排;
  • 具备自动恢复能力;
  • 支持服务发现和负载均衡;
  • 支持滚动更新和版本回滚;
  • 支持声明式配置;
  • 生态系统非常丰富;
  • 适合生产级微服务架构。

缺点

  • 学习成本较高;
  • 架构复杂;
  • 运维成本较高;
  • 对网络、存储、安全理解要求更高;
  • 小规模项目可能显得“过重”。

十七、常见误区

误区一:Kubernetes 替代 Docker

不准确。Kubernetes 不是 Docker 的直接替代品。Docker 主要用于构建和运行容器,而 Kubernetes 主要用于编排和管理容器集群。

误区二:学 Kubernetes 可以不学 Docker

不建议。虽然 Kubernetes 底层可以使用 containerd 等运行时,但镜像构建、容器调试、Dockerfile 编写仍然是云原生工程师的基础能力。

误区三:所有项目都应该上 Kubernetes

并不是。对于小型项目、个人项目、简单后台系统,Docker 或 Docker Compose 可能更加合适。Kubernetes 更适合复杂系统和生产级集群。

误区四:用了 Kubernetes 就一定高可用

Kubernetes 提供高可用能力,但真正高可用还需要合理设计应用架构、数据库、存储、网络、监控和发布策略。


十八、学习路线建议

如果你是初学者,建议按照以下顺序学习:

Linux 基础
  ↓
Docker 基础
  ↓
Dockerfile
  ↓
Docker Compose
  ↓
镜像仓库
  ↓
Kubernetes 基础概念
  ↓
Pod / Deployment / Service
  ↓
ConfigMap / Secret / Ingress
  ↓
Helm
  ↓
监控、日志、CI/CD
  ↓
生产级集群治理

Docker 是进入云原生的第一步,Kubernetes 则是容器技术在生产环境中规模化落地的重要平台。


十九、总结

Docker 和 Kubernetes 都是云原生体系中非常重要的技术,但它们解决的问题不同。

Docker 关注的是容器本身,它让应用可以被标准化打包、分发和运行。它非常适合本地开发、测试环境、镜像构建以及单机部署。

Kubernetes 关注的是容器集群管理,它解决的是多个节点、多个服务、多个副本之间的调度、扩缩容、服务发现、负载均衡和故障恢复问题。它更适合生产级微服务架构和大规模容器化平台。

一句话总结:

Docker 负责把应用装进容器,Kubernetes 负责把大量容器管理好。

在实际工作中,二者往往是配合使用的:开发者使用 Docker 构建镜像,CI/CD 系统将镜像推送到仓库,Kubernetes 再从仓库拉取镜像并部署到集群中。理解 Docker 是基础,掌握 Kubernetes 是进阶,二者结合起来,才是现代云原生应用交付的完整能力。

目录结构
全文