WEB-34:网站容器化部署

王尘宇 网站建设 3

作者:王尘宇

公司:西安蓝蜻蜓网络科技有限公司

网站:wangchenyu.com

微信:wangshifucn | QQ:314111741

地点:西安 | 从业经验:2008 年至今(18 年)




一句话答案


网站容器化部署 是通过 Docker 容器化应用、Kubernetes 编排管理、容器镜像仓库、自动化扩缩容,实现环境一致、快速部署、弹性伸缩的现代化部署方法。




为什么需要容器化?


传统部署问题


环境不一致:

❌ 开发环境正常,生产环境报错
❌ 依赖版本冲突
❌ 系统库差异
❌ 配置不一致

部署复杂:

❌ 手动配置多
❌ 部署步骤繁琐
❌ 容易出错
❌ 回滚困难

资源利用率低:

❌ 服务器资源浪费
❌ 扩缩容慢
❌ 隔离性差
❌ 迁移困难

容器化优势


环境一致:

✅ 一次构建,到处运行
✅ 环境完全一致
✅ 依赖打包
✅ 配置隔离

快速部署:

✅ 秒级启动
✅ 快速扩缩容
✅ 滚动更新
✅ 快速回滚

资源高效:

✅ 资源隔离
✅ 利用率高
✅ 弹性伸缩
✅ 成本降低



Docker 基础


核心概念 ⭐⭐⭐⭐⭐


镜像 (Image):

- 只读模板
- 包含应用和依赖
- 分层存储
- 可复用

容器 (Container):

- 镜像运行实例
- 隔离的运行环境
- 可启动/停止
- 临时或持久

Dockerfile:

- 镜像构建脚本
- 定义构建步骤
- 自动化构建
- 版本控制

Dockerfile 编写 ⭐⭐⭐⭐⭐


Node.js 应用:

# 基础镜像
FROM node:16-alpine

# 设置工作目录
WORKDIR /app

# 复制 package.json
COPY package*.json ./

# 安装依赖
RUN npm ci --only=production

# 复制应用代码
COPY . .

# 构建应用
RUN npm run build

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["node", "dist/server.js"]

PHP 应用:

FROM php:8.1-fpm

# 安装扩展
RUN docker-php-ext-install pdo pdo_mysql

# 安装 Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 设置工作目录
WORKDIR /var/www/html

# 复制代码
COPY . .

# 安装依赖
RUN composer install --no-dev --optimize-autoloader

# 设置权限
RUN chown -R www-data:www-data /var/www/html

# 暴露端口
EXPOSE 9000

CMD ["php-fpm"]

Python 应用:

FROM python:3.9-slim

WORKDIR /app

# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制代码
COPY . .

# 暴露端口
EXPOSE 8000

# 启动命令
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Docker 命令 ⭐⭐⭐⭐⭐


基础命令:

# 构建镜像
docker build -t myapp:1.0 .

# 运行容器
docker run -d -p 80:3000 --name myapp myapp:1.0

# 查看容器
docker ps
docker ps -a

# 查看日志
docker logs myapp
docker logs -f myapp

# 进入容器
docker exec -it myapp sh

# 停止容器
docker stop myapp

# 删除容器
docker rm myapp

# 删除镜像
docker rmi myapp:1.0



Docker Compose


多容器编排 ⭐⭐⭐⭐⭐


配置文件:

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "80:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
    depends_on:
      - db
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped
  
  db:
    image: postgres:13
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped
  
  redis:
    image: redis:6-alpine
    restart: unless-stopped
  
  nginx:
    image: nginx:alpine
    ports:
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - web
    restart: unless-stopped

volumes:
  postgres_data:

常用命令:

# 启动所有服务
docker-compose up -d

# 停止所有服务
docker-compose down

# 查看日志
docker-compose logs -f

# 重启服务
docker-compose restart

# 构建镜像
docker-compose build

# 查看状态
docker-compose ps



Kubernetes 基础


核心概念 ⭐⭐⭐⭐


Pod:

- 最小部署单元
- 包含一个或多个容器
- 共享网络和存储
- 短暂存在

Deployment:

- 管理 Pod 副本
- 滚动更新
- 自动扩缩容
- 自我修复

Service:

- 服务发现
- 负载均衡
- 稳定访问点
- 多种类型

Ingress:

- HTTP/HTTPS 路由
- 域名管理
- SSL 终止
- 外部访问

部署配置 ⭐⭐⭐⭐


Deployment 配置:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.0
        ports:
        - containerPort: 3000
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 5

Service 配置:

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: LoadBalancer

Ingress 配置:

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-service
            port:
              number: 80
  tls:
  - hosts:
    - example.com
    secretName: myapp-tls



容器镜像仓库


仓库选择 ⭐⭐⭐⭐


Docker Hub:

优势:
- 官方仓库
- 免费公开仓库
- 社区活跃

价格:
- 免费:有限制
- 付费:$5/月起

阿里云容器镜像:

优势:
- 国内访问快
- 免费额度
- 私有仓库

价格:
- 免费:基础版
- 付费:企业版

腾讯云容器镜像:

优势:
- 国内访问快
- 免费额度
- 与腾讯云集成

价格:
- 免费:个人版
- 付费:企业版

镜像管理 ⭐⭐⭐⭐


推送镜像:

# 登录
docker login registry.cn-beijing.aliyuncs.com

# 标记镜像
docker tag myapp:1.0 registry.cn-beijing.aliyuncs.com/myrepo/myapp:1.0

# 推送
docker push registry.cn-beijing.aliyuncs.com/myrepo/myapp:1.0

版本管理:

# 多版本标签
docker tag myapp:latest myapp:1.0
docker tag myapp:latest myapp:1.0.1
docker tag myapp:latest myapp:latest

# 推送所有标签
docker push myapp --all-tags



王尘宇实战建议


18 年经验总结


  1. 从小开始

- 先容器化简单应用

- 逐步迁移

- 不要一次性全部


  1. 镜像优化

- 使用小基础镜像

- 减少镜像层

- 定期清理


  1. 安全配置

- 不运行 root

- 扫描漏洞

- 私有镜像


  1. 监控日志

- 容器监控

- 日志收集

- 资源限制


  1. 持续学习

- 容器技术发展快

- 持续学习

- 最佳实践


西安企业建议


  • 从 Docker 开始
  • 使用国内镜像仓库
  • 逐步学习 K8s
  • 重视安全



常见问题解答


Q1:容器化难吗?


答:

  • Docker 入门简单
  • K8s 较复杂
  • 有学习曲线
  • 值得投入

Q2:小项目需要容器化吗?


答:

  • 可选
  • 环境一致性好
  • 部署方便
  • 根据需求

Q3:容器化性能如何?


答:

  • 性能损失<5%
  • 几乎无感
  • 资源隔离好
  • 利用率高

Q4:如何学习 Docker?


答:

  • 官方文档
  • 在线教程
  • 实践项目
  • 社区交流

Q5:容器化成本多少?


答:

  • Docker 免费
  • K8s 免费
  • 管理平台付费
  • 云托管付费



总结


网站容器化部署核心要点:


  • 🐳 Docker 基础 — 镜像、容器、Dockerfile
  • 📦 Docker Compose — 多容器编排
  • ☸️ Kubernetes — 容器编排
  • 🗄️ 镜像仓库 — 存储、管理
  • 🔒 安全配置 — 权限、扫描、监控

王尘宇建议: 容器化是现代化部署的趋势。尽早学习实践,提升部署效率,降低运维成本。




关于作者


王尘宇

西安蓝蜻蜓网络科技有限公司创始人


联系方式:

  • 🌐 网站:wangchenyu.com
  • 💬 微信:wangshifucn
  • 📱 QQ:314111741
  • 📍 地址:陕西西安



本文最后更新:2026 年 3 月 18 日

版权声明:本文为王尘宇原创,属于"网站建设系列"第 34 篇,转载请联系作者并注明出处。

下一篇:WEB-35:网站云原生架构


发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~