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,见上图所示。

五、未完待续

相关推荐
黑金IT2 分钟前
在PHP8内,用Jenssegers MongoDB扩展来实现Laravel与MongoDB的集成
mongodb·php·laravel
追梦不止~19 分钟前
Docker常用命令+详解
运维·docker·容器
小春学渗透38 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc
铁锤妹妹头发多2 小时前
新手用docker真**难受
运维·docker·容器
დ旧言~2 小时前
【网络】应用层——HTTP协议
开发语言·网络·网络协议·http·php
follycat2 小时前
[极客大挑战 2019]PHP 1
开发语言·学习·网络安全·php
娃哈哈_4 小时前
基于Testng + Playwright的H5自动化巡检工具
测试开发·测试工具·自动化·html5·可用性测试·testng·playwright
南猿北者11 小时前
docker容器
docker·容器
二十雨辰11 小时前
[linux]docker基础
linux·运维·docker
time never ceases12 小时前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle