从零搭建Docker与K8S环境:实战部署与核心原理详解

📅 2026/7/9 21:47:34
从零搭建Docker与K8S环境:实战部署与核心原理详解
30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度在云计算和云原生技术席卷全球的今天掌握容器化和容器编排技术已成为运维工程师、后端开发乃至全栈开发者提升竞争力的关键。你是否曾因复杂的部署流程而头疼是否在微服务架构的浪潮中感到迷茫Docker 和 Kubernetes (K8S) 正是解决这些问题的利器。本文将从零开始手把手带你搭建 Docker 与 K8S 环境并通过实战项目让你彻底理解其核心原理与操作流程无论你是刚接触 Linux 的新手还是希望系统化提升的运维人员都能从中获得一套可直接复用的完整方案。1. 背景与核心概念为什么是 Docker 和 K8S在深入实践之前我们必须理解这两个技术解决了什么问题以及它们之间的关系。1.1 云计算与运维的演进传统的应用部署严重依赖物理服务器或虚拟机存在环境不一致、资源利用率低、扩缩容慢等问题。云计算通过虚拟化技术提供了弹性资源而云原生理念则进一步倡导应用应生于云、长于云其核心支撑技术就是容器和容器编排。1.2 Docker标准化应用交付的容器引擎Docker 是一个开源的容器化平台。你可以把它理解为一个轻量级的“集装箱系统”。核心价值解决了“在我的机器上能跑在你的机器上就跑不起来”的环境一致性问题。工作原理将应用及其所有依赖库、环境变量、配置文件打包成一个独立的、可移植的镜像。这个镜像可以在任何安装了 Docker 的系统中运行生成一个隔离的容器进程。关键特性相比于虚拟机容器共享主机操作系统内核因此启动更快、资源开销更小、密度更高。1.3 Kubernetes (K8S)自动化容器编排的“大脑”当你的应用从单个容器扩展到成百上千个容器时如何管理它们的生命周期、网络、存储和调度手动操作是不可能的。这时就需要 K8S。核心价值自动化容器的部署、扩展、管理和运维。它是容器集群的“操作系统”。核心概念PodK8S 管理的最小单元通常包含一个或多个紧密关联的容器。Node运行 Pod 的物理机或虚拟机工作节点。Master集群的控制平面负责调度、监控和管理整个集群。Deployment定义 Pod 的副本数和更新策略实现无状态应用的部署。Service为一组 Pod 提供稳定的网络访问入口实现负载均衡。与 Docker 的关系Docker 负责“造集装箱”创建容器而 K8S 负责“调度和管理整个港口的集装箱船队”。虽然 K8S 现在支持多种容器运行时但 Docker 仍是其中最流行和成熟的选择。2. 环境准备与版本说明我们将在一个纯净的 Linux 环境下完成所有操作。为了模拟生产环境并避免污染宿主机强烈建议使用虚拟机。2.1 基础环境要求操作系统Ubuntu 20.04 LTS 或 CentOS 7.9。本文以Ubuntu 20.04为例进行演示。硬件至少 2 CPU 核心4 GB 内存20 GB 磁盘空间。运行 K8S 集群需要更多资源建议 Master 节点 2C2GNode 节点 2C4G。网络所有节点间网络互通且可以访问互联网以下载安装包和镜像。2.2 版本选择策略技术迭代迅速盲目追求最新版可能遇到兼容性问题。我们选择当前2026年参考企业环境中广泛使用、社区支持成熟的稳定版本。Docker20.10.x 版本系列。它足够稳定且与新版 K8S 兼容性好。Kubernetes1.24.x 版本系列。这是一个重要的分水岭版本移除了对 Docker 作为容器运行时的直接支持但通过containerd间接支持不影响我们学习引入了许多稳定性改进。容器运行时containerd。K8S 1.24 默认使用containerd我们将直接安装它。重要声明以下所有安装步骤和配置均基于上述版本环境验证。你的实际环境可能有所不同请务必理解每一步的作用以便在遇到问题时能自行调整。3. Linux 基础与 Docker 安装实战在安装 Docker 之前我们需要一个干净的 Linux 环境并掌握一些基础命令。3.1 必备 Linux 命令速查作为运维基石以下命令将贯穿整个学习过程# 系统信息 uname -a # 查看系统内核信息 cat /etc/os-release # 查看系统发行版信息 free -h # 查看内存使用情况 df -h # 查看磁盘空间 # 文件操作 ls -la # 详细列出目录内容 cd /path # 切换目录 pwd # 显示当前目录 cp /source /dest # 复制 mv /old /new # 移动/重命名 rm -rf /path # 强制删除慎用 # 网络与进程 ip addr show # 查看IP地址替代老旧的ifconfig systemctl status docker # 查看服务状态 ps aux | grep nginx # 查找进程 netstat -tlnp # 查看监听端口需安装net-tools # 权限管理 sudo command # 以管理员身份运行命令 chmod x script.sh # 给脚本添加执行权限 chown user:group file # 修改文件属主和属组3.2 安装 Docker Engine我们将使用 Docker 官方提供的脚本进行安装这是最便捷的方式。卸载旧版本如果是全新系统可跳过sudo apt-get remove docker docker-engine docker.io containerd runc更新系统包索引并安装依赖sudo apt-get update sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release添加 Docker 官方 GPG 密钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg设置稳定版仓库echo \ deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null安装 Docker Enginesudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin启动 Docker 并设置开机自启sudo systemctl start docker sudo systemctl enable docker验证安装sudo docker run hello-world如果看到Hello from Docker!等欢迎信息说明 Docker 已正确安装并运行。可选配置非 root 用户运行 Docker避免每次加sudosudo usermod -aG docker $USER注意执行此命令后需要完全退出当前终端并重新登录用户组更改才会生效。3.3 配置 Docker 镜像加速器从 Docker Hub 拉取镜像速度可能较慢配置国内镜像加速器至关重要。创建或修改 Docker 守护进程配置文件sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com, https://mirror.baidubce.com ], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m }, storage-driver: overlay2 } EOFregistry-mirrors中可配置多个加速器地址Docker 会按顺序尝试。重新加载配置并重启 Dockersudo systemctl daemon-reload sudo systemctl restart docker验证加速器是否生效docker info在输出中查找Registry Mirrors部分确认列出了你配置的镜像地址。4. Docker 核心操作与实战安装完成后我们通过一个完整的 Nginx Web 服务项目来掌握 Docker 的核心操作流程。4.1 Docker 生命周期核心命令# 镜像相关 docker images # 列出本地镜像 docker search nginx # 搜索镜像 docker pull nginx:1.21-alpine # 拉取指定标签的镜像alpine版更小巧 docker rmi image_id # 删除本地镜像 # 容器相关 docker ps # 查看运行中的容器 docker ps -a # 查看所有容器包括已停止的 docker run -d --name my-nginx -p 8080:80 nginx:1.21-alpine # 后台运行容器并映射端口 docker stop my-nginx # 停止容器 docker start my-nginx # 启动已停止的容器 docker restart my-nginx # 重启容器 docker rm my-nginx # 删除已停止的容器加 -f 可强制删除运行中的容器 docker logs my-nginx # 查看容器日志 docker exec -it my-nginx /bin/sh # 进入容器内部交互式终端alpine用sh其他常用bash4.2 实战定制化 Nginx 容器目标运行一个 Nginx 容器并使用我们自定义的 HTML 页面替换默认首页。准备自定义网页 在宿主机上创建一个项目目录并编写 HTML。mkdir ~/my-nginx-project cd ~/my-nginx-project cat index.html EOF !DOCTYPE html html head titleMy Docker Nginx/title /head body h1Hello from Docker K8S Tutorial!/h1 pThis page is served from a custom Docker container./p /body /html EOF运行容器并挂载本地目录 使用-v参数将宿主机的~/my-nginx-project目录挂载到容器内的/usr/share/nginx/htmlNginx 默认静态文件目录。docker run -d \ --name my-custom-nginx \ -p 8080:80 \ -v ~/my-nginx-project:/usr/share/nginx/html \ nginx:1.21-alpine-d: 后台运行。--name: 为容器命名。-p 8080:80: 端口映射将宿主机的 8080 端口映射到容器的 80 端口。-v: 数据卷挂载实现宿主机与容器间的文件共享。验证服务 打开浏览器访问http://你的服务器IP:8080。你应该能看到自定义的 HTML 页面而不是 Nginx 的默认欢迎页。进入容器查看docker exec -it my-custom-nginx /bin/sh # 进入容器后查看挂载的目录 ls -la /usr/share/nginx/html/ # 应能看到 index.html 文件 exit # 退出容器4.3 使用 Dockerfile 构建自定义镜像手动挂载文件适合开发调试生产环境更推荐将应用直接打包进镜像。这就需要Dockerfile。创建 Dockerfile 在~/my-nginx-project目录下创建Dockerfile文件。# 使用官方 Alpine 版本的 Nginx 作为基础镜像 FROM nginx:1.21-alpine # 维护者信息可选 LABEL maintaineryour-emailexample.com # 删除默认的欢迎页面 RUN rm -rf /usr/share/nginx/html/* # 将当前目录下的所有文件复制到容器内的指定目录 COPY index.html /usr/share/nginx/html/ # 暴露 80 端口声明性操作实际映射在 run 时指定 EXPOSE 80 # 容器启动时执行的命令基础镜像已定义此处可省略 # CMD [nginx, -g, daemon off;]构建镜像docker build -t my-nginx-image:1.0 .-t: 为镜像指定标签格式为name:tag。.: 构建上下文路径指当前目录。Docker 会将此目录下的所有文件发送给 Docker 守护进程。运行自定义镜像docker run -d --name my-built-nginx -p 8081:80 my-nginx-image:1.0访问http://你的服务器IP:8081效果应与之前挂载目录的方式一致。5. Kubernetes (K8S) 单机集群搭建与核心概念在生产环境中K8S 是多节点集群。为了学习和开发我们使用minikube或kubeadm在单机上搭建一个简化集群。这里我们使用更接近生产环境的kubeadm。5.1 安装前置依赖与 K8S 组件在准备用作 Master 节点的 Ubuntu 服务器上执行以下操作。关闭 SwapK8S 要求禁用 Swap 以确保调度稳定性。sudo swapoff -a # 临时关闭 sudo sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab # 永久注释掉swap行安装容器运行时containerd Docker 安装时已包含containerd但我们需要为 K8S 配置它。# 配置 containerd 使用 systemd 作为 cgroup driver sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml sudo sed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml sudo systemctl restart containerd sudo systemctl enable containerd安装 kubeadm, kubelet 和 kubectlsudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl # 添加 Kubernetes 阿里云镜像源 curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - echo deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt-get update # 安装指定版本避免自动升级到不兼容版本 sudo apt-get install -y kubelet1.24.0-00 kubeadm1.24.0-00 kubectl1.24.0-00 sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本5.2 使用 kubeadm 初始化集群初始化 Master 节点sudo kubeadm init \ --apiserver-advertise-address你的服务器内网IP \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.24.0 \ --service-cidr10.96.0.0/12 \ --pod-network-cidr10.244.0.0/16重要将你的服务器内网IP替换为你的服务器实际 IP如192.168.1.100。--image-repository指定了国内镜像源加速拉取。记录初始化成功输出的命令 初始化成功后控制台会输出类似以下信息务必保存好Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run kubectl apply -f [podnetwork].yaml with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ 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.xxxxxxxxxxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx配置 kubectl非 root 用户mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config安装 Pod 网络插件CNI 集群内的 Pod 需要网络才能通信。我们安装最常用的 Flannel。kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml检查集群状态kubectl get nodes kubectl get pods --all-namespaces等待几分钟直到所有 Pod 的状态都变为Running且 Master 节点的状态为Ready。5.3 K8S 核心对象实战部署一个应用现在我们使用kubectl命令行工具通过 YAML 配置文件来部署一个简单的 Nginx 应用。创建 Deployment Deployment 负责创建和管理 Pod 副本集。# nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 # 指定 Pod 副本数为 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.21-alpine ports: - containerPort: 80应用配置kubectl apply -f nginx-deployment.yaml创建 Service Service 为 Pod 提供稳定的访问入口实现负载均衡。# nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx # 选择标签为 app: nginx 的 Pod ports: - protocol: TCP port: 80 # Service 对集群内暴露的端口 targetPort: 80 # Pod 内容器监听的端口 type: NodePort # 类型为 NodePort会在每个节点上开放一个端口30000-32767映射到该 Service应用配置kubectl apply -f nginx-service.yaml查看部署结果kubectl get deployments kubectl get pods -o wide # 查看 Pod 详情和所在节点 IP kubectl get svc nginx-service # 查看 Service找到 NodePort (如 32145)现在你可以通过http://你的服务器IP:NodePort访问到 Nginx 服务。Service 会将请求负载均衡到两个 Pod 中的一个。6. 常见问题与排查思路 (FAQ)在学习和使用 Docker 与 K8S 的过程中你一定会遇到各种问题。以下是高频问题及排查路径。问题现象可能原因排查思路与解决方案docker run报错Cannot connect to the Docker daemonDocker 服务未启动或当前用户无权限。1.sudo systemctl status docker检查服务状态。2. 未启动则sudo systemctl start docker。3. 检查用户是否在docker组groups $USER若不在则sudo usermod -aG docker $USER并重新登录。拉取 Docker 镜像速度极慢默认使用 Docker Hub 国外源。配置国内镜像加速器修改/etc/docker/daemon.json并重启 Docker。kubeadm init卡在pull image阶段无法访问k8s.gcr.io等国外镜像仓库。使用--image-repository参数指定国内镜像源如registry.aliyuncs.com/google_containers。kubectl get nodes显示节点NotReadyPod 网络插件未安装或安装失败。1.kubectl get pods -n kube-system查看corednsPod 是否处于Pending状态。2. 检查网络插件如 flannel是否安装成功kubectl apply -f ...重新安装并查看其 Pod 日志kubectl logs -n kube-flannel pod-name。Pod 状态一直是Pending资源不足CPU/内存或没有满足条件的节点。1.kubectl describe pod pod-name查看Events部分通常会有详细原因。2. 单机学习环境常见于node.kubernetes.io/not-ready污点Master 默认不允许调度普通 Pod。可移除污点kubectl taint nodes --all node-role.kubernetes.io/master-。无法通过NodePort访问服务防火墙未开放端口或节点网络问题。1. 检查服务器安全组/防火墙是否放行了NodePort范围30000-32767的端口。2.curl 127.0.0.1:nodeport在节点本机测试如果通则是外部网络问题。3. 检查 Service 的selector是否与 Pod 的labels匹配。执行kubectl命令报The connection to the server was refusedkubectl配置错误或 API Server 未运行。1. 检查~/.kube/config文件是否存在且内容正确。2.sudo systemctl status kube-apiserver检查 API Server 服务状态。通用排查命令kubectl describe resource-type resource-name查看资源的详细状态和事件是排错第一利器。kubectl logs pod-name [-c container-name]查看 Pod 或指定容器的日志。kubectl exec -it pod-name -- /bin/sh进入 Pod 内部进行调试。docker logs container-id查看 Docker 容器日志。journalctl -u docker -f或journalctl -u kubelet -f查看系统服务的实时日志。7. 生产环境最佳实践与进阶学习路线掌握了基础操作后要迈向生产环境必须关注稳定性、安全性和可维护性。7.1 Docker 最佳实践镜像优化使用多阶段构建Multi-stage builds减少最终镜像大小。选择合适的基础镜像如alpine并定期更新。合并RUN指令清理 apt 缓存等临时文件。# 多阶段构建示例Go应用 FROM golang:1.19 AS builder WORKDIR /app COPY . . RUN go build -o myapp . FROM alpine:latest WORKDIR /root/ COPY --frombuilder /app/myapp . CMD [./myapp]安全不要以 root 用户运行容器进程。在 Dockerfile 中使用USER指令指定非 root 用户。定期扫描镜像漏洞使用docker scan或第三方工具。限制容器资源CPU、内存使用防止单个容器耗尽主机资源。数据管理容器应是无状态的重要数据应使用命名卷(docker volume create) 或绑定挂载到宿主机持久化。避免将敏感信息密码、密钥写在 Dockerfile 或镜像中使用环境变量或 K8S Secrets。7.2 Kubernetes 最佳实践资源配置为 Pod 设置资源请求requests和限制limits帮助 K8S 合理调度并防止资源争抢。resources: requests: memory: 64Mi cpu: 250m limits: memory: 128Mi cpu: 500m高可用与健康检查使用readinessProbe和livenessProbe确保流量只被发送到准备好的 Pod并能自动重启不健康的 Pod。对于无状态应用replicas至少设置为 2 以实现基本高可用。配置与密钥管理使用ConfigMap管理应用配置。使用Secret管理敏感信息需配合加密存储。切勿将配置硬编码在 Deployment YAML 中。日志与监控确保应用日志输出到标准输出stdout和标准错误stderr便于kubectl logs收集。集成监控系统如 Prometheus Grafana和日志收集系统如 EFK Stack。7.3 从入门到精通的进阶学习路线核心概念深化深入理解 StatefulSet有状态应用、DaemonSet每个节点运行一个 Pod、Job/CronJob批处理任务、Ingress7层流量入口。网络与存储学习 Service 的 ClusterIP/NodePort/LoadBalancer 类型区别理解 CNI 原理掌握 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 的使用。安全学习 RBAC基于角色的访问控制、Pod Security Policies/Standards、Network Policies网络策略。包管理掌握 Helm Chart实现应用的“一键”部署、升级和回滚。CI/CD 集成将 Docker 镜像构建和 K8S 部署流程整合到 Jenkins、GitLab CI 或 GitHub Actions 中。服务网格在微服务架构复杂后了解 Istio 或 Linkerd用于流量管理、可观测性和安全。云原生生态关注 Operator 模式、GitOps如 ArgoCD、Serverless如 Knative等前沿实践。学习技术最有效的方式就是动手。建议你在个人项目或公司非核心业务中尝试引入 Docker 容器化然后逐步过渡到 K8S 进行编排管理。从单节点minikube开始实验再到多节点集群每一步都配合官方文档和社区文章进行实践和思考。遇到问题善用搜索引擎和 GitHub Issues你会发现整个云原生社区都在为你提供支持。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度