Docker+Kubernetes容器化运维实战:从零部署到生产级集群(2026版)

Docker+Kubernetes容器化运维实战:从零部署到生产级集群(2026版)

## 摘要

本文提供一份面向初学者的Docker与Kubernetes容器化运维实战指南,涵盖Linux/Windows双平台安装、核心操作命令、多容器编排、K8s集群搭建、应用部署全流程,以及生产环境最佳实践与故障排查技巧。所有操作步骤均附带完整命令和实战建议。

## 正文

### 一、Docker实战安装与配置

#### 1.1 Linux(Ubuntu 26.04)标准6步安装

bash<br># Step 1: 卸载旧版本(如有)<br>sudo apt-get remove docker docker-engine docker.io containerd runc<br><br># Step 2: 安装依赖<br>sudo apt-get update<br>sudo apt-get install ca-certificates curl gnupg<br><br># Step 3: 添加Docker官方GPG密钥<br>sudo install -m 0755 -d /etc/apt/keyrings<br>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.asc<br>sudo chmod a+r /etc/apt/keyrings/docker.asc<br><br># Step 4: 添加Docker apt仓库<br>echo \<br> "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \<br> $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \<br> sudo tee /etc/apt/sources.list.d/docker.list > /dev/null<br>sudo apt-get update<br><br># Step 5: 安装Docker组件<br>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin<br><br># Step 6: 启动并验证<br>sudo systemctl start docker<br>sudo systemctl enable docker<br>sudo docker run hello-world<br>

中国大陆用户必做:配置镜像加速

bash<br>sudo mkdir -p /etc/docker<br>sudo tee /etc/docker/daemon.json <<-'EOF'<br>{<br> "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]<br>}<br>EOF<br>sudo systemctl daemon-reload<br>sudo systemctl restart docker<br>

#### 1.2 Windows推荐方案:WSL2原生部署(避开Docker Desktop付费限制)

powershell<br># 1. 安装WSL2(管理员权限运行PowerShell)<br>wsl --install<br><br># 重启后自动安装Ubuntu<br><br># 2. 在WSL2 Ubuntu中安装Docker(同Linux安装步骤)<br><br># 3. WSL2特定修复:修复iptables兼容性<br>sudo update-alternatives --config iptables<br># 选择 iptables-legacy<br><br># 4. 配置用户权限(避免每次sudo)<br>sudo usermod -aG docker $USER<br># 重新打开终端生效<br><br># 5. 设置Docker开机自启(Windows任务计划程序)<br># 触发器:系统启动<br># 程序/脚本:C:\Windows\System32\wsl.exe<br># 参数:-d Ubuntu -u root -- service docker start<br>

### 二、Docker核心操作命令

#### 2.1 镜像管理

bash<br>docker pull nginx:latest # 拉取最新nginx镜像<br>docker pull ubuntu:22.04 # 拉取指定版本Ubuntu<br>docker images # 列出本地镜像<br>docker rmi nginx:latest # 删除指定镜像<br>docker system prune -a -f # 清理未使用镜像(谨慎使用)<br>

#### 2.2 容器管理

bash<br># 运行nginx容器:后台运行,命名my-nginx,映射主机8080到容器80<br>docker run -d --name my-nginx -p 8080:80 nginx:latest<br><br>docker ps # 列出运行中的容器<br>docker ps -a # 列出所有容器(含已停止)<br>docker exec -it my-nginx /bin/bash # 交互式进入容器<br>docker logs my-nginx # 查看容器日志<br>docker stop my-nginx # 停止容器<br>docker start my-nginx # 启动已停止的容器<br>docker rm my-nginx # 删除容器(需先停止)<br>

#### 2.3 自定义镜像构建(Node.js示例)

Dockerfile:
dockerfile<br>FROM node:18-alpine<br>WORKDIR /app<br>COPY package*.json ./<br>RUN npm install<br>COPY . .<br>EXPOSE 3000<br>CMD ["npm", "start"]<br>

构建命令:
bash<br>docker build -t my-app:v1 .<br>

#### 2.4 多容器管理(Docker Compose)

docker-compose.yml示例(Nginx + MySQL):
yaml<br>version: '3'<br>services:<br> web:<br> image: nginx:latest<br> ports:<br> - "80:80"<br> db:<br> image: mysql:8.0<br> environment:<br> MYSQL_ROOT_PASSWORD: root123<br> volumes:<br> - db-data:/var/lib/mysql<br>volumes:<br> db-data:<br>

命令:
bash<br>docker-compose up -d # 后台启动所有服务<br>docker-compose down # 停止并删除所有服务/容器<br>

### 三、Kubernetes生产级集群搭建

#### 3.1 环境准备(Ubuntu 26.04)

bash<br># 1. 禁用swap(K8s强制要求)<br>sudo swapoff -a<br>sudo sed -i '/swap/s/^/#/' /etc/fstab # 永久禁用<br><br># 2. 加载内核模块<br>cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf<br>overlay<br>br_netfilter<br>EOF<br>sudo modprobe overlay<br>sudo modprobe br_netfilter<br><br># 3. 配置网络参数<br>cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf<br>net.bridge.bridge-nf-call-iptables = 1<br>net.bridge.bridge-nf-call-ip6tables = 1<br>net.ipv4.ip_forward = 1<br>EOF<br>sudo sysctl --system<br>

#### 3.2 安装容器运行时(containerd)

bash<br>sudo apt-get install containerd<br>sudo mkdir -p /etc/containerd<br>containerd config default | sudo tee /etc/containerd/config.toml<br><br># 启用SystemdCgroup(K8s兼容性要求)<br>sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml<br><br>sudo systemctl restart containerd<br>sudo systemctl enable containerd<br>

#### 3.3 安装K8s组件(kubeadm/kubelet/kubectl)

bash<br># 添加K8s v1.31 apt仓库<br>curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg<br>echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list<br>sudo apt-get update<br>sudo apt-get install -y kubelet kubeadm kubectl<br><br># 锁定版本防止意外更新<br>sudo apt-mark hold kubelet kubeadm kubectl<br>

#### 3.4 初始化单节点K8s集群

bash<br># 初始化控制平面,使用Flannel默认CIDR<br>sudo kubeadm init --pod-network-cidr=10.244.0.0/16<br><br># 配置kubectl(普通用户)<br>mkdir -p $HOME/.kube<br>sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config<br>sudo chown $(id -u):$(id -g) $HOME/.kube/config<br><br># 允许控制平面节点运行普通Pod(单节点必备)<br>kubectl taint nodes --all node-role.kubernetes.io/control-plane-<br><br># 安装Flannel网络插件<br>kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml<br><br># 验证集群<br>kubectl get nodes # 应显示Ready状态<br>kubectl get pods -n kube-system # 所有核心组件应运行中<br>

### 四、Kubernetes核心实战操作

#### 4.1 Pod管理

bash<br>kubectl run nginx --image=nginx:latest # 创建单个nginx Pod<br>kubectl get pods # 列出Pods<br>kubectl describe pod nginx # 查看Pod详情/事件<br>kubectl logs nginx # 查看Pod日志<br>kubectl exec -it nginx -- /bin/bash # 交互式进入Pod<br>

#### 4.2 Deployment管理(推荐方式)

nginx-deployment.yaml
yaml<br>apiVersion: apps/v1<br>kind: Deployment<br>metadata:<br> name: nginx-deployment<br>spec:<br> replicas: 3<br> selector:<br> matchLabels:<br> app: nginx<br> template:<br> metadata:<br> labels:<br> app: nginx<br> spec:<br> containers:<br> - name: nginx<br> image: nginx:latest<br> ports:<br> - containerPort: 80<br>

命令:
bash<br>kubectl apply -f nginx-deploy.yaml # 创建Deployment<br>kubectl get deployments # 列出Deployments<br>kubectl scale deployment nginx-deployment --replicas=5 # 扩缩容到5副本<br>

#### 4.3 Service暴露服务(NodePort示例)

nginx-service.yaml
yaml<br>apiVersion: v1<br>kind: Service<br>metadata:<br> name: nginx-service<br>spec:<br> selector:<br> app: nginx<br> ports:<br> - protocol: TCP<br> port: 80<br> targetPort: 80<br> type: NodePort<br>

命令:
bash<br>kubectl apply -f nginx-service.yaml<br>kubectl get services # 查看分配的NodePort(如80:31234/TCP)<br># 通过任意节点IP + NodePort访问<br>

#### 4.4 水平自动扩缩容(HPA)

bash<br>kubectl autoscale deployment springboot-demo --cpu-percent=50 --min=1 --max=10<br>

### 五、完整容器化部署工作流(Spring Boot示例)

步骤1:容器化Spring Boot应用

Dockerfile:
dockerfile<br>FROM openjdk:17-jdk-alpine<br>LABEL maintainer="yourname@example.com"<br>WORKDIR /app<br>COPY app.jar app.jar<br>EXPOSE 8080<br>CMD ["java", "-jar", "app.jar"]<br>

步骤2:构建并推送镜像

bash<br>docker build -t yourusername/springboot-demo:v1 .<br>docker login # 登录Docker Hub<br>docker push yourusername/springboot-demo:v1<br>

步骤3:编写K8s Deployment + Service YAML

springboot-deploy.yaml
yaml<br>---<br>apiVersion: apps/v1<br>kind: Deployment<br>metadata:<br> name: springboot-demo<br>spec:<br> replicas: 3<br> selector:<br> matchLabels:<br> app: springboot-demo<br> template:<br> metadata:<br> labels:<br> app: springboot-demo<br> spec:<br> containers:<br> - name: springboot-app<br> image: yourusername/springboot-demo:v1<br> ports:<br> - containerPort: 8080<br> resources:<br> requests:<br> memory: "512Mi"<br> cpu: "250m"<br> limits:<br> memory: "1Gi"<br> cpu: "500m"<br> livenessProbe:<br> httpGet:<br> path: /actuator/health<br> port: 8080<br> initialDelaySeconds: 30<br> periodSeconds: 10<br> readinessProbe:<br> httpGet:<br> path: /actuator/health<br> port: 8080<br> initialDelaySeconds: 30<br> periodSeconds: 5<br>---<br>apiVersion: v1<br>kind: Service<br>metadata:<br> name: springboot-service<br>spec:<br> selector:<br> app: springboot-demo<br> ports:<br> - protocol: TCP<br> port: 80<br> targetPort: 8080<br> type: LoadBalancer<br>

步骤4:部署到K8s

bash<br>kubectl apply -f springboot-deploy.yaml<br>kubectl get deployments<br>kubectl get pods -l app=springboot-demo<br>kubectl get services springboot-service<br>

步骤5:滚动更新

bash<br>docker build -t yourusername/springboot-demo:v2 .<br>docker push yourusername/springboot-demo:v2<br>kubectl set image deployment/springboot-demo springboot-app=yourusername/springboot-demo:v2<br>kubectl rollout status deployment/springboot-demo<br>

步骤6:回滚

bash<br>kubectl rollout history deployment/springboot-demo # 查看历史版本<br>kubectl rollout undo deployment/springboot-demo # 回滚到上一版本<br>kubectl rollout undo deployment/springboot-demo --to-revision=1 # 回滚到指定版本<br>

### 六、常见故障排查与最佳实践

#### 6.1 Docker常见问题

| 问题 | 解决方案 |
|------|---------|
| 容器启动后立即退出 | 确保应用以前台进程运行,必要时加tail -f /dev/null保持容器运行 |
| 磁盘空间占满 | 定期清理:docker system prune -a -f(删除未使用镜像/容器),docker volume prune -f(删除未使用卷)|
| 镜像拉取慢 | 使用配置的镜像加速器,或搭建私有仓库 |

#### 6.2 Kubernetes常见问题

| 问题 | 解决方案 |
|------|---------|
| Pod卡在Pending状态 | 检查kubectl describe pod <pod-name>的事件,查看节点资源kubectl describe node <node-name>,检查节点污点 |
| ImagePullBackOff | 验证YAML中的镜像地址,配置imagePullSecret用于私有仓库,检查节点磁盘空间 |
| Service无法访问 | 验证Service selector与Pod标签匹配kubectl get pods --show-labels,检查Service Endpointskubectl get endpoints <service-name> |

#### 6.3 生产环境运维最佳实践

1. 资源限制:为所有容器设置resources.requestsresources.limits,避免资源耗尽
2. 健康检查:配置livenessProbereadinessProbe,实现自动重启和流量路由
3. 日志管理:使用集中式日志管理(EFK:Elasticsearch+Fluentd+Kibana,或Loki)
4. 监控告警:部署Prometheus+Grafana进行集群监控和告警
5. 镜像优化:使用alpine基础镜像、多阶段构建、合并RUN命令减少层数

## SEO信息

- 关键词: Docker,Kubernetes,容器化运维,K8s集群,Deployment,Service,故障排查,容器编排
- 描述: 面向初学者的Docker与Kubernetes容器化运维实战指南,涵盖双平台安装、核心命令、K8s集群搭建、应用部署全流程及生产最佳实践与故障排查技巧。

---

采集时间: 2026-05-01 11:00:00
唯一码: a1b2c3d4