Docker 基础知识
Docker 是什么
Docker 是一个容器化平台,可以将应用程序及其依赖打包在一个“容器”里运行。
- Docker 容器就像把软件 + 系统依赖 + 配置文件都装进一个“快递箱子”里,无论在哪台机器上运行都是一样的结果。
Docker 容器 vs 虚拟机
项目 | 容器(Docker) | 虚拟机(VM) |
---|---|---|
启动速度 | 秒级 | 分钟级 |
占用资源 | 少,只共享操作系统内核 | 多,需要完整操作系统 |
隔离性 | 中,基于 Linux Namespace(命名空间)/Cgroups(控制组) | 强,硬件级隔离 |
Docker 的核心组件
Docker采用客户端-服务器(C/S)架构,主要由以下核心组件构成:
- Docker守护进程(Daemon):运行在后台的服务,负责管理容器的生命周期(创建、运行、停止等)
- Docker客户端(Client):用户与Docker交互的接口,通过命令行或REST API与守护进程通信
- Docker镜像(Images):容器的静态模板,包含运行应用所需的所有文件和配置,采用分层存储结构
- Docker容器(Container):镜像的运行实例,是轻量级、可移植的应用封装
- Docker仓库(Registry):集中存储和管理镜像的服务,如公共的Docker Hub或企业私有仓库
工作流程:用户通过Docker客户端发送命令→Docker守护进程接收并执行命令→从仓库拉取镜像或构建新镜像→基于镜像创建并运行容器。
Docker 安全相关
容器逃逸
容器本应是隔离的,但如果配置不当,攻击者可能从容器跳出来控制主机。
常见方式:
危险配置:容器以特权模式
--privileged
启动(几乎等于 root 权限)危险挂载:主机目录(如根目录
/
)挂载到容器,例如:1
2docker run -v /:/host -it ubuntu
chroot /host bash # 控制宿主机相关程序漏洞:参与到容器生态中的服务端、客户端程序自身存在的漏洞
内核漏洞利用:从用户空间非法进入内核空间,在内核空间赋予当前或其他进程高权限后回到用户空间
镜像安全
- 镜像来源:要确保从可信的仓库拉取镜像,避免使用未知或不可信的镜像,因为恶意镜像可能包含后门或恶意软件
- 镜像漏洞:定期使用镜像扫描工具(如 Trivy 等)检测镜像中的漏洞,及时更新镜像版本以修复漏洞
- 镜像构建安全:在编写 Dockerfile 时,避免安装不必要的软件包,减少潜在的攻击面
容器安全配置
- 权限管理:避免在容器中以 root 用户运行应用,尽量使用非 root 用户,降低容器被攻破后攻击者获取的权限
- 资源限制:合理设置 cgroups 参数,限制容器的 CPU、内存等资源使用,防止容器被利用进行资源耗尽攻击
- 网络隔离:利用 Docker 的网络隔离特性,确保容器之间的网络通信安全,只开放必要的端口
Docker API 暴露
默认 Docker 只监听本地 Unix socket,但很多开发人员会开启:
1 | tcp://0.0.0.0:2375 |
这可能导致未经认证的远程控制容器。
Kubernetes 基础知识
Kubernetes 是什么
Kubernetes(K8s)是一个容器编排平台,负责管理大量容器的生命周期。
- Docker 是造轮子的工厂。
- Kubernetes 是“自动驾驶系统”,能安排每个轮子该去哪、什么时候滚、坏了自动换备胎。
功能
- 智能调度:
- 指定部署区域:Kubernetes会根据资源需求和节点特性(如是否有GPU)选择最优节点
- 指定副本数:声明需要运行的Pod数量,Kubernetes会自动维持这个数量
- 资源分配:可以精确指定每个容器需要的CPU和内存
- 自动恢复:
- 健康检查:定期检测容器是否健康,不健康的容器会被自动重启或替换
- 节点故障处理:当节点失效时,其上的Pod会被重新调度到健康节点
- 滚动更新与回滚:
- 逐步替换旧版本Pod,确保服务不中断
- 出现问题时可一键回滚到之前的稳定版本
- 水平自动扩缩容(HPA):
- 根据CPU利用率、内存使用量或自定义指标自动增加或减少Pod数量
- 电商大促时,订单服务可以从10个Pod自动扩容到100个应对流量高峰
核心概念
概念 | 解释 |
---|---|
Pod | K8s 的最小调度单位,封装一个或多个容器 |
Node | 承载 Pod 的工作节点 |
Deployment | 管理多个 Pod 副本,支持自动滚动升级 |
Service | 暴露 Pod 的访问入口(如负载均衡) |
ConfigMap/Secret | 存储配置信息或敏感数据(如数据库密码) |
Ingress | 路由规则入口,控制外部流量如何进入服务 |
Kubernetes 安全相关
API Server 暴露
- K8s 的核心是 API Server,所有管理操作都要通过它。
- 若 API Server 未加 RBAC(访问控制),攻击者可能用 kubectl 操作集群。
RBAC 配置不当
RBAC = Role-Based Access Control
权限过大:某个账号被赋予 cluster-admin 权限(最高权限)
常考命令:
1
2kubectl get clusterrolebindings
kubectl auth can-i create pods --as system:anonymous
3. 容器逃逸场景
Pod 中容器使用
hostPID: true
、hostNetwork: true
,可以访问宿主机进程使用
hostPath
映射敏感文件,比如:1
2
3
4
5
6
7volumeMounts:
- mountPath: /host
name: host-volume
volumes:
- name: host-volume
hostPath:
path: /
4. Dashboard 未授权访问
K8s 的 Web 控制台曾被发现默认无需登录,攻击者可直接创建 Pod、注入恶意镜像。
常见面试题
面试题 | 简答思路 |
---|---|
Docker 容器和虚拟机有什么区别? | 资源消耗、隔离方式、启动速度不同 |
如何防止容器逃逸? | 禁止 privileged、合理配置 seccomp/apparmor |
怎么扫描镜像安全问题? | 使用 trivy、clair、anchore 等工具 |
Kubernetes 中如何进行权限控制? | 使用 RBAC,避免默认 cluster-admin |
Kubernetes 中如何配置敏感信息? | 使用 Secret,并控制访问权限 |
如何判断某个 Pod 是否能访问主机资源? | 查看 YAML 是否设置了 hostNetwork、hostPID、hostPath 等 |