• k8s docker 中部署think php 并搭建php websocket


    不得不说php 对云原生有点不够友好,之前用java .net打包docker镜像 一下就ok了,php倒腾了好久才算部署成功。

    场景:使用阿里云ack(k8s) 部署采用thinkPHP框架的php项目,并执行php think worker:server -d 开启websocket 服务 ,可以使用一个docker 镜像就能部署好。

    php 主要使用webdevops/php-nginx:7.4镜像 部署,这个镜像自带nginx和php环境

    dokerfile 放在php项目根目录下,dokerfile 文件内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    FROM webdevops/php-nginx:7.4
    EXPOSE 2346
     
    ADD  ./containerConfig/install-php-extensions /usr/local/bin/
    RUN chmod +x /usr/local/bin/install-php-extensions && sync && \
        install-php-extensions bz2 bcmath \
            calendar \
            dba \
            exif \
            gettext gd \
            imagick \
            mysqli mcrypt \
            opcache \
            pcntl pdo_mysql \
            redis \
            shmop sysvmsg sysvsem sysvshm sockets soap \
            xdebug \
            zip
     
    COPY . /app
    RUN /bin/bash -c 'cp /app/containerConfig/vhost.conf /opt/docker/etc/nginx/vhost.conf'
    RUN /bin/bash -c 'cp /app/containerConfig/10-init.sh /opt/docker/bin/service.d/supervisor.d//10-init.sh'
     
    命令注解
    1.  ADD  ./containerConfig/install-php-extensions /usr/local/bin/   是把根目录下的containerConfig(自己添加的文件夹放一些容器配置文件) 文件夹下的install-php-extensions(从 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions 下载到本地的) 文件添加到容器中的/usr/local/bin/ 目录下
     
    2. 以下的命令是添加php用到的扩展
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    RUN chmod +x /usr/local/bin/install-php-extensions && sync && \
        install-php-extensions bz2 bcmath \
            calendar \
            dba \
            exif \
            gettext gd \
            imagick \
            mysqli mcrypt \
            opcache \
            pcntl pdo_mysql \
            redis \
            shmop sysvmsg sysvsem sysvshm sockets soap \
            xdebug \
            zip

    3.COPY . /app  把php项目拷贝到容器的/app 文件夹下

    4. RUN /bin/bash -c 'cp /app/containerConfig/vhost.conf /opt/docker/etc/nginx/vhost.conf'   运行容器时将容器内的/app/containerConfig/vhost.conf 覆盖到容器中/opt/docker/etc/nginx/vhost.conf 文件,这个vhost.conf主要是容器内的nginx 配置,后面会放vhost.conf的内容

    5. RUN /bin/bash -c 'cp /app/containerConfig/10-init.sh /opt/docker/bin/service.d/supervisor.d//10-init.sh'   运行容器时将容器内的/app/containerConfig/10-init.sh  覆盖到容器中/opt/docker/bin/service.d/supervisor.d//10-init.sh 文件,这一步主要时配置容器启动后要执行的命令,单独启动websocket 服务时 需要用到的,启动websocket这个地方被坑了好久才找到解决方法。

    打包镜像并启动容器

    运行 docker build  -t  phpDemo:v1 .   命令打包成镜像,运行 docker run -p 8086:80  -p 2346:2346  --name phpDemo   -d phpDemo:v1  命令启动容器 ,2346 端口即为websocket 对外暴露的端口

    containerConfig 文件夹内容

      containerConfig文件夹下包含 10-init.sh,install-php-extensions,vhost.conf 3个文件。

      -----10-init.sh 文件内容: 主要作用是等容器启动成功后,执行一些自定义命令

    1
    2
    # placeholder
    cd /app && php think worker:server -d

      -----install-php-extensions 文件可以从 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions 处下载到本地保存到 containerConfig 文件夹下

      -----vhost.conf  主要用来配置nginx, 可以自行配置,一下是我的配置   fastcgi_pass php  这个地方是写死的不能更改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    server {
        listen 80 default_server;
        server_name  _ *.vm docker;
        root "/app/public";
        index index.php index.html;
            location / {
                if (!-e $request_filename){
                    rewrite  ^(.*)$  /index.php?s=/$1  last;
                }
            }
     
           add_header Access-Control-Allow-Origin *;
           add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS,PUT,DELETE,HEAD';
           add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; 
            location ~ \.php(.*)$ {
                fastcgi_pass   php;
                fastcgi_index  index.php;
                fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param  PATH_INFO  $fastcgi_path_info;
                fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
                include        fastcgi_params;
            }
    }

      

     

  • 相关阅读:
    利用Python分析txt文本中的关键词频率与词汇和句子指标占比
    HCIA-综合实验(三)
    1004. 最大连续1的个数 III ●●
    【CSS】Flex布局及Quasar辅助类之Container
    为什么在vue2中改变数据视图不会更新,带你阅读源码
    卡尔曼滤波之二:Python实现
    树莓派4b通过docker安装部署jenkins
    前端、HTTP协议(重点)
    python调用c++版本dll06-返回数组结构体
    cesium01-vue中创建一个三维地球和相关的控件属性注释
  • 原文地址:https://www.cnblogs.com/lkd3063601/p/16293319.html