轻量级容器编排工具指南

在 Docker 环境中,除了 K8s,还有多种轻量级方案可以实现服务自动重启、健康检查等功能,特别适合单机或中小规模部署。

一、简单方案

1.1 Docker 自身的重启策略(最基础方案)

Docker Engine 内置了容器重启策略,可直接在启动容器时配置,实现容器退出后自动重启。

常用重启策略:

  • --restart always:无论容器因何种原因退出(包括正常退出),总是自动重启。
  • --restart on-failure[:max-retries]:仅在容器以非 0 状态码退出时重启,可选最大重试次数(如on-failure:3最多重启 3 次)。
  • --restart unless-stopped:除非手动执行docker stop,否则始终重启(包括 Docker daemon 重启时)

示例:

# 启动PHP容器,配置always重启策略
docker run -d \
  --name php-app \
  --restart always \  # 核心:容器挂掉后自动重启
  -p 80:80 \
  -v /path/to/php/code:/var/www/html \
  php:8.2-apache

优势: 零依赖,直接使用 Docker 原生功能,适合单机部署。

局限: 仅能监控容器本身是否存活,无法检测应用内部故障(如 PHP-FPM 假死但容器仍运行)。

1.2 ocker Compose(适合多容器应用)

如果 项目依赖其他服务(如 MySQL、Redis),可使用docker-compose管理,通过配置restart参数实现自动重启,同时支持健康检查。

docker-compose.yml示例:

version: '3.8'
services:
  php-app:
    image: php:8.2-apache
    restart: always  # 容器退出后自动重启
    ports:
      - "80:80"
    volumes:
      - ./php-code:/var/www/html
    depends_on:
      - mysql
    # 健康检查:检测PHP服务是否正常响应
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/health.php"]  # 自定义健康检查接口
      interval: 30s  # 每30秒检查一次
      timeout: 10s   # 检查超时时间
      retries: 3     # 连续3次失败视为不健康
      start_period: 60s  # 启动后60秒内不检查

  mysql:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: phpapp

健康检查补充: 在 PHP 项目中创建health.php作为健康检查接口(返回 200 状态码表示正常):

优势: 管理多容器依赖关系,结合健康检查可更精准地判断应用状态。

适用场景: 中小型 PHP 应用(如 LAMP/LNMP 架构)。

1.3 Supervisor(容器内进程管理)

如果 PHP 项目在容器内运行多个进程(如 PHP-FPM+Nginx),或需要更精细的进程控制,可在容器中安装supervisor作为进程管理工具,实现进程挂掉后自动重启。

实现步骤:

  1. 构建包含 supervisor 的 PHP 镜像
    创建Dockerfile
    FROM php:8.2-fpm
    
    # 安装supervisor
    RUN apt-get update && apt-get install -y supervisor
    
    # 配置supervisor
    RUN mkdir -p /var/log/supervisor
    COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
    
    # 启动supervisor
    CMD ["/usr/bin/supervisord"]
    
  2. 编写 supervisor 配置文件(supervisord.conf):
    [supervisord]
    nodaemon=true  # 前台运行,确保容器不退出
    
    [program:php-fpm]
    command=/usr/local/sbin/php-fpm
    autostart=true  # 自动启动
    autorestart=true  # 进程退出后自动重启
    stderr_logfile=/var/log/php-fpm.err.log
    stdout_logfile=/var/log/php-fpm.out.log
    
    # 若同时运行Nginx,可添加:
    [program:nginx]
    command=/usr/sbin/nginx -g "daemon off;"
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/nginx.err.log
    stdout_logfile=/var/log/nginx.out.log
    
  3. 构建并启动容器:
docker build -t php-supervisor .
docker run -d --name php-app --restart always php-supervisor

优势:能监控容器内的具体进程(如 PHP-FPM),而非仅监控容器本身。
适用场景:容器内运行多进程的 PHP 应用。

二、 轻量级容器编排工具

如果需要跨主机部署或更丰富的编排能力,但又觉得 K8s 太重,可选择以下工具:

  1. Docker Swarm

    Docker 原生的集群编排工具,语法与 Docker Compose 兼容,支持服务自动重启、扩缩容、滚动更新。

    示例(初始化集群后部署):

    # 部署PHP服务,配置自动重启和副本数
    docker service create \
      --name php-app \
      --replicas 2 \  # 启动2个副本,实现高可用
      --restart-condition any \  # 任何情况退出都重启
      -p 80:80 \
      php:8.2-apache
    
  2. Nomad(HashiCorp)

    轻量级编排工具,支持 Docker 容器、虚拟机等多种任务类型,配置简单。

    适合中小团队,学习成本低于 K8s。

    HashiCorp

  3. Rancher + K3s

    K3s 是轻量级 Kubernetes,Rancher 提供可视化界面,简化部署和管理,兼顾功能与易用性。

    K3s使用指南