Docker 与 Kubernetes 基础课程

面向中级学习者的结构化课程,覆盖 Docker 镜像、容器、卷、网络、Compose,以及 Kubernetes 核心工作负载、服务、存储与故障排查。

等级: Docker & Kubernetes 难度: intermediate 5 节课 90 分钟
课程进度 0 / 5
返回课程

你将学到

  • 使用 Dockerfile 构建并优化 Docker 镜像
  • 运行、检查容器并使用卷持久化数据
  • 通过 Docker 网络与 Compose 连接容器
  • 使用 ConfigMap 和 Secret 部署核心 Kubernetes 工作负载
  • 暴露应用并排查 Kubernetes 集群问题

开始前准备

  • 具备基本的 Linux 命令行经验
  • 熟悉 HTTP、端口与应用部署
  • 可使用 Docker 与 Kubernetes 题库进行自测

课程 1 Docker 镜像与 Dockerfile

Docker 镜像是包含应用程序、运行时、库和配置的只读模板。镜像由 Dockerfile 通过分层构建:FROMCOPYRUNENV 等每条指令都会创建一个层,未变化的层会被缓存,从而加快重新构建速度。要获得更小、更安全的镜像,应优先选用精简的基础镜像,合并相关的 RUN 命令,并且只复制应用程序需要的文件。

FROM 指令用于选择基础镜像。COPY 将文件从构建上下文移入镜像,RUN 则在构建期间执行命令。CMD 提供容器启动时使用的默认命令和参数,ENTRYPOINT 定义始终运行的可执行文件。当两者同时存在时,入口点会将命令行参数作为其参数接收。还可以通过 HEALTHCHECKUSER 添加健康检查或非 root 用户。

使用 docker build -t myapp:latest . 构建镜像,使用 docker image ls 列出镜像。为镜像打上有意义的版本号,生产环境中应避免只使用 latest。目标是让镜像具有确定性、体积小,并且仅凭 Dockerfile 即可重现。

镜像练习:使用小基础镜像,合并 RUN 命令,只复制必要文件,并以非 root 用户运行。把可缓存步骤放在前面,并扫描镜像漏洞。

示例

Node.js 应用只需包文件即可安装依赖,只需源代码即可运行。该 Dockerfile 以 FROM node:20-alpine 开头,先复制 package.json,运行 npm ci,再复制源代码,切换到非 root 用户,并定义 CMD ["node", "server.js"]。在复制源代码之前先复制依赖,可让 Docker 在包文件未变化前复用依赖层。

示例:多阶段构建:在一个阶段编译,只把运行时二进制复制到最终镜像。

课程 2 容器生命周期与持久化存储

容器是镜像的一个运行实例。Docker 通过 docker createdocker startdocker stopdocker rm 等命令创建、启动、停止、重启和删除容器。常用的快捷命令 docker run 可以一步完成容器的创建和启动。使用 docker ps 查看运行中的容器,使用 docker ps -a 包含已停止的容器,使用 docker logs 检查应用输出。

容器的文件系统是临时的:容器被删除后,写入其中的更改也会消失。卷和绑定挂载可以解决这一问题。命名卷由 Docker 管理,删除容器后仍然保留;绑定挂载则将宿主机目录映射到容器中。-v--mount 标志用于挂载存储,多个容器可以共享同一个卷。只读挂载可防止意外修改。

调试时,docker exec -it container bash 会在运行中的容器内打开一个 shell,docker inspect 则显示配置和状态详情。只有当应用需要自动恢复时才添加 --restart 策略;当容器本身可以替换时,应将日志和数据保存在容器之外。

容器练习:掌握 create、start、stop、restart、rm 和 run。持久化用卷或绑定挂载,让数据在容器删除后仍存在;不要把状态放在可写层。

示例

数据库容器通过 docker run -d --name postgres -v pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=secret postgres:16 启动。命名卷 pgdata 会在执行 docker rm postgres 后保留数据库文件,因此使用同一卷的替代容器可以恢复相同的数据。

示例:用命名卷运行数据库容器,docker rm 后数据仍然保留。

课程 3 Docker 网络与 Compose

Docker 网络让容器可以通过名称或 IP 通信。默认的 bridge 网络为同一网络中的容器提供自动 DNS,而 host 网络共享宿主机网络栈并移除了隔离。建议使用用户自定义的 bridge 网络,因为它支持 DNS 解析,并且无需重建容器即可挂载或卸载。使用 -p 8080:80 将容器端口发布到宿主机;左侧是宿主机端口,右侧是容器端口。

Docker Compose 在 YAML 文件中定义多容器应用。服务声明镜像、构建上下文、端口、卷、环境变量和网络。运行 docker compose up -d 会创建网络并一起启动服务;docker compose down 会移除容器和默认网络,同时保留命名卷。Compose 还支持依赖、健康检查和扩展服务副本。

使用 docker network lsdocker network inspectdocker exec 排查连接问题。一个常见故障是 Web 容器无法访问数据库,因为它们位于不同网络,或者应用使用了 localhost 而不是服务名。在 Compose 中使用服务名,这样内置 DNS 就能解析到正确的容器。

网络练习:用自定义 bridge 网络实现基于 DNS 的通信,只有隔离可接受时才用 host 模式,用 Compose 定义多容器应用。服务命名后容器可按名称解析。

示例

一个 compose 文件定义了 webdb 两个服务。web 服务映射 "8080:3000",并使用主机名 db 和端口 5432 连接数据库。数据库服务挂载一个命名卷并设置启动健康检查。运行 docker compose up -d 会在一个私有网络上启动两个服务,浏览器可通过 http://localhost:8080 访问应用。

示例:Compose 中,app 服务按服务名连接 database 服务。

课程 4 Kubernetes 核心工作负载

Kubernetes 在由节点组成的集群上运行容器化应用。最小的可部署单元是 Pod,它包装一个或多个容器,并共享存储、网络和生命周期。Pod 通常由控制器创建。Deployment 管理无状态副本,支持滚动更新和回滚;StatefulSet 为有状态应用提供稳定的网络标识和有序扩缩容;DaemonSet 在每个选定节点上恰好运行一个 Pod;Job 将工作负载运行至完成;CronJob 则按计划运行 Job。

ConfigMap 和 Secret 将配置与代码分离。ConfigMap 保存非敏感数据,如环境变量或配置文件;Secret 保存密码、API 令牌等敏感值。两者都可以挂载为卷或作为环境变量注入。Secret 在 API 中以 base64 编码,但仍应通过 RBAC 和静态加密进行保护。

控制器会调和期望状态:你声明期望的副本数,Kubernetes 会创建或删除 Pod,直到实际状态与之相符。标签和选择器将控制器与 Pod 关联起来,因此请使用 apptier 等有意义的标签。使用 kubectl apply -f 应用清单,并使用 kubectl get podskubectl describe deploymentkubectl rollout status 检查工作负载状态。

工作负载练习:无状态副本用 Deployment,稳定身份和存储用 StatefulSet,每节点代理用 DaemonSet,批处理用 Job/CronJob。为可预测调度定义资源请求和限制。

示例

一个 Deployment 清单声明了带标签 app: webnginx 容器的三个副本。ConfigMap 提供 APP_MODE 的值,Secret 提供 DB_PASSWORD。如果某个节点发生故障,控制器会在健康节点上创建替代 Pod,使期望数量保持为三个。

示例:Web API 用三个副本的 Deployment,前面加一个 Service。

课程 5 Kubernetes 服务、存储与故障排查

Service 为一组 Pod 提供稳定的网络端点。ClusterIP 在集群内部暴露 Service,NodePort 在每个节点上开放一个端口,LoadBalancer 则与云提供商集成以处理外部流量。Ingress 使用主机名和路径将 HTTP 和 HTTPS 流量路由到 Service,通常通过 ingress 控制器完成。Service 中的选择器必须与 Pod 标签匹配,Service 的 targetPort 必须与容器端口匹配。

持久化存储使用 PersistentVolumeClaim(PVC)请求存储,使用 PersistentVolume(PV)提供存储,并使用 StorageClass 定义供给行为。绑定到 PV 的 PVC 可以挂载到 Pod 中;ReclaimPolicy 控制 PVC 释放后卷是保留还是删除。数据库等有状态工作负载应使用稳定存储,并了解卷声明如何映射到 Pod。

故障排查遵循固定顺序:用 kubectl get pods 查看状态,用 kubectl describe pod 查看事件和条件,用 kubectl logs 查看应用输出,用 kubectl exec 进行交互式检查。检查镜像拉取错误、CrashLoopBackOff 原因、就绪探针、Service 选择器和网络策略。构建镜像、本地测试、小步部署变更并快速回滚的复习工作流,能将 Kubernetes 实践转化为可复现的技能。

Service 练习:内部访问用 ClusterIP,节点级访问用 NodePort,云端外部访问用 LoadBalancer,主机/路径路由用 Ingress。存储用 PersistentVolumeClaim,排障用 kubectl logs 和 describe。

示例

部署新的镜像标签后,Pod 一直处于 CrashLoopBackOff 状态。kubectl describe pod 显示容器退出码,kubectl logs 暴露出缺少环境变量,而 Deployment 引用的 ConfigMap 并不存在。创建 ConfigMap 并重新部署后,Pod 进入 Running 状态,Service 开始正常返回流量。

示例:Pod 出现 CrashLoopBackOff 时,用 kubectl logs 和 kubectl describe pod 找原因。