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 文件内容

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用到的扩展

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 文件内容: 主要作用是等容器启动成功后,执行一些自定义命令

# 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  这个地方是写死的不能更改

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;
        }
}

  

 

点赞