WEB-34:网站容器化部署

王尘宇 网站建设 7

网站容器化部署 是通过 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. 从小开始
  2. 先容器化简单应用
  3. 逐步迁移
  4. 不要一次性全部

  5. 镜像优化

  6. 使用小基础镜像
  7. 减少镜像层
  8. 定期清理

  9. 安全配置

  10. 不运行 root
  11. 扫描漏洞
  12. 私有镜像

  13. 监控日志

  14. 容器监控
  15. 日志收集
  16. 资源限制

  17. 持续学习

  18. 容器技术发展快
  19. 持续学习
  20. 最佳实践

西安企业建议

  • 从 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

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