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

五、未完待续

相关推荐
007php0073 小时前
某游戏大厂 Java 面试题深度解析(四)
java·开发语言·python·面试·职场和发展·golang·php
Wang's Blog4 小时前
Nestjs框架: 微服务容器化部署与网络通信解决方案
docker·微服务·云原生·架构·nestjs
脚踏实地的大梦想家4 小时前
【Docker】P2 Docker 命令:从Nginx部署到镜像分享的全流程指南
java·nginx·docker
极限实验室6 小时前
使用 Docker Compose 轻松实现 INFINI Console 离线部署与持久化管理
docker·devops
天地之于壹炁兮7 小时前
Docker革命:软件开发的集装箱时代
docker·容器·eureka
勇往直前plus7 小时前
Docker 拉取镜像:SSL 拦截与国内镜像源失效问题解决
docker·容器·https·ssl
FJW0208148 小时前
DevOps——CI/CD持续集成与持续交付/部署的理解与部署
运维·ci/cd·devops
骷大人8 小时前
php安装skywalking_agent
开发语言·php·skywalking
xuehuayu.cn8 小时前
基于HTML5、阿里云播放SDK、腾讯云播放SDK开发的M3U8在线播放器
阿里云·腾讯云·html5
醉卧雕龙舫 、8 小时前
五.docker环境搭建实例
docker