Docker与Kubernetes从零到一实战:容器化与集群编排保姆级教程
最近在帮团队做容器化改造时发现很多刚接触云原生的小伙伴对 Docker 和 Kubernetes 的学习路径感到迷茫。网上的资料要么过于零散要么版本老旧照着操作总是遇到各种环境问题。为了让大家能快速上手我结合最新的技术栈和实战经验整理了这份从零到一的保姆级教程。无论你是想转型运维、提升后端技能还是单纯想掌握容器编排技术这篇文章都能带你系统性地走完全程。我们将从最基础的 Docker 概念讲起一步步搭建环境、操作镜像最终部署一个高可用的 K8S 集群并运行实际应用。文末还提供了完整的课件和命令清单方便你随时查阅。1. 容器与编排技术核心概念在开始动手之前我们需要先理解几个核心概念这能帮你建立正确的知识框架避免后续操作中“知其然不知其所以然”。1.1 什么是 Docker它解决了什么问题Docker 是一个开源的应用容器引擎。你可以把它想象成一个超级轻量级的“虚拟机”。但与传统虚拟机VM不同Docker 容器直接运行在宿主机的操作系统内核之上它通过“容器化”技术将应用及其所有依赖库、环境变量、配置文件等打包成一个标准化的单元。它主要解决了以下痛点环境一致性“在我机器上能跑为什么到你那就报错” Docker 通过镜像保证了从开发、测试到生产环境的高度一致。资源高效容器共享宿主机内核无需为每个应用加载完整的操作系统启动速度快资源占用极低。快速部署与扩展镜像一旦构建完成可以在任何安装了 Docker 的平台上秒级启动非常适合微服务和持续集成/持续部署CI/CD。1.2 什么是 Kubernetes (K8S)为什么需要它当你的应用从几个容器扩展到几十、上百个时手动管理这些容器的启动、停止、网络互联、负载均衡和故障恢复就变得异常困难。这时就需要 Kubernetes。Kubernetes常简称为 K8S是一个开源的容器编排引擎用于自动化容器化应用的部署、扩缩和管理。它就像一个容器集群的“大脑”或“操作系统”。K8S 的核心价值服务发现与负载均衡自动为容器组分配 IP 地址和 DNS 名称并能在多个容器实例间分配流量。存储编排允许你自动挂载你选择的存储系统如本地存储、云存储等。自动部署和回滚你可以描述应用的期望状态比如运行 3 个副本K8S 会以可控的速率将实际状态变更至期望状态。如果出问题可以一键回滚。自动扩缩容根据 CPU 使用率或自定义指标自动调整运行应用的容器数量。自我修复重启失败的容器、替换容器、杀死不响应用户健康检查的容器。1.3 Docker 与 Kubernetes 的关系简单来说Docker 负责“造砖”创建容器而 Kubernetes 负责“用这些砖盖房子并管理整栋楼”编排调度容器集群。在 K8S 的早期版本中它直接使用 Docker 作为容器运行时。现在K8S 通过标准的 CRI容器运行时接口与多种容器运行时交互包括 containerdDocker 的底层运行时、CRI-O 等。对于学习者而言从 Docker 入门再过渡到 K8S 是最平滑的路径。2. 环境准备与版本说明工欲善其事必先利其器。我们将在一个干净的 Linux 环境下进行所有操作。本教程以CentOS 7.9作为基础操作系统但核心命令和思路同样适用于 Ubuntu 等主流发行版。重要提示生产环境请务必选择与你的团队技术栈和云平台兼容的稳定版本。以下版本为当前2026年视角的长期支持LTS或稳定版本具有较好的社区支持和资料。操作系统CentOS 7.9 Minimal 安装Docker 版本26.0.0 (CE版本)Kubernetes 版本1.30.x 最新稳定版系列容器运行时containerd 1.7.x K8S 推荐网络插件Calico 3.27.x硬件要求至少 2 GB RAM建议 4 GB至少 2 个 CPU 核心至少 20 GB 磁盘空间集群规划我们将搭建一个最简单的单 Master 集群。Master 节点 (k8s-master): 192.168.1.100Worker 节点 (k8s-node1): 192.168.1.101可选Worker 节点 (k8s-node2): 192.168.1.102请确保所有节点之间网络互通主机名解析正确并关闭防火墙和 SELinux学习环境生产环境需按安全策略配置。# 在所有节点上执行关闭防火墙和 SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config # 设置主机名分别在对应节点执行 # 在 Master 节点 hostnamectl set-hostname k8s-master # 在 Node1 节点 hostnamectl set-hostname k8s-node1 # 编辑 /etc/hosts添加所有节点的 IP 和主机名映射 cat /etc/hosts EOF 192.168.1.100 k8s-master 192.168.1.101 k8s-node1 192.168.1.102 k8s-node2 EOF3. Docker 核心实战从安装到应用部署掌握了概念我们立刻进入实战。Docker 的学习核心在于“镜像”和“容器”两个对象。3.1 安装与配置 Docker我们将使用官方仓库进行安装确保获得最新稳定版本。# 1. 卸载旧版本如有 sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 2. 安装必要的依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 3. 设置稳定的 Docker 仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 4. 安装 Docker Engine 和 CLI sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 5. 启动 Docker 并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 6. 验证安装 sudo docker --version # 输出类似Docker version 26.0.0, build xxxxxxx # 7. 可选配置镜像加速器国内环境建议配置以提升拉取速度 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://your-mirror.mirror.aliyuncs.com] } EOF sudo systemctl daemon-reload sudo systemctl restart docker3.2 镜像Image基础操作镜像是容器的模板是一个只读的静态文件。# 搜索镜像例如搜索 Nginx docker search nginx # 拉取镜像从 Docker Hub docker pull nginx:latest docker pull alpine:3.18 # 拉取一个极小的Linux发行版 # 查看本地所有镜像 docker images # 或使用更强大的格式 docker images --format table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}} # 删除本地镜像 docker rmi alpine:3.18 # 强制删除即使有容器基于此镜像 docker rmi -f nginx:latest3.3 容器Container生命周期管理容器是镜像的运行实例。# 1. 运行一个容器 # -d: 后台运行 # --name: 给容器起个名字 # -p: 端口映射 (宿主机端口:容器端口) docker run -d --name my-nginx -p 8080:80 nginx:latest # 2. 查看容器 docker ps # 查看运行中的容器 docker ps -a # 查看所有容器包括已停止的 # 3. 查看容器日志 docker logs my-nginx docker logs -f my-nginx # 实时跟踪日志类似 tail -f # 4. 进入正在运行的容器内部 docker exec -it my-nginx /bin/bash # 进入后就是一个独立的shell可以执行命令退出用 exit # 5. 停止和启动容器 docker stop my-nginx docker start my-nginx docker restart my-nginx # 6. 删除容器 docker rm my-nginx # 删除已停止的容器 docker rm -f my-nginx # 强制删除运行中的容器3.4 构建自定义镜像Dockerfile 实战这是 Docker 的核心技能。我们通过一个简单的 Python Web 应用来演示。项目结构my-python-app/ ├── app.py ├── requirements.txt └── Dockerfile1. 编写应用代码 (app.py):from flask import Flask import os app Flask(__name__) app.route(/) def hello(): return fHello from Docker! Hostname: {os.uname().nodename} if __name__ __main__: app.run(host0.0.0.0, port5000)2. 编写依赖文件 (requirements.txt):flask2.3.33. 编写 Dockerfile (Dockerfile):# 第一阶段使用官方 Python 精简版作为基础镜像 FROM python:3.11-slim AS builder # 设置工作目录 WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 安装依赖到 /usr/local RUN pip install --no-cache-dir --user -r requirements.txt # 第二阶段使用更小的基础镜像只复制运行所需 FROM python:3.11-slim # 设置环境变量确保从--user安装的包在路径中 ENV PATH/root/.local/bin:$PATH # 从构建阶段复制已安装的包 COPY --frombuilder /root/.local /root/.local # 复制应用代码 COPY app.py . # 声明容器运行时监听的端口 EXPOSE 5000 # 定义容器启动时执行的命令 CMD [python, app.py]Dockerfile 指令解析FROM: 指定基础镜像多阶段构建可以显著减小最终镜像体积。WORKDIR: 设置工作目录后续命令在此目录下执行。COPY: 将宿主机文件复制到镜像内。RUN: 在构建镜像时执行命令常用于安装软件包。ENV: 设置环境变量。EXPOSE: 声明容器对外暴露的端口仅声明实际映射在run时指定。CMD: 指定容器启动时的默认命令一个 Dockerfile 只能有一个CMD。4. 构建镜像# 在 my-python-app 目录下执行 # -t: 给镜像打标签格式为 name:tag docker build -t my-python-app:v1 .5. 运行自定义镜像的容器docker run -d --name my-app -p 5000:5000 my-python-app:v1 # 访问 http://你的服务器IP:5000 查看效果4. Kubernetes 集群部署实战有了 Docker 基础我们现在进军 K8S。手动部署一个集群是理解其架构的最佳方式。4.1 所有节点前置配置在所有 Master 和 Worker 节点上执行以下步骤。# 1. 关闭交换分区K8S 要求 swapoff -a sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab # 2. 配置内核参数并加载模块 cat EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOF sudo sysctl --system # 3. 安装容器运行时 containerd替代Docker # 配置 containerd 的源 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y containerd.io # 生成默认配置并修改 sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml # 修改 config.toml将 SystemdCgroup 设置为 true并配置 sandbox_image 镜像地址国内可用 sudo sed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml sudo sed -i s|registry.k8s.io/pause|registry.aliyuncs.com/google_containers/pause|g /etc/containerd/config.toml # 启动 containerd sudo systemctl daemon-reload sudo systemctl enable --now containerd # 4. 安装 kubeadm, kubelet, kubectl cat EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://pkgs.k8s.io/core:/stable:/v1.30/rpm/ enabled1 gpgcheck1 gpgkeyhttps://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key EOF sudo yum install -y kubelet kubeadm kubectl --disableexcludeskubernetes sudo systemctl enable --now kubelet4.2 Master 节点初始化仅在 Master 节点执行。# 使用 kubeadm 初始化集群 # --apiserver-advertise-address: Master 节点的 IP # --pod-network-cidr: Pod 网络的 CIDR需要与后续安装的网络插件匹配Calico 常用 192.168.0.0/16 sudo kubeadm init \ --apiserver-advertise-address192.168.1.100 \ --pod-network-cidr192.168.0.0/16 \ --image-repositoryregistry.aliyuncs.com/google_containers # 初始化成功后会输出类似以下信息请务必保存好最后的 kubeadm join 命令 # Your Kubernetes control-plane has initialized successfully! # ... # Then you can join any number of worker nodes by running the following on each as root: # kubeadm join 192.168.1.100:6443 --token xxxxxx.xxxxxxxxxxxx \ # --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 配置 kubectl 命令普通用户 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 查看节点状态此时 Master 节点应为 NotReady因为网络插件未安装 kubectl get nodes4.3 安装 Pod 网络插件 (Calico)Pod 之间需要网络才能通信。在 Master 节点执行。# 下载 Calico 的 Operator 安装清单 curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/tigera-operator.yaml -O # 如果网络问题可以先将文件下载到本地再上传 # 安装 Calico Operator kubectl create -f tigera-operator.yaml # 下载并安装自定义资源CR需要修改其中的 CIDR 以匹配初始化时的 --pod-network-cidr curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/custom-resources.yaml -O # 编辑 custom-resources.yaml确保 spec.calicoNetwork.ipPools.cidr 为 192.168.0.0/16 # 可以使用 sed 命令快速修改 sed -i s|cidr:.*|cidr: \192.168.0.0/16\|g custom-resources.yaml kubectl create -f custom-resources.yaml # 等待所有 Calico 相关的 Pod 变为 Running 状态 kubectl get pods -n calico-system -w # 按 CtrlC 退出 watch 模式后再次检查节点状态应变为 Ready kubectl get nodes4.4 Worker 节点加入集群在每个 Worker 节点上执行 Master 节点初始化成功后输出的kubeadm join命令。# 在 k8s-node1 和 k8s-node2 上执行命令示例请替换为你的实际token和hash sudo kubeadm join 192.168.1.100:6443 --token xxxxxx.xxxxxxxxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx加入成功后在 Master 节点上查看集群节点状态kubectl get nodes输出应显示所有节点状态为Ready。5. Kubernetes 核心对象与操作实战集群就绪我们来学习 K8S 中最核心的几个资源对象。5.1 PodK8S 的最小调度单元Pod 是 K8S 中创建和管理的最小单元它包含一个或多个容器通常是一个共享存储、网络和命名空间。创建第一个 Pod# pod-demo.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: nginx spec: containers: - name: nginx-container image: nginx:latest ports: - containerPort: 80# 应用 YAML 文件创建 Pod kubectl apply -f pod-demo.yaml # 查看 Pod kubectl get pods kubectl get pods -o wide # 查看更详细信息包括 IP 和节点 # 查看 Pod 描述 kubectl describe pod nginx-pod # 查看 Pod 日志 kubectl logs nginx-pod # 进入 Pod 的容器如果只有一个容器可省略 -c kubectl exec -it nginx-pod -- /bin/bash # 删除 Pod kubectl delete -f pod-demo.yaml # 或 kubectl delete pod nginx-pod5.2 Deployment无状态应用的管家直接管理 Pod 很不方便Deployment 提供了声明式的更新、回滚和副本管理。创建 Deployment# deployment-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 # 期望的 Pod 副本数 selector: matchLabels: app: nginx template: # Pod 模板 metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80kubectl apply -f deployment-demo.yaml kubectl get deployments kubectl get pods # 会看到 3 个由 Deployment 创建的 Pod # 扩容到 5 个副本 kubectl scale deployment nginx-deployment --replicas5 # 更新镜像版本触发滚动更新 kubectl set image deployment/nginx-deployment nginxnginx:1.26 # 查看更新状态 kubectl rollout status deployment nginx-deployment # 回滚到上一个版本 kubectl rollout undo deployment nginx-deployment5.3 Service服务的抽象与访问入口Pod 的 IP 是临时的Service 为一组 Pod 提供一个稳定的访问端点ClusterIP、NodePort、LoadBalancer。创建 ClusterIP Service# service-clusterip.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx # 选择标签为 app: nginx 的 Pod ports: - port: 80 # Service 端口 targetPort: 80 # Pod 端口 type: ClusterIP # 默认类型集群内部访问kubectl apply -f service-clusterip.yaml kubectl get svc # 在集群内部的其他 Pod 中可以通过 nginx-service 这个 DNS 名称访问这组 Nginx Pod。创建 NodePort Service外部可访问# service-nodeport.yaml apiVersion: v1 kind: Service metadata: name: nginx-nodeport spec: selector: app: nginx ports: - port: 80 targetPort: 80 nodePort: 30080 # 范围 30000-32767 type: NodePort应用后可以通过http://任意节点IP:30080访问 Nginx 服务。5.4 IngressHTTP/HTTPS 路由管理器Service 的 NodePort 或 LoadBalancer 通常用于暴露服务而 Ingress 提供了更强大的 HTTP 层路由能力基于域名和路径。安装 Ingress Controller以 Nginx Ingress 为例# 使用官方清单安装 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.0/deploy/static/provider/baremetal/deploy.yaml # 等待 Pod 就绪 kubectl get pods -n ingress-nginx -w创建 Ingress 规则# ingress-demo.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: myapp.example.com # 配置的域名本地测试需修改 hosts 文件 http: paths: - path: / pathType: Prefix backend: service: name: nginx-service # 指向之前创建的 Service port: number: 80应用后将域名myapp.example.com指向集群任意节点 IP即可通过该域名访问服务。6. 完整项目实战部署一个微服务应用我们将部署一个简单的“投票应用”它包含一个 Web 前端、一个后端 API 和一个 Redis 缓存。这个例子涵盖了 ConfigMap、Secret 和持久化存储卷PersistentVolume的简单使用。6.1 应用架构说明前端 (vote-ui): Python Flask 应用提供投票界面。后端 (vote-api): Python Flask 应用提供投票 API并连接 Redis。缓存 (redis): Redis 数据库存储投票数据。6.2 创建命名空间kubectl create namespace vote-app6.3 部署 Redis# redis-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: redis namespace: vote-app spec: replicas: 1 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:alpine ports: - containerPort: 6379 resources: requests: memory: 64Mi cpu: 50m limits: memory: 128Mi cpu: 100m --- apiVersion: v1 kind: Service metadata: name: redis-service namespace: vote-app spec: selector: app: redis ports: - port: 6379 targetPort: 6379kubectl apply -f redis-deployment.yaml6.4 部署后端 API# api-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: vote-api namespace: vote-app spec: replicas: 2 selector: matchLabels: app: vote-api template: metadata: labels: app: vote-api spec: containers: - name: api image: your-dockerhub-username/vote-api:v1 # 请替换为你自己构建的镜像 ports: - containerPort: 5000 env: - name: REDIS_HOST value: redis-service.vote-app.svc.cluster.local # K8S 内部 DNS - name: REDIS_PORT value: 6379 resources: requests: memory: 128Mi cpu: 100m limits: memory: 256Mi cpu: 200m --- apiVersion: v1 kind: Service metadata: name: api-service namespace: vote-app spec: selector: app: vote-api ports: - port: 5000 targetPort: 5000注意你需要先根据 3.4 节的 Dockerfile 示例编写后端 API 代码连接 Redis提供/vote和/results接口构建镜像并推送到可访问的镜像仓库如 Docker Hub然后替换 YAML 中的镜像地址。6.5 部署前端 Web# ui-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: vote-ui namespace: vote-app spec: replicas: 2 selector: matchLabels: app: vote-ui template: metadata: labels: app: vote-ui spec: containers: - name: ui image: your-dockerhub-username/vote-ui:v1 # 请替换 ports: - containerPort: 80 env: - name: API_HOST value: api-service.vote-app.svc.cluster.local - name: API_PORT value: 5000 --- apiVersion: v1 kind: Service metadata: name: ui-service namespace: vote-app spec: type: NodePort # 方便外部访问 selector: app: vote-ui ports: - port: 80 targetPort: 80 nodePort: 310006.6 访问应用应用所有 YAML 文件kubectl apply -f ./查看部署状态kubectl get all -n vote-app通过http://节点IP:31000访问投票界面。7. 常见问题与排查思路在学习和使用 Docker 与 K8S 的过程中你一定会遇到各种问题。以下是高频问题的排查指南。问题现象可能原因排查思路与解决方案Docker:Cannot connect to the Docker daemonDocker 服务未启动用户无权限。1.sudo systemctl status docker检查服务状态。2. 启动服务sudo systemctl start docker。3. 将用户加入 docker 组sudo usermod -aG docker $USER需重新登录。Docker: 拉取镜像超时或失败网络问题镜像仓库地址错误或不可用。1. 检查网络连通性ping 8.8.8.8。2. 配置国内镜像加速器见 3.1 节。3. 指定完整镜像地址尝试。K8S:kubeadm init卡住或失败镜像拉取失败端口冲突系统配置未满足。1. 查看具体错误信息journalctl -xeu kubelet。2. 检查所需镜像kubeadm config images list并手动拉取。3. 确认 6443, 10250 等端口未被占用。4. 重新检查 4.1 节的所有前置配置。K8S: Node 状态为NotReady网络插件未安装或异常kubelet 服务异常。1.kubectl describe node node-name查看节点事件。2.systemctl status kubelet检查 kubelet 状态。3.kubectl get pods -n kube-system检查核心组件 Pod 状态。4. 确认网络插件如 Calico的 Pod 是否全部Running。K8S: Pod 状态为Pending资源不足CPU/内存节点选择器不匹配PVC 未绑定。1.kubectl describe pod pod-name查看事件通常有明确提示。2.kubectl get nodes检查节点资源情况。3. 检查 Pod 的nodeSelector,tolerations等调度配置。K8S: Pod 状态为CrashLoopBackOff容器内应用启动失败配置错误依赖服务不可用。1.kubectl logs pod-name查看应用日志这是最重要的线索。2.kubectl describe pod pod-name查看详情。3.kubectl exec -it pod-name -- sh进入容器检查环境。K8S: Service 无法访问Service 的 selector 与 Pod 的 label 不匹配端口映射错误网络策略限制。1.kubectl describe svc service-name检查 Endpoints 列表是否为空。2. 对比 Service 的selector和 Pod 的labels。3. 在集群内用curl service-name.namespace.svc.cluster.local测试。K8S: 执行kubectl命令报权限错误kubeconfig 文件配置错误或丢失RBAC 权限不足。1. 检查~/.kube/config文件是否存在且内容正确。2. 确认当前上下文kubectl config current-context。3. 对于生产环境检查是否为用户绑定了正确的 Role 和 RoleBinding。通用排查命令kubectl get resource获取资源列表。kubectl describe resource name查看资源详细信息特别是Events部分。kubectl logs pod-name [-c container-name]查看 Pod 或容器日志。kubectl exec -it pod-name -- command进入 Pod 执行命令。journalctl -u kubelet -f实时查看 kubelet 服务日志。8. 最佳实践与工程建议掌握了基础操作后以下经验能帮助你在实际项目中走得更好更稳。8.1 Docker 最佳实践使用多阶段构建如 3.4 节所示这能显著减小生产镜像体积提高安全性。指定精确的镜像标签避免使用latest标签应使用具体的版本号如nginx:1.25-alpine保证构建的可重复性。以非 root 用户运行容器在 Dockerfile 中使用USER指令减少安全风险。合理利用.dockerignore文件避免将不必要的文件如.git,node_modules, 日志复制进镜像加速构建。扫描镜像安全漏洞使用docker scan或集成 Trivy、Clair 等工具到 CI/CD 流程中。8.2 Kubernetes 最佳实践使用声明式配置YAML并纳入版本控制所有资源的 YAML 文件都应使用kubectl apply管理并存储在 Git 仓库中。为资源设置合理的资源请求和限制每个 Pod 的spec.containers.resources中定义requests和limits这是调度和稳定的基础。resources: requests: memory: 64Mi cpu: 250m limits: memory: 128Mi cpu: 500m使用 Namespace 进行逻辑隔离将不同项目、不同环境dev/staging/prod的资源划分到不同的命名空间。为 Pod 配置就绪和存活探针确保流量只被发送到已准备好的 Pod并能自动重启不健康的 Pod。livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 3 periodSeconds: 3 readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 5使用 ConfigMap 和 Secret 管理配置与敏感信息避免将配置和密码硬编码在镜像或 YAML 中。考虑使用 Helm 进行应用打包对于复杂的多服务应用Helm 图表能简化部署和管理。实施网络策略默认情况下 Pod 间网络是全通的使用NetworkPolicy实现最小权限访问控制。做好日志和监控确保所有容器日志被收集如使用 Fluentd Elasticsearch并部署监控系统如 Prometheus Grafana监控集群和应用状态。8.3 生产环境注意事项高可用集群生产环境至少需要 3 个 Master 节点以防止控制平面单点故障。持久化存储认真规划PersistentVolume (PV)和StorageClass确保有状态应用的数据安全。备份与恢复定期备份 etcd 数据存储所有集群状态并测试恢复流程。升级策略制定详细的 K8S 版本升级计划并在测试环境充分验证。安全加固启用 Pod 安全标准使用服务账户ServiceAccount最小权限原则定期轮换证书。这份教程涵盖了从零入门到实战的核心路径。技术栈更新很快但基础概念和核心操作是稳定的。建议你按照步骤亲手操作一遍遇到问题多查官方文档和社区。真正的理解来源于实践和踩坑。课件和完整的命令清单已整理好你可以从我的 GitHub 仓库获取方便离线查阅和复习。下一步你可以深入研究 Service Mesh如 Istio、GitOps如 ArgoCD、Operator 模式等更高级的主题逐步构建起自己的云原生知识体系。

相关新闻

TAS3251音频DSP寄存器配置实战:CRC/XOR校验与时钟树详解

TAS3251音频DSP寄存器配置实战:CRC/XOR校验与时钟树详解

1. 项目概述:从寄存器手册到实战配置如果你正在调试一块基于TAS3251的音频板,发现I2S信号时有时无,或者DSP处理后的声音偶尔出现爆音,那么问题很可能出在两个方面:数据在传输过程中出错了,或者给各个模块的…

2026/7/25 1:44:12 阅读更多 →
Ultralytics:解读Proto模块

Ultralytics:解读Proto模块

Ultralytics:解读Proto模块前言相关介绍Ultralytics 简介前提条件实验环境Proto(YOLO 分割掩码原型生成模块)代码实现功能初始化参数前向方法使用示例流程示意图代码解读注意事项优缺点优点缺点参考文献前言 由于本人水平有限,难免…

2026/7/25 1:44:12 阅读更多 →
BLIP:Bootstrapping Language-Image Pre-training

BLIP:Bootstrapping Language-Image Pre-training

研究背景视觉-语言预训练(Vision-Language Pre-training,简称 VLP)显著提升了许多视觉语言任务的性能。VLP可以理解为视觉领域的"BERT"或者"GPT"。基本思想是:用大量图片文本数据进行预训练;让模型…

2026/7/25 1:44:12 阅读更多 →

最新新闻

计算机毕业设计之基于SpringBoot的邻里社区旧物捐赠网站系统设计与开发

计算机毕业设计之基于SpringBoot的邻里社区旧物捐赠网站系统设计与开发

邻里社区旧物捐赠网站系统,旨在构建一个促进社区资源循环利用、增强邻里互动的平台。该系统采用了Java作为后端开发语言,利用其强大的面向对象特性和跨平台能力,确保了系统的稳定性和可扩展性。SpringBoot框架的引入,极大地简化了…

2026/7/25 1:52:14 阅读更多 →
AssetRipper终极指南:5分钟掌握Unity资源提取与转换技巧

AssetRipper终极指南:5分钟掌握Unity资源提取与转换技巧

AssetRipper终极指南:5分钟掌握Unity资源提取与转换技巧 【免费下载链接】AssetRipper GUI application to analyze game files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper AssetRipper是一款革命性的跨平台Unity资源提取工具&#xff0…

2026/7/25 1:52:14 阅读更多 →
终极指南:如何用免费抖音下载器批量保存无水印视频

终极指南:如何用免费抖音下载器批量保存无水印视频

终极指南:如何用免费抖音下载器批量保存无水印视频 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…

2026/7/25 1:52:14 阅读更多 →
GPT Pro拼车管理方案:基于Web代理的额度分配与使用追踪

GPT Pro拼车管理方案:基于Web代理的额度分配与使用追踪

这次我们来看一个关于“GPT Pro拼车”的技术管理方案。如果你正在寻找一种公平、透明且自动化的方式来与团队成员或朋友共享一个GPT Pro会员账号,特别是需要解决额度分配、使用记录追踪和网页版Chat功能访问的问题,那么这篇文章提供的思路和工具可能正是你需要的。 GPT Pro作…

2026/7/25 1:52:14 阅读更多 →
AI图生视频实战:基于扩散模型与姿态驱动实现静态图片舞蹈生成

AI图生视频实战:基于扩散模型与姿态驱动实现静态图片舞蹈生成

最近在整理网盘时,我意外翻出了一个尘封已久的文件夹,里面是六年前自己跳舞的视频片段。看着画面里那个略显生涩却充满热情的身影,一个念头突然闪过: 如果能让这个“过去的我”动起来,甚至和现在的我共舞,会是什么体验? 这听起来像是电影特效,但今天,借助开源AI的力…

2026/7/25 1:52:14 阅读更多 →
DDR3 PCB信号完整性设计:从Fly-by拓扑到数据组布线的实战指南

DDR3 PCB信号完整性设计:从Fly-by拓扑到数据组布线的实战指南

1. 项目概述与核心挑战在嵌入式系统,尤其是基于高性能SoC(如TI的DRA72x系列)的设计中,DDR3内存接口的稳定性往往是整个硬件平台的“命门”。我经历过不止一个项目,在功能调试阶段一切正常,一旦进入高负载压…

2026/7/25 1:51:14 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻