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

  

 

发表评论

相关文章