Php和h5等静态文件的服务容器化部署(上)

一、背景

接下来占用两篇文章的篇幅来讨论下,像php和h5等静态文件的容器化部署,有哪些部署方式。

  • 每个docker容器部署一个nginx + 静态文件,形成一个单独的服务。
  • 像ECS那样,nginx对应多个目录,一个目录对应一个服务,每个服务开放一个监听端口。

本文重点围绕着如何部署php程序展开,h5和它类似,就不再赘述。

为了便于理解,我们先会整理两种方案的部署架构,下篇将总结我们在部署过程中遇到的难点。

二、部署架构

1、一个deployment对应一个服务

你需要为每个服务编写一个Dockerfile,把php静态文件拷贝到镜像里。(注意:如果你的静态文件比较大,镜像也会随着增加)

然后制作docker image镜像,推送到仓库。

最后在k8s容器里拉取该镜像。

这种方式和java应用程序的模式一模一样。

但是,php应用程序需要nginx作反向代理,也就是说,在每个Pod里实际运行的是一个nginx容器。

因为这里有slb作负载均衡,故每个服务对外暴露tcp的端口不一。(注意:如果你的Php服务加上h5服务数量比较多,不仅仅是耗slb,更大的原因是前文提到的slb限额配置问题)

2、一个deployment对应多个服务

该部署方案的好处是,可以大大减少k8s的资源消耗,无论你有多少个服务,都只是增加了volume的存储空间。

我们通过不同的目录区分不同的服务,deployment里部署一个nginx容器外加一个fpm容器,读取volume上的静态文件。

三、deployment.yaml

对于第一种部署方案,由于它和java应用程序的部署并无多少差异,且第二种部署方案相对更优。

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-php-super
  name: nginx-php-super
  namespace: php
spec:
  progressDeadlineSeconds: 600
  replicas: 4
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx-php-super
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: nginx-php-super
    spec:
      containers:
      # nginx容器
        - image: >-
            xxx/my-nginx:1.9
          imagePullPolicy: IfNotPresent
          name: nginx
          ports:
            - containerPort: 80
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /etc/nginx/nginx.conf
              name: volume-1697503641553
              subPath: nginx.conf
            - mountPath: /etc/nginx/conf.d
              name: volume-1697503672567
            - mountPath: /fileCache
              name: volume-1697509397651
            - mountPath: /opt
              name: volume-1697512499570
              subPath: opt
        - command:
            - /bin/bash
            - /opt/php/start.sh
          env:
            - name: PATH
              value: >-
                /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/texlive/2019/bin/x86_64-linux/:/root/bin
          # php fpm 容器
          image: >-
            xxx/php-laxfpm:latest
          imagePullPolicy: Always
          lifecycle:
            postStart:
              exec:
                command:
                  - /bin/bash
                  - /opt/php/start_env.sh
          name: php-fpm
          ports:
            - containerPort: 9000
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /etc/opt/remi/php72/php-fpm.conf
              name: volume-1697503773889
              subPath: php-fpm.conf
            - mountPath: /opt/php/cron.sh
              name: volume-1697503805652
              subPath: cron.sh
            - mountPath: /opt/php/start.sh
              name: volume-1697503848246
              subPath: start.sh
            - mountPath: /opt/php/start_env.sh
              name: volume-1697503876850
              subPath: start_env.sh
            - mountPath: /etc/opt/remi/php72/php.ini
              name: volume-1697503935073
              subPath: php.ini
            - mountPath: /fileCache
              name: volume-1697509397651
            - mountPath: /opt/php
              name: volume-1697512499570
              subPath: opt/php
            - mountPath: /opt/web
              name: volume-1697512499570
              subPath: opt/web
            - mountPath: /opt/h5
              name: volume-1697512499570
              subPath: opt/h5
            - mountPath: /usr/local/texlive
              name: volume-1697512499570
              subPath: texlive
            - mountPath: /etc/supervisord.d
              name: volume-1697778917732
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
        - configMap:
            defaultMode: 420
            name: nginx.conf
          name: volume-1697503641553
        - configMap:
            defaultMode: 420
            name: nginx-php
          name: volume-1697503672567
        - name: volume-1697509397651
          persistentVolumeClaim:
            claimName: phpfilecache
        - name: volume-1697512499570
          persistentVolumeClaim:
            claimName: php-fpm
        - configMap:
            defaultMode: 420
            name: php-fpm-config
          name: volume-1697503773889
        - configMap:
            defaultMode: 420
            name: scripts
          name: volume-1697503805652
        - configMap:
            defaultMode: 420
            name: scripts
          name: volume-1697503848246
        - configMap:
            defaultMode: 420
            name: scripts
          name: volume-1697503876850
        - configMap:
            defaultMode: 420
            name: php.ini
          name: volume-1697503935073
        - configMap:
            defaultMode: 420
            name: supervisord1.d
          name: volume-1697778917732

1、start.sh

bash 复制代码
#!/bin/bash
export PATH=$PATH:/usr/local/texlive/2019/bin/x86_64-linux/
usermod -u 997 apache && groupmod -g 994 apache
chown 997.994 -R /opt/remi/php72
chown 997.994 -R /var/opt/remi/php72
/opt/remi/php72/root/usr/sbin/php-fpm -F -R

2、start_env.sh

bash 复制代码
#!/bin/bash

/usr/bin/supervisord -c /etc/supervisord.conf &
/usr/sbin/crond &

3、cron.sh

由于php程序没有引进分布式任务调度框架,比如xxl-job,所以它还使用的是自己实现cron表达式的任务自动触发。

bash 复制代码
#!/bin/bash


cron(){
times="$1"

[ $[times%5] -eq 0 ] && /usr/bin/php72 /opt/php/xxx-service/app/bootstrap_cli.php Paper getAnswer

/usr/bin/php72 /opt/php/xxx-service/public/tp/think.php topic toWord
}

times=1

while :
do
    cron $times &
    let times++
    sleep 60
done

四、service服务

不同的服务,暴露各自的tcp端口给slb,见上图所示。

五、未完待续

相关推荐
前进的程序员22 分钟前
告别Copilot?Codex本地化部署指南
开源·php·copilot·codex
随便做点啥41 分钟前
32卡×4090 24GB,Qwen3.8-27B-FP8 集群部署报告
服务器·经验分享·docker·vllm
To_OC8 小时前
跑了3个Docker容器后,我终于搞懂镜像和容器到底啥关系
后端·docker·容器
tryCbest12 小时前
Docker 从零到精通:知识与跨平台使用指南
docker·容器
开始学AI15 小时前
Codex2API Docker 使用宿主机代理:OAuth Token 兑换 403 问题排查与解决方案
运维·docker·容器
做前端的娜娜子15 小时前
Docker 常用命令全梳理:从镜像拉取到容器编排
docker·容器·掘金·金石计划
进哥AI研习社16 小时前
AtomCode 高阶玩法揭秘:Headless 模式集成 CI/CD、Skills 自定义与项目指令文件深度实战
ci/cd·atomcode·headless 模式·daemon 服务·skill 自定义·.atomcode.md·自动化审查
郑州光合科技余经理17 小时前
海外版多语言团购系统架构:主数据互通与核销边界
java·开发语言·前端·后端·系统架构·php·ai编程
m0_5791466517 小时前
关于Docker Desktop导致C盘空间异常占用的排查与根治方案
运维·docker·容器
SendTomo20 小时前
send.wang(私传网)基于网页P2P直连传输大文件的优势
javascript·网络·webrtc·html5·p2p