Docker容器化部署实战:从单机到Kubernetes集群的完整流程

配图:标题:Docker容器化部署实战:从单机到Kubernetes集群的完整

环境准备

  • 安装 Docker 和 Docker Compose:确保本地环境运行 Docker 20.10 或更高版本,Docker Compose v2 或更高版本。使用命令 `docker --version` 和 `docker compose version` 验证安装 [来源#1]。
  • 安装 Kubernetes 工具:准备一个本地 Kubernetes 集群(如 Minikube 或 Kind),并安装 `kubectl` 命令行工具。使用 `kubectl version --client` 验证版本 [来源#2]。
  • 准备示例应用:一个简单的 Node.js Web 应用,包含 `package.json` 和 `server.js` 文件,用于演示容器化部署。

步骤拆解:使用 Docker Compose 搭建本地开发环境

配图:标题:环境准备;要点:安装 Docker 和 Docker Compo、
  • 创建项目目录结构:在本地创建 `docker-compose-demo` 目录,包含 `app` 子目录存放应用代码,`docker-compose.yml` 文件定义服务。
  • 编写应用代码:在 `app/server.js` 中创建一个简单的 HTTP 服务器,监听 3000 端口。
// app/server.js
const http = require('http');
const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello from Docker Compose!\n');
});
server.listen(3000, () => {
  console.log('Server running on port 3000');
});
  • 创建 Dockerfile:在 `app` 目录下编写 Dockerfile,基于 Node.js 镜像构建应用容器。
  • 编写 docker-compose.yml:定义服务,包括 Web 服务和可选的数据库服务(如 Redis),使用端口映射和卷挂载。
# app/Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY server.js .
EXPOSE 3000
CMD ["node", "server.js"]
配图:代码:// app/server.js
const http = req
# docker-compose.yml
version: '3.8'
services:
  web:
    build: ./app
    ports:
      - "3000:3000"
    volumes:
      - ./app:/app
    depends_on:
      - redis
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
  • 启动服务:在项目根目录运行 `docker compose up -d`,使用 `-d` 参数后台运行。预期输出:服务启动成功,无错误日志。
  • 验证本地部署:使用 `curl http://localhost:3000` 或浏览器访问 `http://localhost:3000`,预期输出 "Hello from Docker Compose!"。检查日志:`docker compose logs web` 应显示服务器运行信息。
配图:代码:# app/Dockerfile
FROM node:18-alp

步骤拆解:平滑迁移至 Kubernetes 生产环境

  • 准备 Kubernetes 配置文件:创建 `k8s` 目录,包含 Deployment 和 Service YAML 文件,定义应用在 K8s 中的部署。
  • 构建并推送镜像:使用 `docker build` 构建镜像,并推送到 Docker Hub 或私有仓库。例如,`docker build -t yourusername/app:1.0 ./app` 和 `docker push yourusername/app:1.0`。
# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: yourusername/app:1.0
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
  type: LoadBalancer
  • 部署到 Kubernetes:使用 `kubectl apply -f k8s/` 应用配置。预期输出:deployment 和 service 创建成功。
  • 验证部署:运行 `kubectl get pods` 查看 Pod 状态,预期输出 Pod 为 Running 状态。使用 `kubectl get services` 获取外部 IP,然后 `curl http://<external-ip>` 访问应用,预期输出 "Hello from Docker Compose!"。

结果验证

配图:代码:// app/server.js
const http = req
  • 本地环境验证:确保 Docker Compose 服务运行正常,应用响应时间低于 100ms,使用 `docker stats` 监控资源使用。
  • Kubernetes 环境验证:检查 Pod 日志 `kubectl logs <pod-name>`,确认无错误。使用 `kubectl describe pod <pod-name>` 验证事件日志。预期输出:服务稳定运行,无崩溃。

常见错误排查

配图:代码:# app/Dockerfile
FROM node:18-alp
  • Docker Compose 错误:如果端口冲突,修改 `docker-compose.yml` 中的端口映射。预期输出:服务启动成功。
  • Kubernetes 错误:如果镜像拉取失败,检查镜像标签和仓库权限。使用 `kubectl describe pod` 查看事件,常见错误是 ImagePullBackOff。预期输出:修复后 Pod 进入 Running 状态。

参考链接

阅读剩余
THE END